2016-05-10 6 views
1

平均5と標準偏差3の正規分布からサイズ5の5000サンプルをシミュレートしようとしています。各サンプルおよびサンプルのヒストグラムが平均5と標準偏差3の正規分布からサイズ5のサンプルをシミュレートする

を意味私の現在のコードは私にエラーを与えていませんが、私はそれが正しいことだと思うしないでくださいます

nrSamples = 5000 
e <- list(mode="vector",length=nrSamples) 
for (i in 1:nrSamples) { 
e[[i]] <- rnorm(n = 5, mean = 5, sd = 3) 
} 

sample_means <- matrix(NA, 5000,1) 
for (i in 1:5000){ 
sample_means[i] <- mean(e[[i]]) 
} 

これに対処する方法上の任意のアイデアを?私はRに非常に新しいです!

+2

'dat = replicate(5000、rnorm(5,5,3)、simplify = FALSE); hist(sapply(dat、mean)) ' – eipi10

答えて

1

あなたのコードは、(下記参照)細かいですが、私はあなたが以下しようと示唆している:... nrSamples私は供給という、シーケンス1、2、3の各要素のために、ここで

yourlist <- lapply(1:nrSamples, function(x) rnorm(n=5, mean = 5, sd = 3)) 
yourmeans <- sapply(yourlist, mean) 

を最初の引数としてlapplyは、引数のシーケンスの指定された要素(すなわち、x)で関数を実行します。しかし、私が提供した関数はxに依存しないので、5000回複製され、出力はリストに格納されます(これはlapplyです)。このような状況でループを回避するのは簡単な方法です。言うまでもなく、あなたもちょうど別に手段から

yourmeans <- sapply(1:nrSamples, function(x) mean(rnorm(n=5, mean = 5, sd = 3))) 

を実行することができ、後者は、あなたが望むものではない可能性がある、しかし、あなたの結果を保存しません。 sapplyにベクトルを返すように呼び出します。ベクトルを使用してヒストグラムをプロットすることができます。 hist(yourmeans)。次の点を考慮して、あなたのコードは大丈夫であることを示すために

set.seed(42) 
nrSamples = 5000 
e <- list(mode="vector",length=nrSamples) 
for (i in 1:nrSamples) { 
    e[[i]] <- rnorm(n = 5, mean = 5, sd = 3) 
} 

sample_means <- matrix(NA, 5000,1) 
for (i in 1:5000){ 
    sample_means[i] <- mean(e[[i]]) 
} 

set.seed(42) 
yourlist <- lapply(1:nrSamples, function(x) rnorm(n=5, mean = 5, sd = 3)) 
yourmeans <- sapply(yourlist, mean) 

all.equal(as.vector(sample_means), yourmeans) 
[1] TRUE 

ここで、私は、ランダムな数字が同じであることを確認するために、乱数発生器にシードを設定します。他の人が指摘しているように、ループは簡単に回避することができますが、あなたのコードは正常に動作します。

+0

本当に助けてくれてありがとう! –

2

forループなしでこれを実際に行うことができます。 replicateを使用して5000個のサンプルを作成できます。次に、sapplyを使用して各サンプルの平均値を返します。 sapplyのコールをhist()にラップして、平均ヒストグラムを取得します。

dat = replicate(5000, rnorm(5,5,3), simplify=FALSE) 

hist(sapply(dat, mean)) 

それとも、あなたは手段を保存する場合:

sample.means = sapply(dat,mean) 
hist(sample.means) 

私はあなたのコードが有効な結果を与えていると思います。 list(mode="vector",length=nrSamples)は、私があなたが意図したもの(コンソールで実行して何が起こるか)を行っていませんが、最初の2つのリスト要素がループ内で上書きされるために機能します。

ここだけの説明のため、ここではループを使用する必要はありませんが、ループを使用してコードの2つの修飾バージョンは次のとおりです。

# 1. Store random samples in a list 
e <- vector("list", nrSamples) 
for (i in 1:nrSamples) { 
    e[[i]] <- rnorm(n = 5, mean = 5, sd = 3) 
} 

sample_means = rep(NA, nrSamples) 
for (i in 1:nrSamples){ 
    sample_means[i] <- mean(e[[i]]) 
} 

# 2. Store random samples in a matrix 
e <- matrix(rep(NA, 5000*5), nrow=5) 
for (i in 1:nrSamples) { 
    e[,i] <- rnorm(n = 5, mean = 5, sd = 3) 
} 

sample_means = rep(NA, nrSamples) 
for (i in 1:nrSamples){ 
    sample_means[i] <- mean(e[, i]) 
} 
+0

ありがとうございました! @ eipi10 –

3

あなたはこのケースでは、リストは必要ありません。リストを過度に使用するのは、新しいRユーザーの間違いです。

observations <- matrix(rnorm(25000, mean=5, sd=3), 5000, 5) 
means <- rowMeans(observations) 

means 5000個の要素のベクトルです。

関連する問題