用Python计算Pearson标准残差

2024-10-01 00:24:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在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和{}的Hadamard积。当我手动对第一个单元格(频率值为33)执行此操作时,我得到了右残差(-2.62309082)。但是,我不能让这个Hadamard产品在Python中工作。相反,Python似乎是一些广播和输出:

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)

Tags: fromimportstatsnpscipystackoverflowexpectedsum
1条回答
网友
1楼 · 发布于 2024-10-01 00:24:44

在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)时,会得到nans和一个警告。在

解决方法是在进行中间计算之前将rsum和{}转换为浮点。试用此版本:

def stdres(observed, expected):
    n = observed.sum()
    rsum, csum = margins(observed)
    rsum = rsum.astype(np.float64)
    csum = csum.astype(np.float64)
    v = csum * rsum * (n - rsum) * (n - csum) / n**3
    return (observed - expected) / np.sqrt(v)

相关问题 更多 >