从正态分布生成样本
Generating samples from normal distribution
我正在尝试从具有不同参数(列表中的参数)的正态分布中生成许多样本。
如何使用 apply family 来做到这一点?
例如我需要 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])
请帮帮我:(
我们可以使用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])
向具有多个形式参数(函数参数的技术名称)的函数提供一组多个参数的一种简单方法(然而,这将要求您提供不同于您指定的参数)......是使用 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)
do.call
函数可用于在函数的参数之间分配一组值。在您的特定用例应用程序中,传递给匿名函数的值必须是 "expanded" 到具有 as.list
的三元素列表,它采用向量并生成多元素列表而不是包含一个元素的列表向量:
lapply(lista, function(x) { do.call(rnorm, as.list(x))} )
这避免了索引 'x'-value 中所有项目的需要,这将允许在接收函数具有程序员可接受的默认值时省略参数(假设值被正确命名) .因此,如果您想要改变 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
我正在尝试从具有不同参数(列表中的参数)的正态分布中生成许多样本。
如何使用 apply family 来做到这一点?
例如我需要 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])
请帮帮我:(
我们可以使用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])
向具有多个形式参数(函数参数的技术名称)的函数提供一组多个参数的一种简单方法(然而,这将要求您提供不同于您指定的参数)......是使用 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)
do.call
函数可用于在函数的参数之间分配一组值。在您的特定用例应用程序中,传递给匿名函数的值必须是 "expanded" 到具有 as.list
的三元素列表,它采用向量并生成多元素列表而不是包含一个元素的列表向量:
lapply(lista, function(x) { do.call(rnorm, as.list(x))} )
这避免了索引 'x'-value 中所有项目的需要,这将允许在接收函数具有程序员可接受的默认值时省略参数(假设值被正确命名) .因此,如果您想要改变 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