如何正确使用chisq.test()进行卡方检验?

3

我正在尝试对适合度进行Pearson卡方检验。以下是拟合泊松分布的示例:

data <- rpois(200,50)
estimate <- mean(data)
freq.os<-table(data)
yfit <- dpois(as.integer(names(freq.os)), estimate)

chisq.test(x = freq.os, p = yfit)
# Error in chisq.test(x = freq.os, p = yfit) : probabilities must sum to 1.

当我评估sum(yfit)时,结果为0.999839。

那么如何产生一组概率值,使它们相加等于1呢?谢谢!


编辑

实际上,我找到了一个解决方法:

chisq.test(freq.os, yfit)

但是我对于chisq.test()的工作原理很困惑,因为它告诉我df = 429。我原本认为df = n - k - 1,在这种情况下应该是35,其中k = 1表示lambda,n = number是卡方总和中项的数量。我错在哪里了?

1个回答

6

之前的评论建议您在将yfit传递给chisq.test之前手动重新调整其比例。实际上,您可以让chisq.test()为您完成此操作:

chisq.test(x = freq.os, p = yfit, rescale.p = TRUE)

关于您的编辑
chisq.test(freq.os, yfit)

这句话是不正确的,因为它在进行独立性检验。

chisq.test() 可以执行两种统计检验:

  1. 拟合优度检验,使用参数 xp
  2. 独立性检验,使用参数 xy

请仔细阅读 ?chisq.test。对于拟合优度检验,你必须在函数中使用 p 参数,就像你最初所做的那样。我上面的回答,使用 rescale.p = TRUE 将帮助你解决你看到的错误。


如何进行Pearson卡方检验

你说你不知道如何进行这个测试,那么请阅读这部分内容。

你应该使用 set.seed(),这样当别人运行你的代码时,他们得到的随机数与你得到的相同。下面是一个可重复的示例:

N <- 200    ## number of samples
set.seed(0)    ## fix random seed for reproducibility
x <- rpois(N,50)    ## generate sample
lambda <- mean(x)    ## estimate mean

现在我们的目标是使用Pearson卡方检验来测试拟合度。我们有以下内容:
零假设:x~Poisson(lambda)
O <- table(x)    ## contingency table / observed frequency
n <- length(O)    ## number of categories
# 31
x0 <- as.integer(names(O))    ## unique sample values
p <- dpois(x0, lambda); p <- p / sum(p)    ## theoretical probability under Null Hypothesis

让我们先自己进行卡方检验。

E <- p * N    ## expected frequency under Null Hypothesis
R <- (O - E) / sqrt(E)    ## standardised residuals
X <- sum(R * R)    ## Chi-square statistic
# 36.13962
dof <- n - 1    ## degree of freedom
# 30
p.value <- 1 - pchisq(X, df = dof)    ## p-value
# 0.2035416

因为p值大于0.05,所以我们无法拒绝零假设。摘要图:

z <- curve(dchisq(x, df = dof), from = 0, to = 100)
abline(v = X, lty = 3)
polygon(c(X, X, z$x[z$x > X]), c(0, dchisq(X, df = dof), z$y[z$x > X]), col = 2)

图片描述请进入链接查看

然后我们使用 chisq.test()

chisq.test(O, p = p)

#Chi-squared test for given probabilities

#data:  O
#X-squared = 36.14, df = 30, p-value = 0.2035

你可以看到,结果是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接