如何使用卡方检验确定数据是否遵循泊松分布

机器算法验证 r 分布 卡方检验 泊松分布
2022-03-21 18:42:15

下图(本文第 646 页的图 1 )将观察值与泊松分布下的预期值进行了比较。然后它运行卡方检验以查看观察值是否与泊松分布下的预期值不同。

在此处输入图像描述

使用 R,如何在泊松分布下生成预期值并使用卡方检验比较观察值?

编辑:

这是我尝试做他们在纸上所做的事情。我想知道观察到的分布是否variable不同于泊松分布。我也想知道我在下面所做的是否与他们在纸上所做的相同。由于 P 值 > 0.05,我在下面得出结论,分布variable遵循泊松分布 - 有人可以证实这一点吗?

df <- data.frame(variable = 0:5, frequency = c(20, 10, 5, 3, 2, 1))

# estimate lambda
mean_df_variable <- mean(df$variable)

# calculate expected values if df$frequency follows a poisson distribution
library(plyr)
expected <- laply(0:5, function(x) dpois(x=x, lambda=mean_df_variable, log = FALSE))

# calculate actual distribution of df$frequency
observed <- df$frequency/sum(df$frequency)

# does distribution of df$frequency differ from a poisson distribution? Apparently 
#   not because P-value is > 0.05
chisq.test(expected, observed)
3个回答

您进行卡方检验的方式不正确。有几个问题。首先,您的数据框如下所示:

  variable frequency
1        0        20
2        1        10
3        2         5
4        3         3
5        4         2
6        5         1

所以当你跑的时候mean(df$variable),你会得到2.5,这只是 的意思0:5也就是说,它是未加权的。相反,像这样创建你的变量:

x = rep(0:5, times=c(20, 10, 5, 3, 2, 1))
table(x)
# x
#  0  1  2  3  4  5 
# 20 10  5  3  2  1
mean(x)
# [1] 1.02439

table()调用表明代码给了我们想要的东西,因此mean()正确地估计了 lambda。

接下来,您的估计概率仅变为5,但泊松分布变为无穷大。因此,您需要考虑数据集中没有的值的概率。这并不难做到,你只需计算补码:

probs = dpois(0:5, lambda=mean(x))
probs
# [1] 0.359015310 0.367771781 0.188370912 0.064321775 0.016472650 0.003374884
comp = 1-sum(probs)
# [1] 0.0006726867

最后,在R'schisq.test()函数中,x=andy=参数并不完全适用于您设置的预期值和观察值。一方面,您所说的“预期”实际上是概率(即 的输出dpois()),要生成这些预期值,您必须将这些概率(并确保包括恭维)乘以总数。但即便如此,您也不会将这些用于y=. 无论如何,您实际上不必这样做,您只需将概率分配给p=参数即可。此外,您需要在0观察值向量中添加一个,以表示未出现在数据集中的所有可能值:

chisq.test(x=c(20, 10, 5, 3, 2, 1, 0), p=c(probs, comp))

#  Chi-squared test for given probabilities
# 
# data:  c(20, 10, 5, 3, 2, 1, 0)
# X-squared = 12.6058, df = 6, p-value = 0.04974
# 
# Warning message:
#   In chisq.test(x = c(20, 10, 5, 3, 2, 1, 0), p = c(probs, comp)) :
#   Chi-squared approximation may be incorrect

警告消息表明我们可能更喜欢模拟,所以我们再试一次:

chisq.test(x=c(20, 10, 5, 3, 2, 1, 0), p=c(probs, comp), simulate.p.value=TRUE)

# Chi-squared test for given probabilities with simulated p-value 
#   (based on 2000 replicates)
# 
# data:  c(20, 10, 5, 3, 2, 1, 0)
# X-squared = 12.6058, df = NA, p-value = 0.07046

这可能是一个更准确的 p 值,但它提出了一个关于如何解释它的问题。您问“由于 P 值 > 0.05,我在下面得出结论,变量的分布遵循泊松分布 - 有人可以证实这一点吗?” 使用正确的方法,我们注意到第一个 p 值只是 <.05,但第二个(模拟的)p 值只是 >.05。尽管后一个 p 值更准确,但我不会急于得出数据确实来自泊松分布的结论。以下是一些需要牢记的事实:

如果我明白你的意思,你应该:

  1. 估计数据的泊松分布参数,假设它是泊松分布的,比如说
lambdaEst = mean(x)
  1. 计算,对于每个,假设泊松分布,它们的理论概率,例如0,1,2,...
probTheo0 = dpois(x = 0, lambda = lambdaEst, log = FALSE)
  1. 然后按照这种方法通过卡方检验将实际概率与理论概率进行比较ChiSquare Test CV 解决方案

这个小脚本适用于任何带有观察的data.frame:

df <- data.frame(variable = 0:5, frequency = c(20, 10, 5, 3, 2, 1))
N <- df$variable
observed <- df$frequency / sum(df$frequency)
lambdaEst <- sum(observed * N)
probs <- dpois(df$variable, lambda = lambdaEst)
comp = 1 - sum(probs)
chisq.test(x= c(rev(sort(df$frequency)),0), p=c(probs, comp))