我正在尝试使用this统计信息包功能进行卡方检验。我有以下列联表:
A B
True: 12 8
False: 16 9
我使用了以下代码:
import Data.Vector
import Statistics.Test.ChiSquared
sample = fromList [(12, 8), (16, 9)]
main = print(chi2test(sample))
但是,它给出以下错误:
[1 of 1] Compiling Main ( rnchisq.hs, rnchisq.o )
rnchisq.hs:9:23: error:
• Couldn't match expected type ‘Int’
with actual type ‘Vector (Integer, Integer)’
• In the first argument of ‘chi2test’, namely ‘(sample)’
In the first argument of ‘print’, namely ‘(chi2test (sample))’
In the expression: print (chi2test (sample))
问题出在哪里,如何解决?感谢您的帮助。
编辑:如@JosephSible的回答所建议,我也尝试过:
main = print(chi2test(1, sample))
(1是自由度)
但是这里出现错误:
rnchisq.hs:7:22: error:
• Couldn't match expected type ‘Int’
with actual type ‘(Integer, Vector (Integer, Integer))’
• In the first argument of ‘chi2test’, namely ‘(1, sample)’
In the first argument of ‘print’, namely ‘(chi2test (1, sample))’
In the expression: print (chi2test (1, sample))
以下编译并运行:
main = print $ chi2test 1 sample
但是,输出是
Nothing
我期望有一些价值。即使我彻底更改Nothing
中的数字,它仍然保留sample
。为什么我得到Nothing
?
答案 0 :(得分:4)
chi2test
函数执行常规的卡方拟合优度检验,而不是对2x2列联表进行卡方检验。它期望在原假设下有一组代表“观察到的”实际计数和“预期”理论均值的对,而不只是表中的计数。
换句话说,您需要精通一些统计理论,才能使用此功能来分析2x2表,但这似乎可以正常工作:
import Data.Vector as V
import Statistics.Test.ChiSquared
sample = ((12, 8), (16, 9))
main = print $ chi2table sample
chi2table ((a,b), (c,d))
= chi2test 2 $ V.fromList $ Prelude.zip [a,b,c,d] [ea,eb,ec,ed]
where n = a + b + c + d
ea = expected (a+b) (a+c)
eb = expected (a+b) (b+d)
ec = expected (c+d) (a+c)
ed = expected (c+d) (b+d)
expected rowtot coltot = (rowtot * coltot) `fdiv` n
fdiv x y = fromIntegral x / fromIntegral y
这给出了输出:
> main
Just (Test {testSignificance = mkPValue 0.7833089019485086,
testStatistics = 7.56302521008404e-2, testDistribution = chiSquared 2})
更新:关于自由度,使用具有1个自由度的卡方(对于R基本上是(R-1)*(C-1))来计算测试本身和C表的行数和列数)。我们在这里必须指定2的原因是2代表除总数之外的“丢失”或“受约束”的自由度数。我们从总共4个自由度开始,在所有单元格的总数中损失1个,然后又不得不再失去2个以降低到1个自由度进行测试。
无论如何,仅当您关闭连续性校正时,这才与统计软件的输出匹配。例如,在R中:
> chisq.test(rbind(c(12,8),c(16,9)), correct=FALSE)
Pearson's Chi-squared test
data: rbind(c(12, 8), c(16, 9))
X-squared = 0.07563, df = 1, p-value = 0.7833
>
答案 1 :(得分:2)
chi2test
带有两个参数,而您只传递了一个。而不是呼叫chi2test sample
,而要呼叫chi2test df sample
,其中df
是附加自由度的数量。