假设我有一个成功概率为p的二项过程。我做了N = 4次试验的实验并取得了一些成功(0-4)。现在,假设我重复该实验10,000次(每次实验中4次试验)以获得成功数量的分布,看起来像这样:
请注意,由于实验的方式,我无法记录0次成功的实验数据,尽管这无疑会在某个频率发生。这就是为什么图表上没有0的条形。
我如何拟合这些数据来估计概率p(理想情况下,如果我知道实验数量而不仅仅是比例,则可信区间)?我的偏好是使用MATLAB,但是我可以使用任何可以完成这项工作的工具。
更新
我可以使用mle
来拟合数据,但拟合效果不佳(见下图)。我认为问题是缺少数据(没有观察到0次成功的实验)。我可以告诉mle
只适合某个范围内的数据并忽略其他值吗?
答案 0 :(得分:1)
在示例中,我们有一个自定义截断二项分布。 Matlab具有fitdist
功能,但只接受预定义的分发,不接受cumstom分发。当您注意到您可以使用任何工具时,我会使用R
显示p参数的估计值,但是在Matlab中使用最大似然法可以估计参数。
如果我们计算p = 0.3
4 expriments
的二项分布密度函数的值,我们有:
>> den = dbinom(x=0:4, size=4, prob=0.3)
>> print(den)
0.2401, 0.4116, 0.2646, 0.0756, 0.0081
他们的总和= 1 因为数据中缺少0个值 我们有:
0.4116, 0.2646, 0.0756, 0.0081
它们之和小于1.为此我们将每个除以(1-den[1])
>> print(den[-1] / (1-den[1]))
0.54165022 0.34820371 0.09948677 0.01065930
现在它们的总和是1.这样我们就可以进行定制分发。
来自fitdistr
包的 MASS
可以使用户提供的密度适合数据,因此R中的解决方案是:
library(MASS) # required for fitdistr
#generate 10000 samples from binomial distribution
smpl <- rbinom(n=10000,size=4,prob=.3)
#exclude zeros
smpl <- smpl[-which(smpl==0)]
# custom truncated density
truncated_dbinom <- function(x, prob){
dbinom(x, 4, prob)/(1-dbinom(0, 4, prob));
}
#fit distribution to data
out <- fitdistr(smpl, truncated_dbinom,list(prob=.5),method = "Brent",lower=0,upper=1)
#estimate of p
print(out$estimate)
#standard deviation
print(out$sd)
结果:
[1] 0.3092295
[1] 0.01070016