卡方检验-无法匹配类型

时间:2019-09-12 02:10:47

标签: haskell statistics chi-squared

我正在尝试使用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

2 个答案:

答案 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是附加自由度的数量。