0

異なるパラメータ(リスト内のパラメータ)を持つ正規分布から多くのサンプルを生成しようとしています。正規分布からサンプルを生成する

適用ファミリを使用してこれを行うにはどうすればよいですか?

たとえば、(n = 10、平均= 2、sd = 3)、第2の:(n = 100、平均= 0、sd = 1)の2つのサンプルが必要です。

私のコードは機能していません。

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]) 

、私を助けてください:(

+0

パーフェクト!本当にありがとう! – AgnieszkaTomczyk

答えて

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]) 
1

一つの簡単なアプローチ複数の仮パラメータ(関数の引数のための技術的な名前)を持つ関数に複数のパラメータのセットを提供する(つまり、ただし、指定とは異なる引数を与えるためにあなたを必要とします)... 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.69-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構文が許すように上または順序によって示されているようにすべてのパラメータを1つずつ処理され、マッチしたいずれかの名前によるものです。だから、これは同じ結果与えるだろう:

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

を...しかし、無名の引数として結果を与えた場合は異なります

​​
1

do.call関数は値のセット全体を配布するために使用することができます関数のパラメータあなたの特定のユースケースアプリケーションでは、無名関数に渡される値は、ベクトルをとり、ベクトルを含む1つの要素を持つリストの代わりに複数の要素リストを作るas.listの3要素リストに "展開"されなければなりません:

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 
関連する問題