簡體   English   中英

重復模擬測驗分數1000次

[英]Repeat simulation of test scores 1000 times

我想在R中模擬以下問題,並基於1000次模擬計算平均概率- 測驗的分數正態分布為均值70和標准差dev10。估計在75個隨機選擇的學生中,至少22個分數大於78的概率

這是我到目前為止所做的

set.seed(1)
scores = rnorm(1000,70,10)
head(scores)
hist(scores)
sm75=sample(scores,75)
length(sm75[sm75>78])/75
#[1] 0.1866667

但是,這僅給了我一次迭代,我希望進行1000次迭代,然后取這1000個概率的平均值。 我相信可以實現使用for循環的某種控制結構。 另外,有沒有更簡單的方法可以“應用”一系列功能?

在一天結束時,您要測試是否至少有22名學生的得分高於78,可以使用以下公式進行精確計算:

sum(rnorm(75, 70, 10) > 78) >= 22

稍微細分一下, rnorm(75, 70, 10)返回75分,它們的正態分布為平均值70和標准差rnorm(75, 70, 10) > 78是長度為75的向量,指示是否是否每個分數都高於sum(rnorm(75, 70, 10) > 78)將每個true轉換為1,將每個false轉換為0,並將這些值加起來,這意味着它將對75個得分進行計數超過78。最后,我們使用上面的完整表達式測試總和是否為22或更高。

replicate可以用於多次復制。 因此,要查看1000個模擬的細目,您可以使用以下1-liner(當然,在設置隨機種子之后):

set.seed(144)
table(replicate(1000, sum(rnorm(75, 70, 10) > 78) >= 22))
# FALSE  TRUE 
#   936    64 

在64個重復樣本中,至少有22名學生的得分高於78,因此我們估計概率為6.4%。

概率計算為有利結果的數量/結果的總數。 所以..

> scores <- sample(rnorm(1000,70,10),75)
> probability <- length(subset(scores,scores>78))/length(scores)
> probability
[1] 0.28

但是,您要執行1000次,然后取平均值。

> mean(replicate(1000, {scores<-sample(rnorm(1000,70,10),75);length(subset(scores,scores>78))/length(scores)}))
[1] 0.2133333

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM