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

Я пытаюсь сгенерировать множество выборок из нормального распределения с разными параметрами (параметры в списке).

Как я могу сделать это с помощью семейства приложений?

Например, мне нужно 2 образца: один: (n = 10, mean = 2, sd = 3), а второй: (n = 100, mean = 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])

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


person AgnieszkaTomczyk    schedule 21.10.2016    source источник
comment
Идеально! Огромное спасибо!   -  person AgnieszkaTomczyk    schedule 21.10.2016


Ответы (3)


Мы можем использовать 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])
person Zheyuan Li    schedule 21.10.2016

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

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

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

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
person IRTFM    schedule 21.10.2016

Один простой подход (который, однако, потребует от вас предоставления аргументов, отличных от указанных) для предоставления набора нескольких параметров функции, имеющей несколько формальных параметров (техническое имя для аргументов функции) ... заключается в использовании 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)
person IRTFM    schedule 21.10.2016