做一个课程,以下是问题。
library(downloader)
url <- "https://raw.githubusercontent.com/genomicsclass/dagdata/master/inst/extdata/femaleMiceWeights.csv"
filename <- "femaleMiceWeights.csv"
if(!file.exists("femaleMiceWeights.csv")) download(url,destfile=filename)
dat <- read.csv(filename)
假设我们对滚动n = 100骰子时看到6的次数感兴趣。这是一个随机变量,我们可以用x = sample(1:6,n,replace = TRUE)来模拟,我们感兴趣的比例可以表示为平均值:mean(x == 6)。由于模具辊是独立的,因此CLT适用。
我们想要掷骰子10,000次并保持这些比例。该随机变量(6s的比例)具有平均值p = 1/6和方差p *(1-p)/ n。所以根据CLT z =(mean(x == 6) - p)/ sqrt(p *(1-p)/ n)应该是正常的,均值为0和SD 1.将种子设置为1,然后使用replicate执行模拟,并报告z的绝对值大于2的比例(CLT表示它应该约为0.05)。
所以我写了以下内容:
set.seed(1)
n<-10000
p<-1/6
a<-replicate(n, {
x=sample(1:6, n, replace=TRUE)
z<-(mean(x==6) - p) / sqrt(p*(1-p)/n)
})
> mean(abs(a)>2)
[1] 0.0472
所以它的错误但非常接近,任何人都会看到我哪里出错了?
答案 0 :(得分:1)
我的回答是错误的:(这就是为什么我问...所以我一定做错了什么:(
看起来你正在做作业或其他什么,然后你被标记错了,因为你的代码并没有真正做你的问题所要求的:
我们想要掷骰子10,000次并保持这些比例
这是正确的版本;不要将n
放在sample()
内。
set.seed(1); n <- 10000; p <- 1/6
a <- replicate(n, (mean(sample(1:6, 10000, replace=TRUE)==6) - p) / sqrt(p*(1-p)/10000))
另外,你没有与正确的事物进行比较。
CLT表示应该约为0.05
没有!您需要的理论数量是2 * pnorm(-2)
,即0.04550026
。 0.05
的相应分位数为-qnorm(0.025)
,1.96
而非2
。
让我们检查mean(abs(a) > 2)
给出的内容。
n = 10000
和set.seed(1)
,您获得0.0472
,已接近真实值; n = 20000
和set.seed(1)
,您获得0.04565
,更接近!答案 1 :(得分:0)
我用几乎相同的代码解决了它:
set.seed(1); n <- 10000; p <- 1/6
a <- replicate(n, (mean(sample(1:6, 100, replace=TRUE)==6) - p) / sqrt(p*(1-p)/100))
请注意,问题在于问题的制定......你想每次采样100个,但要做10000. 0.0424是正确的答案。