R与在线计算器卡方拟合优度检验结果差异的原因排查
卡方拟合优度检验的R代码错误分析
你在R中调用chisq.test(A, C)时犯了参数使用错误,导致R执行的是卡方独立性检验(列联表检验),而非你需要的拟合优度检验,这是结果与在线计算器差异极大的核心原因。
错误原因详解
chisq.test()函数的参数规则是:
- 如果只传一个向量
x,且指定p参数(预期概率),才会执行拟合优度检验; - 如果传入两个向量
x和y,R会自动将它们转换为列联表,执行独立性检验(检验两个分类变量是否独立)。
你传入的A和C都是长度为4的向量,R会把它们处理成2行4列的列联表:
C1 C2 C3 C4 A1 45 4 10 59 A2 28.32 20.06 5.9 63.72
此时计算的是这个列联表的独立性检验,自由度为(2-1)*(4-1)=9,和你得到的输出中df=9完全对应,这显然不是你要的拟合优度检验。
正确的R代码实现
拟合优度检验需要通过p参数传递预期概率分布(而非直接传预期值)。因为你的预期值C是面积占比乘以总观测数(118),所以预期概率就是C的相对比例(或者直接用面积占比B转换为比例):
A <- c(45, 4, 10, 59) # 各植被类型的观测标本数 C <- c(28.32, 20.06, 5.9, 63.72) # 计算得到的预期值 # 正确调用:指定p为预期值的相对比例 chisq.test(A, p = C / sum(C))
或者直接用面积占比B(因为sum(B)=100,比例就是B/100):
B <- c(24, 17, 5, 54) # 各植被类型的面积占比(百分比) chisq.test(A, p = B / 100)
执行上述正确代码后,得到的结果会和在线计算器一致:X-squared≈25.88,p-value≈1e-05,自由度为4-1=3(类别数减1)。
内容的提问来源于stack exchange,提问作者curiousRguy
相关产品推荐
相关产品推荐

