Генерация выборок из нормального распределения

#r #probability #distribution #data-analysis #normal-distribution

#r #вероятность #дистрибутив #анализ данных #нормальное распределение

Вопрос:

Я пытаюсь сгенерировать много выборок из обычного дистрибутива с разными параметрами (parametrs в списке).

Как я могу это сделать, используя apply family?

Например, мне нужны 2 выборки: одна: (n = 10, среднее = 2, sd = 3), а вторая: (n = 100, среднее = 0, sd = 1).

Мой код не работает.

 lista <- list (c(10,2,3), c(100,0,1))
lapply(lista, rnorm, n=lista[[1]][1], mean=lista[[1]][2], sd=lista[[1]][3])
  

Пожалуйста, помогите мне: (

Комментарии:

1. Идеально! Спасибо вам большое, очень большое!

Ответ №1:

Мы можем использовать lapply(lista, function (u) rnorm(u[1], u[2], u[3])) .

Если вы не уверены, как написать lapply , всегда начинайте с написания for цикла. lapply(lst, FUN) номинально является циклом такого рода:

 z <- vector("list", length(lst))  ## set up a list to hold result
for (i in 1:length(lst)) z[[i]] <- FUN(lst[[i]])
  

Теперь должно быть ясно, что вы хотите сделать что-то вроде

 FUN <- function (u) rnorm(u[1], u[2], u[3])
  

Ответ №2:

do.call Функция может использоваться для распределения набора значений a по параметрам функции. В вашем конкретном случае использования значение, передаваемое анонимной функции, должно быть «расширено» до списка из трех элементов с as.list , который принимает вектор и создает список из нескольких элементов вместо списка с одним элементом, содержащим вектор:

 lapply(lista, function(x) { do.call(rnorm, as.list(x))} )
  

Это устраняет необходимость индексировать все элементы в значении ‘x’, что позволило бы также опускать аргументы, когда принимающая функция имела значения по умолчанию, приемлемые для программиста (при условии, что значения были названы правильно). Итак, если вы хотели варьировать n ‘s и sd ‘s, но были довольны средним значением, равным нулю, это могло продолжаться таким образом:

 listb <- list( c(n=10, sd=20), c(n=30, sd=2) )
lapply(listb, function(x) { do.call(rnorm, as.list(x))} )
#----------    
[[1]]
 [1] -23.609828 -16.151191 -23.111033  38.212068  16.455139   7.113906
 [7] -12.397147  38.290878  11.867452 -18.303218

[[2]]
 [1] -2.0679516 -3.7638834  0.6688440  0.6043388  1.6982034  1.4076235
 [7]  0.9136540 -2.6509870  0.6559625  0.5520027 -0.3406304 -0.5041241
[13]  0.7310216 -5.0910101 -1.5765682  0.2922939 -1.3974115 -1.4306923
[19]  2.6777315 -1.0645444 -1.4861976  1.7122648 -1.8358448  3.9746211
[25] -0.3890340 -0.6465296 -0.3135723 -2.6392838  2.2450179  0.5247390
  

Ответ №3:

Один простой подход (который, однако, потребует от вас предоставления аргументов иначе, чем вы указали) к предоставлению набора нескольких параметров функции, имеющей несколько формальных параметров (техническое название аргументов функции)… заключается в использовании mapply :

     mapply( "rnorm", n=c(10,100), mean=c(2, 0), sd=c(3, 1) )
#---------------
[[1]]
 [1]  4.3607168  6.9571785 -1.3394296  5.6785350  5.5530760  2.8021287
 [7]  0.7520097 -1.8059174  0.7592422 -2.4748872

[[2]]
  [1]  0.73566122 -0.12638612 -1.69012397 -0.64417325 -1.46758707  2.30065443
  [7]  1.02633544 -0.85775445  0.60799860  0.66255636  1.51928059 -0.45794478
 [13]  0.23916533 -0.07795645 -1.74320373 -0.15713704  0.19290933 -0.54371716
 [19]  0.88232361  0.42578818 -2.17252910 -0.47681404 -2.21699666 -0.41122127
 [25] -0.52013209 -0.22340666 -0.99130015  0.28053249 -1.14614837  0.04970670
 [31] -0.27859492 -0.19529840  0.50583178 -0.05145851 -1.79215121  1.48922763
 [37]  0.02386245  0.50019189  0.26482624  0.76494152 -0.70582773 -1.08522850
 [43]  0.43165158  0.80456328  0.69404073 -1.95058568  0.07807099 -0.63939627
 [49] -1.00749973 -0.62529108  1.08207005 -0.31246003 -1.32730239  0.46625767
 [55] -1.06066745 -1.13907755 -0.82059182 -1.78419846  1.13977925 -0.49013621
 [61]  1.26796770  0.69951620  1.75505898 -0.67942428 -0.01623632  0.52663426
 [67] -0.69413417  1.24352286 -0.09821045 -0.67086520  0.26824327 -0.86635550
 [73]  1.05889426 -0.04102500 -0.71692607  0.44144261  1.25202568  0.72016307
 [79]  0.11129964 -0.68862516  0.92195848  0.58216233  0.19426555  1.52458368
 [85] -1.09695267  0.53255626 -0.78301748 -1.30116467  0.48771402  2.28789526
 [91]  1.19800895  1.63866625 -0.15420632 -0.94995368 -1.44311847 -1.15723513
 [97]  1.10090265 -1.50021705  0.05841531 -0.23415692
  

Все параметры обрабатываются один за другим и сопоставляются либо по имени, как показано выше, либо по порядку, как позволяет синтаксис R. Таким образом, это дало бы тот же результат:

  mapply( "rnorm", mean=c(2, 0), n=c(10,100), sd=c(3, 1) )
  

… но если задано в качестве неназванного аргумента, результаты будут другими:

 > mapply( "rnorm", c(2, 0), c(10,100), c(3, 1) )
[[1]]
[1]  8.125727 13.609617

[[2]]
numeric(0)