我想在Python(3.7.1)中使用scipy.stats.chi2_contingency
的输出来计算Pearson的标准化残差。我已经在this stackoverflow post上纠结了,这正是我需要的,但是我得到了错误的结果。我只能猜测这可能与我更新的Python版本有关(链接来自2013年)?在
我已经把
v = csum * rsum * (n - rsum) * (n - csum) / n**3
包括cr_sum = csum * rsum
和{(2,5)
的形状。这里似乎有必要计算cr_sum
和{
array([[-1125512208, -267063340, -274153780, -1725637260, 691228240],
[-1125512208, -267063340, -274153780, -1725637260, 691228240]])
。在
此外,我通常不知道何时使用哪种乘法类型。在stackoverflow邮报上,评论员只使用了星号,一切似乎都很顺利。必须对代码进行哪些更改?为什么?在
这是我的代码:
from __future__ import division
import numpy as np
from scipy.stats.contingency import margins
from scipy.stats import chi2_contingency
def residuals(observed, expected):
return (observed - expected) / np.sqrt(expected)
def stdres(observed, expected):
n = observed.sum()
rsum, csum = margins(observed)
v = csum * rsum * (n - rsum) * (n - csum) / n**3
return (observed - expected) / np.sqrt(v)
F = np.array([[33, 250, 196, 136, 32], [55, 293, 190, 71, 13]])
chi2, p, dof, expected = chi2_contingency(F)
stdres = stdres(F,expected)
在Windows上,NumPy数组的默认整数类型是32位。当在What is the equivalent of R data.chisq$residuals in python?处的代码使用输入数组
F = np.array([[33, 250, 196, 136, 32], [55, 293, 190, 71, 13]])
在Windows上运行时,函数stdres
中表达式csum * rsum * (n - rsum) * (n - csum)
的中间计算将导致整数溢出。溢出将负值放入变量v
,因此当计算sqrt(v)
时,会得到nan
s和一个警告。在解决方法是在进行中间计算之前将}转换为浮点。试用此版本:
rsum
和{相关问题 更多 >
编程相关推荐