重复实验的估计二项式成功概率(在 matlab 中)
Estimated binomial success probability from repeated experiments (in matlab)
假设我有一个成功概率为 p 的二项式过程。我做了一个 N=4 次试验的实验,并获得了一定数量的成功 (0-4)。现在,假设我将该实验重复 10,000 次(每个实验进行 4 次试验)以获得成功次数的分布,它看起来像这样:
请注意,由于实验的完成方式,我无法记录 0 次成功的实验数据,尽管这无疑会以某种频率发生。这就是图表上没有 0 条的原因。
我如何拟合这些数据来估计概率 p(理想情况下,如果我知道实验次数而不仅仅是比例,则为置信区间)?我更喜欢使用 MATLAB,但我愿意使用任何可以完成这项工作的工具。
更新
我可以使用 mle
拟合数据,但拟合效果不佳(见下图)。我认为问题是缺少数据(没有观察到 0 次成功的实验)。我能以某种方式告诉 mle
只适合特定范围内的数据而忽略其他值吗?
在示例中,我们有一个自定义的截断二项分布。 Matlab 有 fitdist
函数,但只接受预定义分布,不接受自定义分布。正如您所指出的,您可以使用任何工具,我用 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。这样我们就可以进行自定义分配了。
MASS
包中的 fitdistr
可以使用户提供的数据密度适合,因此 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
假设我有一个成功概率为 p 的二项式过程。我做了一个 N=4 次试验的实验,并获得了一定数量的成功 (0-4)。现在,假设我将该实验重复 10,000 次(每个实验进行 4 次试验)以获得成功次数的分布,它看起来像这样:
请注意,由于实验的完成方式,我无法记录 0 次成功的实验数据,尽管这无疑会以某种频率发生。这就是图表上没有 0 条的原因。
我如何拟合这些数据来估计概率 p(理想情况下,如果我知道实验次数而不仅仅是比例,则为置信区间)?我更喜欢使用 MATLAB,但我愿意使用任何可以完成这项工作的工具。
更新
我可以使用 mle
拟合数据,但拟合效果不佳(见下图)。我认为问题是缺少数据(没有观察到 0 次成功的实验)。我能以某种方式告诉 mle
只适合特定范围内的数据而忽略其他值吗?
在示例中,我们有一个自定义的截断二项分布。 Matlab 有 fitdist
函数,但只接受预定义分布,不接受自定义分布。正如您所指出的,您可以使用任何工具,我用 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。这样我们就可以进行自定义分配了。
MASS
包中的 fitdistr
可以使用户提供的数据密度适合,因此 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