如何测试我观察到的 PDF 是否遵循二项分布?

机器算法验证 r 分布 二项分布
2022-04-07 02:40:01

我有一个观察到的 PDF,我想测试它是否适合二项分布,即我是否可以确认我观察到的数据遵循二项分布。

我正在使用 R,是否有任何软件包可以帮助我这样做?

图片显示了我观察到的粗体黑色 PDF 和理论上的二项式分布。

在此处输入图像描述

1个回答

请注意,这个问题是重复的,Glen_b 在这里有一个更好的答案


这是使用 R 包的示例fitdistrplus模拟数据是严格的二项式,因此我们不应该拒绝零假设。

require("fitdistrplus")
set.seed(10)
n = 25
size = 27
prob = .4
data = rbinom(n, size = size, prob = prob)
fit = fitdist(data = data, dist="binom", 
                   fix.arg=list(size = size), 
                   start=list(prob = 0.1))

summary(fit)
Fitting of the distribution ' binom ' by maximum likelihood 
Parameters : 
      estimate Std. Error
prob 0.3822225 0.01870338
Fixed parameters:
     value
size    27
Loglikelihood:  -52.24948   AIC:  106.499   BIC:  107.7178 

plot(fit)

在此处输入图像描述

这种成功概率的估计(Pr(S)=0.38) 非常接近Pr(S)=0.4数据生成时设置。但是,您不仅要估计参数,还要估计分布,正如 Glen_b 在并行帖子中解释的那样:

...您不仅在估计参数(可能能够处理 - 一些测试或多或少容易适应),而且您还经常在分布模型的几种选择之间进行选择。

因此,您可能希望将结果与其他分布进行对比。例如,这里是选择泊松分布的输出:

fit2 = fitdist(data, dist = "pois")
summary(fit2)
plot(fit2)
Fitting of the distribution ' pois ' by maximum likelihood 
Parameters : 
       estimate Std. Error
lambda    10.32  0.6424951
Loglikelihood:  -55.95267   AIC:  113.9053   BIC:  115.1242 

可以预见的是,AIC 会增加:我们将数据设置为二项式,因此可以预期更好的拟合分布(较低的 AIC)是二项式,而不是泊松。以下是相应的图:

在此处输入图像描述

请注意,我们必须提供成功的概率来估计拟合优度。在上面的模拟中,我们要求fitdistrplus()从一个值开始估计 MLEPr(success)=0.1.

如果我们要运行卡方拟合优度检验,我们可以尝试几个值。这是一个与上面相同数据集的模拟:

par(mfrow = c(1,3))
obs.counts  = table(factor(data, levels = 0:27)) # Tabulated results of dataset
plot(obs.counts,"h",  col = "turquoise", main = "Obs'd counts", cex.main = .9)
values = seq(0.3, 0.7, 0.1) # P(S) chosen (.3,.4,.5,.6,.7)
targ.freq = matrix(0, length(values), size + 1)  # Starting an empty matrix
# PMF for different p (Prob) values:
for(i in 1:length(values)) targ.freq[i,] = dbinom(0:size, size = size, prob = values[i]) 
plot(targ.freq[1,], type = "l", col = "darkblue", 
main = "Exp'd freq", cex.main = .9, ylab = 'Freq', xlab="")
for(i in 1:nrow(targ.freq)) lines(targ.freq[i,], col = "darkblue")
for(i in 1:nrow(targ.freq)) text(which.max(targ.freq[i,]), 
                                 max(targ.freq[i,] + .005), values[i],
                                 col= "darkblue")
exp.counts = matrix(0, length(values), size + 1) # Starting empty matrix
# Calculating expected counts...
for(i in 1:nrow(targ.freq)) exp.counts[i,]  = round(targ.freq[i,] * length(data)) 
colnames(exp.counts) = 0:size
vec = c(1,3,5)
matplot(t(exp.counts)[ ,vec],type="h",col=c(2:nrow(exp.counts)+1),lty=1,
        ylab ="Exp. counts", main = "Exp counts 3 Pr(S)")
lab = values[c(1,3,5)]
x.positions = c(7,15,22)
for(i in 1:nrow(targ.freq)) text(x.positions[i], 
                            max(exp.counts[i,] + .1), lab[i], col= "darkblue")

预期的频率和计数(以及因此与观察到的数据的拟合)将随着不同的成功概率而变化(在右侧图中仅绘制了其中三个):

在此处输入图像描述

同样,GOF 卡方的 p 值将在我们在生成数据时设置的概率附近显示一个峰值:

p.values = NULL
for(i in 1:nrow(targ.freq)) p.values[i] = chisq.test(obs.counts , p = targ.freq[i,])$p.value
par(mfrow = c(1,1))
plot(values, p.values, type = "h", main = "Chi square p values", cex.main = .8)

在此处输入图像描述

其它你可能感兴趣的问题