我有一个 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/