【问题标题】:chi squared in scipy different from results in SPSSscipy中的卡方与SPSS中的结果不同
【发布时间】:2018-06-03 10:22:15
【问题描述】:

我正在尝试自动化卡方计算。我正在使用scipy.stats.pearsonr。但是,这给了我与 SPSS 不同的答案。就像,10 倍的差异。 (.07 --> .8)

我很确定这两种情况下的数据是相同的,因为我在两种情况下都打印出交叉表(使用 pandas.crosstab)并且数字是相同的。

d1 = [1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1]

d2 = [1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 2, 1, 0, 1, 1, 2, 0, 2, 1, 2, 0, 0, 1]

print scipy.stats.stats.pearsonr(d1,d2)

给予:

 (-0.065191159985573108, 0.61172152831874682)

(第一个是系数,第二个是p值)

但是 SPSS 说 Pearson 卡方是 0.057。

除了交叉表之外还有什么我应该检查的吗?

【问题讨论】:

  • 能否也显示相应的SPSS代码?
  • 其他人制作了 SPSS,所以我只能轻松访问输出...

标签: python scipy statistics spss chi-squared


【解决方案1】:

显然,您正在计算数据列联表(即“交叉表”)的卡方统计量和 p 值。 scipy 函数 pearsonr 不是用于此的正确函数。要使用 scipy 进行计算,您需要形成列联表,然后使用 scipy.stats.chi2_contingency

您可以通过多种方式将d1d2 转换为列联表。这里我将使用 Pandas 函数pandas.crosstab。然后我将使用chi2_contingency 进行卡方检验。

首先,这是您的数据。我将它们放在 numpy 数组中,但这不是必需的:

In [49]: d1
Out[49]: 
array([1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0,
       1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1])

In [50]: d2
Out[50]: 
array([1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
       1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0,
       1, 1, 0, 1, 2, 1, 0, 1, 1, 2, 0, 2, 1, 2, 0, 0, 1])

使用 pandas 形成列联表:

In [51]: import pandas as pd

In [52]: table = pd.crosstab(d1, d2)

In [53]: table
Out[53]: 
col_0   0   1  2
row_0           
0       5   7  4
1      10  34  3

然后使用chi2_contingency 进行卡方检验:

In [54]: from scipy.stats import chi2_contingency

In [55]: chi2, p, dof, expected = chi2_contingency(table.values)

In [56]: p
Out[56]: 0.057230732412525138

p 值与 SPSS 计算的值相匹配。


更新:在 SciPy 1.7.0(目标为 2021 年中)中,您将能够使用 scipy.stats.contingency.crosstab 创建列联表:

In [33]: from scipy.stats.contingency import crosstab  # Will be in SciPy 1.7.0 
In [34]: d1                                                                                                 
Out[34]: 
array([1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,
       0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1,
       0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1])

In [35]: d2                                                                                              
Out[35]: 
array([1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1,
       1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1,
       1, 0, 1, 1, 0, 1, 2, 1, 0, 1, 1, 2, 0, 2, 1, 2, 0, 0, 1])

In [36]: (vals1, vals2), table = crosstab(d1, d2)                                                                          

In [37]: vals1                                                                                                      
Out[37]: array([0, 1])

In [38]: vals2                                                                                              
Out[38]: array([0, 1, 2])

In [39]: table                                                                                           
Out[39]: 
array([[ 5,  7,  4],
       [10, 34,  3]])

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2015-06-04
    • 2018-11-05
    • 1970-01-01
    • 2021-11-21
    • 2017-06-28
    • 1970-01-01
    • 2018-09-16
    • 2023-03-13
    相关资源
    最近更新 更多