【问题标题】:SAS Proc Corr with Weighting in PythonSAS Proc Corr 与 Python 中的加权
【发布时间】:2017-07-13 20:55:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: python pandas numpy correlation


    【解决方案1】:

    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.        ]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多