python - SAS Proc Corr 与 Python 中的加权

标签 python pandas numpy correlation

我有一个 SAS 脚本,它使用“proc corr ”过程以及 weighting为了创建加权相关矩阵。我现在尝试在 python 中重现这个函数,但是我还没有找到在输出矩阵中包含权重的好方法。

在寻找解决方案时,我发现了一些使用权重数组计算两列/变量( examples here )的加权相关系数的脚本和函数,但我正在尝试创建加权相关性具有更多变量的矩阵。我尝试通过循环变量组合来使用这些函数,但它的运行速度比 SAS 过程慢很多。

我想知道是否有一种有效的方法可以在 python 中创建一个与 SAS 代码类似的加权相关矩阵,或者至少返回等效的结果,而无需循环遍历所有变量组合。

最佳答案

numpy 的协方差采用两种不同类型的权重参数 - 我没有 SAS 来检查,但它可能是类似的方法。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html#numpy.cov

一旦有了协方差矩阵,就可以使用这样的公式将其转换为相关矩阵

https://en.wikipedia.org/wiki/Covariance_matrix#Correlation_matrix

完整示例

import numpy as np

x = np.array([1., 1.1, 1.2, 0.9])

y = np.array([2., 2.05, 2.02, 2.8])

np.cov(x, y)
Out[49]: 
array([[ 0.01666667, -0.03816667],
       [-0.03816667,  0.151225  ]])

cov = np.cov(x, y, fweights=[10, 1, 1, 1])

cov
Out[51]: 
array([[ 0.00474359, -0.00703205],
       [-0.00703205,  0.04872308]])

def cov_to_corr(cov):
    """ based on https://en.wikipedia.org/wiki/Covariance_matrix#Correlation_matrix """
    D = np.sqrt(np.diag(np.diag(cov)))
    Dinv = np.linalg.inv(D)
    return Dinv @ cov @ Dinv # requires python3.5, use np.dot otherwise

cov_to_corr(cov)
Out[53]: 
array([[ 1.        , -0.46255259],
       [-0.46255259,  1.        ]])

关于python - SAS Proc Corr 与 Python 中的加权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45090730/

相关文章:

python - 属性错误 : 'Manager' object has no attribute 'get_by_natural_key' error in Django?

python - cherrypy 中的静态 URL

python - 删除以另一列的大值为条件的值

python - Pandas ,根据某些列值和 NAN 组合行

python - pandas df 中列的条件填充

python - Pandas 或 SQL 中异常的表缩减

python - 关于扭曲文档

python - 对 numpy 步幅的困惑

python - 索引位置为 1 的数组

python - 如何将 numpy 数组转换为和弦音乐?