使用binom和R中的其他方法进行变化

时间:2014-04-16 05:08:18

标签: r

如果这个问题很简单,请道歉。 想象一下,我们选择了20个球,概率为0.5+1:20/50

P=0.5+1:20/50
ONE=function(M,n) {
        N=1:n
        m=length(M)
        for(j in 1:n) {
            N[j]=sum(runif(m)<M)
        }
        N
    }

mean.1=mean(ONE(P,100000))
mean.2=mean(rbinom(100000,size=20,prob=P))

在这里很容易看到,使用这两种方法都是相同的。但是当我想要计算P(X <= 5)时,其中X表示选择的球数,发生了奇怪的事情:

ONE.p=function(M,n) {
        N=1:n
        m=length(M)
        for(j in 1:n) {
            N[j]=sum(runif(m)<M)
        }
        sum(N<=5)/n
    }
p.1=ONE.p(P,100000)
p.2=sum(rbinom(100000,size=20,prob=P)<=5)/100000

此处,p.1几乎为0,但p.2估计为e-3级。使用hist(),我们可以看到:

hist(ONE(P,100000))
hist(rbinom(100000,size=20,prob=P))

第二个更广泛。我认为这两个提供相同的计算。但我对结果感到困惑。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

观察次数与每次观察的试验次数之间存在差异。 rbinom假设在每次观察中,概率是相同的,但不同观察值之间的概率可能不同。在ONE函数中,您完全假定为对位。以下是这种差异的一个小例子:

# 2 observations of size 2. 
# in the first observation, both trials have 0 probability, 
# in the second observation, both trials have probability 1. 
rbinom(2, 2, 0:1) 
# replicate 2 observations of size 1 twice.  
replicate(2, sum(rbinom(2, 1, 0:1)))

平均值是相同的,因为总和是相同的。

Nsims <- 100000
sum(rbinom(Nsims*20, 1, prob=P))
sum(rbinom(20, Nsims, prob=P))
sum(rbinom(Nsims, 20, prob=P))
# this is different because it only uses P[1]
sum(rbinom(1, 20*Nsims, prob=P))

因此,如果您想使用rbinom执行您的功能,请按以下步骤操作:

require(ggplot2)
require(reshape2)
Nsims <- 100000
df <- data.frame(v.ONE = ONE(P,Nsims),
                 v.replicate = replicate(Nsims, sum(rbinom(20, size=1, prob=P))), 
                 v.size20 = rbinom(Nsims, size=20, prob=P))
df.melt <- melt(df, measure.vars=c("v.ONE", "v.replicate", "v.size20"))
ggplot(df.melt, aes(factor(value), fill=variable)) + geom_histogram(position="dodge")