R 如何使用chisq.test()正确进行卡方检验?
我正在尝试对拟合优度进行皮尔逊卡方检验。以下是拟合泊松分布的示例:R 如何使用chisq.test()正确进行卡方检验?,r,R,我正在尝试对拟合优度进行皮尔逊卡方检验。以下是拟合泊松分布的示例: 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) : prob
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.
但是我很困惑
chisq.test()
是如何工作的,因为它告诉我df=429
。我认为df=n-k-1
,在这种情况下应该是35,其中k=1
表示lambda和n=number
项的平方和。我哪里做错了?上面的评论建议您手动重新缩放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
p
参数。我上面的答案是,使用rescale.p=TRUE
将帮助您绕过所看到的错误
如何进行Pearson卡方检验
chisq.test(freq.os, yfit)
你说你不知道测试是如何完成的,然后读这部分
您应该使用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
你可以看到,结果是一样的。确实需要一个,但一般来说,得到向量/数字和的方法是将每个项除以和。例如,
x=c(0.1,0.2,0.3);y=x/和(x);求和(y)
这是一个经验频率向量:4141731793075168221881547195042534260726472652245206160813841006732518383239584612912121。好吧,我肯定是做错了什么,我误解了这个函数的用法,认为p=假设分布的预期频率。如果我有一个预期频率和经验频率的向量,我如何使用这个函数?谢谢,你的建议奏效了。但是我仍然对chisq.test的工作原理感到困惑,我添加了可复制的示例。我试着看了一遍源代码,但是因为我对R和编程都是新手,所以一切看起来都非常棒,非常感谢。我记得读到dof应该是n-k-1,其中k是估计参数的个数。既然你估计了lambda值,自由度不应该是29而不是30吗?
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
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(O, p = p)
#Chi-squared test for given probabilities
#data: O
#X-squared = 36.14, df = 30, p-value = 0.2035