Bri*_*tow 2 python statistics spss scipy chi-squared
我正在尝试自动化卡方计算.我正在使用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)
Run Code Online (Sandbox Code Playgroud)
得到:
(-0.065191159985573108, 0.61172152831874682)
Run Code Online (Sandbox Code Playgroud)
(第1个是系数,第2个是p值)
然而,SPSS称Pearson Chi-Square是.057.
除了交叉表之外,我还应该检查一下吗?
显然,您正在计算数据的列联表(即"交叉表")的卡方统计量和p值.scipy函数pearsonr
不是用于此的正确函数.要使用scipy进行计算,您需要形成列联表然后使用scipy.stats.chi2_contingency
.
有几种方法,你可以转换d1
和d2
成列联表.在这里我将使用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])
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
然后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
Run Code Online (Sandbox Code Playgroud)
p值与SPSS计算的值匹配.
归档时间: |
|
查看次数: |
354 次 |
最近记录: |