2015-04-24 81 views
-2

我試圖捕獲500個線性模型的樣本,其中每個樣本包含20個正態分佈的隨機生成值的誤差項。在for循環中生成正態分佈值集合

因爲我對每個樣本的結果感興趣,所以我不想只生成一個500 * 20 = 10000的正態分佈值向量。

我的代碼是:

for (i in 1:500) { 
    e <- rnorm(n = 20, mean = 0, sd = 4) 
} 

的問題是,該代碼生成20個值,一次。因此,500個樣本中的每一個具有相同的20個誤差項。我怎樣才能爲500次循環for循環的每次迭代生成20個新值?

+0

我不確定我是否相信。你使用'set.seed()'? '矩陣(rnorm(20 * 500,0,4),ncol = 20)'怎麼樣? –

+0

運行'for(i in 1:2){print(rnorm(n = 20,mean = 0,sd = 4))}'真的會爲您打印兩次相同的向量嗎?它當然不適合我。 – josliber

+0

你每次都給e賦值,如何使e [i] <-rnorm(n = 20,mean = 0,sd = 4)?並在循環之前聲明e <-as.list() – infominer

回答

4

我覺得你對你的循環實際上在做什麼感到困惑。它將一個新分配的隨機向量連續500次重新分配給您的變量e。這意味着每個迭代e都被一個新的隨機向量覆蓋。因此,循環完成後,最終會得到一個隨機向量,該向量現在分配給e。你基本上只是定義e在一個非常低效的方式:)

我認爲,你想要做什麼是最有可能是這樣的:

nrSamples = 500 
e <- list(mode="vector",length=nrSamples) 
for (i in 1:nrSamples) { 
    e[[i]] <- rnorm(n = 20, mean = 0, sd = 4) 
} 

首先定義e因爲它可以包含一個列表到500個載體。在你的循環中,首先創建一個隨機向量,然後分配給它在列表中的相應位置。這對每個唯一列表索引完成500次。

現在,您可以進入您的隨機向量如下:

> vector_1 <- e[[1]] 
> vector_7 <- e[[7]] 
> vector_1 
[1] 3.8713046 3.4672930 4.2840856 4.0388847 -3.0535864 -4.1402421 -2.7912700 -1.2332116 3.2628433 3.5377208 
[11] -1.0929493 0.6466984 -5.5490625 -7.3033997 1.0898727 0.2001674 2.2646435 0.1623863 2.2611607 -1.1867225 
> vector_7 
[1] 0.8199701 -3.1517209 -1.1319827 6.3150359 -3.7589505 1.4065123 -0.5410125 -3.0186291 6.6353592 -0.5002009 
[11] -3.7416365 5.5324850 -2.2105955 -1.0931199 -2.0189795 -5.4934535 2.4210809 1.0956980 -7.6284702 -1.3574990 

正如你所看到的,隨機向量是不相同的。他們是從彼此隨機獨立產生的。爲了訪問隨機向量的各個元素,你可以這樣做:

> vector_7[[3]] 
[1] -1.131983 
> # OR 
> e[[7]][[3]] 
[1] -1.131983 
1

運行你的代碼,循環的結束將返回20號的一組:

for (i in 1:500) { 
    e <- rnorm(n = 20, mean = 0, sd = 4) 
} 

> e 
[1] 7.48112400 -3.76594695 -1.55396151 -0.88205322 1.00736518 1.61904598 -4.69739057 -0.65291410 
[9] -1.11921165 1.35657106 -8.33957962 -1.80607461 -0.05524872 -1.79938725 -0.98579993 6.32969133 
[17] 2.83715482 -1.56407249 -6.56056515 0.65830884 

你需要創建一個列表,並存儲在它裏面電子商務每次迭代,因爲@infominer建議:

e <- list() 

for (i in 1:500) { 
    e[i] <- list(rnorm(n = 20, mean = 0, sd = 4)) 
} 
3

rnorm()是一個量化的功能。因此matrix(rnorm(500 * 20, 0, 4), nrow = 500))或類似應該工作。

set.seed(1237) 
head(matrix(rnorm(500 * 20, 0, 4), nrow = 500), 2) 

[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10]  [,11] 
[1,] -1.779413 2.0934980 -0.1130465 0.7155059 -4.357417 -0.1000385 -5.4510753 -2.135156 0.2134115 -6.747588 2.3818280 
[2,] -7.892865 -0.6712141 -4.0481822 5.2750330 -3.053245 0.7502157 0.6026951 4.951890 1.8733383 1.860631 -0.7452204 
[,12]  [,13] [,14]  [,15]  [,16]  [,17]  [,18]  [,19]  [,20] 
[1,] 4.0730359 -3.246457 5.781667 2.4091225 -8.4262348 7.1438989 3.289772 -4.136308 -0.7102701 
[2,] -0.5159794 4.144834 5.662559 0.9685914 0.9033701 0.3952698 10.734498 -2.213788 -2.3064852