2017-07-13 44 views
1

加權我有,爲了創建一個加權的相關矩陣,使用「proc corr」過程,隨着weighting沿着SAS腳本。我現在試圖在python中重現這個函數,但是我還沒有找到將權重包含在輸出矩陣中的好方法。SAS PROC更正件與在Python

在尋找一個解決方案,我發現了幾個腳本和函數,計算加權相關係數爲使用權陣列兩列/變量(exampleshere),但我想創建有很多的加權相關係數矩陣更多變數。我嘗試了通過循環變量組合來使用這些函數,但它的運行速度比SAS程序慢。

我想知道是否有是建立在python的加權相關矩陣,工程類似於SAS代碼,或至少返回相同的結果,而無需通過所有變量組合循環的有效方式。

+0

'numpy.cov轉換爲相關矩陣'需要一個權重參數,試試? https://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html#numpy.cov – chrisb

+0

不,雖然返回協方差?還是有一種簡單的方法可以從協方差變爲相關性(比如縮放協方差結果)?我在數據方面更新,所以我非常感謝幫助。 – Nizag

回答

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

所以,如果我有m個不同的列的n×m的陣列,並且我想創建一個加權的相關矩陣對於每個兩個變量之間的相關性,我要通過循環柱對使用您的代碼示例?過去我已經嘗試過類似的實現,但是它比SAS corr過程花費的時間更長。 編輯:我會嘗試使用np.cov與單個陣列作爲輸入獲得的加權協方差矩陣,然後應用cov_to_corr功能。 – Nizag

+0

無需循環,'np.cov'也接受單參數矩陣,請參閱鏈接的文檔字符串。 – chrisb