使用复制中心限制t

时间:2016-08-17 09:15:46

标签: r replicate

做一个课程,以下是问题。

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

所以它的错误但非常接近,任何人都会看到我哪里出错了?

2 个答案:

答案 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.045500260.05的相应分位数为-qnorm(0.025)1.96而非2

让我们检查mean(abs(a) > 2)给出的内容。

  • 使用n = 10000set.seed(1),您获得0.0472,已接近真实值;
  • 使用n = 20000set.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是正确的答案。