2013-10-15 277 views
5

您能解釋R代碼中循環的結構/想法嗎?我不知道從這個家庭作業問題開始。我能夠創造指數分佈,我需要如何創建循環

> rexp(n=200, rate=0.5) 

,但現在我需要創建這個rexp的2000個樣品,並計算出每個樣本的平均值。然後我需要計算2000個樣本均值的均值和方差。我知道如何找到簡單分佈的均值和方差(例如:mean(rexp)var(rexp)),所以我的主要問題是理解循環的概念並將其付諸實踐。

於是我開始進入:

> rexp(n=200,rate=0.5) 

然後我命名這個指數分佈:

> exdi = rexp(n=200,rate=0.5) 

基於關閉處理款項的例子,我進入

>y.exdi=vector(length=2000) 
>for(i in 1:2000){y.exdi[ i ]=mean(exdi)} 

的R Workspace對此沒有迴應,所以我給這個函數起了名字並嘗試了這個:

>Twothou = for(i in 1:2000){y.exdi[ i ]=mean(exdi)} 
>mean(Twothou) 

但後來我得到這個錯誤信息:

[1] NA 
Warning message: 
In mean.default(Twothou) : argument is not numeric or logical: returning NA 

我應該怎麼做不同?

回答

3

我想你應該把隨機數發生器rexpfor循環:

y.exdi=vector(length=2000) 
for(i in 1:2000){ 
    y.exdi[ i ]=mean(rexp(n=200,rate=0.5)) 
} 

否則,對於每個i你剛纔計算環路以外定義的固定向量的平均值,而不是新的每當索引i增加時生成。在上面的代碼中,您可以使用mean(y.exdi)來計算平均值,它可以給出2000個「平均值」的平均值。

2

您需要在環境內創建您的樣本分配。試試這個:

> set.seed(1) 
> y.exdi=vector(length=2000) 
> for(i in 1:2000){ 
+ exdi = rexp(n=200,rate=0.5) 
+ y.exdi[ i ]=mean(exdi) 
+ } 
> mean(y.exdi) 
[1] 2.001149 
> var(y.exdi) 
[1] 0.01987367 
+0

如果你的答案與其他人的答案相差甚遠,那麼請考慮刪除你的答案。 – flodel

2

由於您必須生成2000次樣本,所以樣本生成必須在循環中。

set.seed(1) 
y.exdi <- vector(length=2000, "numeric") 
for (i in 1:2000) 
{ 
    y.exdi[i] <- mean(rexp(200, 0.5)) 
} 

問題是還與命令

exdi = rexp(n=200,rate=0.5) 

在其中實際上分配給exdi 200個指數分佈隨機生成的值的數字載體,它沒有定義的函數。其實,你不需要重新定義一個函數,你可以每次調用rexp

R還提供了這些類型的東西的捷徑。你可以得到2000一襯墊

sapply(1:2000, function(x) { mean(rexp(200, 0.5)) }) 
+0

如果您的答案與比您的答案相比快一秒的人的答案沒有太大差異,請考慮刪除您的答案。 – flodel

6

您剛剛創建的相同值的2000元的一個非常好的載體意味着 - 在你的樣品中釀造指數分佈只有一次平均的手段。通過在控制檯中檢查y.exdi來查看。

如果您想爲此解決方案使用循環,則應在每次迭代中創建新的和新的樣本。您可以輕鬆地使用例如sapply(圍繞for環路包裝器)施加到1:2000

sapply(1:2000, function(x) mean(rexp(n = 200, rate = 0.5))) 

或者說直接調用例如replicate(即意在被用於這樣的情況下):

replicate(2000, mean(rexp(n = 200, rate = 0.5))) 
+2

用於'replicate'的+1。因爲編寫一個忽略它的論證的函數是醜陋的,所以我不會推薦「sapply」方法。 – flodel

+0

@ flodel:...忽略'replicate'包裝'sapply'的事實。 :) –

0

這裏有兩種解決方案。第一個不需要創建兩次樣本,但匿名函數和它返回的列表很奇怪。第二個是更清潔的,你確實得到了列名,但你不再具有與同一樣本的方差相關的意思。

library(plyr) 

ldply(1:2000, function(x) {d <- rexp(n = 200, rate = 0.5); c(mean(d), var(d))}) 

ddply(data.frame(x = 1:2000), .(x), summarize, 
    mean = mean(rexp(n = 200, rate = 0.5)), var = var(rexp(n = 200, rate = 0.5))) 

您的解決方案將值放入y.exdi列表中。如果在構建時查看它的內容,它將充滿布爾FALSE值。在循環之後,您可以重新檢查它並查看它具有其意義。這裏有兩個同樣有效的方法來完成你正在用循環清理一些東西的工作。

y.exdi <- NULL 
for(i in 1:2000) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5)) 

y.exdi <- vector(length = 2000, mode = "numeric") 
for(i in seq(y.exdi)) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5))