如何测试我观察到的 PDF 是否遵循二项分布?
机器算法验证
r
分布
二项分布
2022-04-07 02:40:01
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)
这种成功概率的估计() 非常接近数据生成时设置。但是,您不仅要估计参数,还要估计分布,正如 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()从一个值开始估计 MLE.
如果我们要运行卡方拟合优度检验,我们可以尝试几个值。这是一个与上面相同数据集的模拟:
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)
其它你可能感兴趣的问题




