之前的评论建议您在将yfit
传递给chisq.test
之前手动重新调整其比例。实际上,您可以让chisq.test()
为您完成此操作:
chisq.test(x = freq.os, p = yfit, rescale.p = TRUE)
关于您的编辑
chisq.test(freq.os, yfit)
这句话是不正确的,因为它在进行独立性检验。
chisq.test()
可以执行两种统计检验:
- 拟合优度检验,使用参数
x
和 p
;
- 独立性检验,使用参数
x
和 y
。
请仔细阅读 ?chisq.test
。对于拟合优度检验,你必须在函数中使用 p
参数,就像你最初所做的那样。我上面的回答,使用 rescale.p = TRUE
将帮助你解决你看到的错误。
如何进行Pearson卡方检验
你说你不知道如何进行这个测试,那么请阅读这部分内容。
你应该使用 set.seed()
,这样当别人运行你的代码时,他们得到的随机数与你得到的相同。下面是一个可重复的示例:
N <- 200
set.seed(0)
x <- rpois(N,50)
lambda <- mean(x)
现在我们的目标是使用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
R <- (O - E) / sqrt(E)
X <- sum(R * R)
dof <- n - 1
p.value <- 1 - pchisq(X, df = dof)
因为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)
你可以看到,结果是相同的。