2014-11-24 76 views
5

當數據中存在NaN時,我沒有找到計算包含兩個以上變量觀測數組的相關係數矩陣的函數。有一些函數爲變量對(或者只是使用〜is.nan())來掩蓋數組)。但是,通過循環大量變量來使用這些函數,計算每對函數的相關性可能非常耗時。python - 如何在數據矩陣中計算nans的相關矩陣

所以我嘗試了一下,很快就意識到這樣做的複雜性是協方差正確化的問題。我會非常感興趣的關於如何做到這一點的意見。

下面是代碼:

def nancorr(X,nanfact=False): 
    X = X - np.nanmean(X,axis=1,keepdims = True)*np.ones((1,X.shape[1])) 

    if nanfact: 
     mask = np.isnan(X).astype(int) 
     fact = X.shape[1] - np.dot(mask,mask.T) - 1  

    X[np.isnan(X)] = 0 
    if nanfact: 
     cov = np.dot(X,X.T)/fact 
    else: 
     cov = np.dot(X,X.T) 

    d = np.diag(cov) 
    return cov/np.sqrt(np.multiply.outer(d,d)) 

該函數假定每行是一個變量。它基本上是numpy的corrcoeff()中的一個調整後的代碼。 我相信有三種方法可以做到這一點:

(1)對於每一對變量,你只採用那些既不是其中一個變量也不是NaN的觀察值。這可以說是最準確的,但也是最難編程的,如果你想同時進行多對計算而不是上面的代碼。但是,爲什麼要拋棄每個變量的均值和方差的信息,僅僅是因爲另一個變量的對應條目是NaN?因此,另外兩個選項。 (2)我們將每個變量用它來表示,並且每個變量的方差就是其方差。對於協方差,每個觀測值中的一個或另一個變量是NaN,但不是兩者都是觀察到無共變,因此設爲零。協方差因子是1 /(觀測值,其中兩個變量都不是NaN - 1),用n表示。相關係數分母中的兩個方差都由其相應的非NaN觀測值減1表示,分別用n1和n2表示。這是通過在上面的函數中設置nanfact = True來實現的。 (3)人們可能希望協方差和方差具有與沒有NaN時的相關係數相同的因子。在這裏做唯一有意義的方法(如果選項(1)不可行),就是簡單地忽略(1/n)/ sqrt(1/n1 * n2)。由於這個數字小於1,估計的相關係數將會大於(絕對值)比(2),但將保持在-1,1之間。這是通過設置nanfact = False來實現的。我會非常感興趣的方法(2)和(3)的意見,尤其是,我非常希望看到(1)的解決方案,而不使用循環。

回答

5

我覺得你正在尋找的方法是從熊貓corr()。例如,一個數據框如下。你也可以參考這個問題。 How to efficiently get the correlation matrix (with p-values) of a data frame with NaN values?

import pandas as pd 
df = pd.DataFrame({'A': [2, None, 1, -4, None, None, 3], 
        'B': [None, 1, None, None, 1, 3, None], 
        'C': [2, 1, None, 2, 2.1, 1, 0], 
        'D': [-2, 1.1, 3.2, 2, None, 1, None]}) 

df 
A  B  C  D 
0 2  NaN  2  -2 
1 NaN  1  1  1.1 
2 1  NaN  NaN  3.2 
3 -4  NaN  2  2 
4 NaN  1  2.1  NaN 
5 NaN  3  1  1 
6 3  NaN  0  NaN 
rho = df.corr() 
rho 
 A   B   C   D 
A 1.000000  NaN  -0.609994 -0.441784 
B NaN   1.0  -0.500000 -1.000000 
C -0.609994 -0.5  1.000000 -0.347928 
D 0.041204  -1.0  -0.347928 1.000000 
+0

所以熊貓顯然提供什麼I(1)上述下選項。也就是說,在計算成對相關時,它只使用那些在各個列中都不是'Nan'的觀察值 - 即使是計算平均值和方差。我之前沒有提到的另外一個問題是,我不確定這是否是一個半正定的Cov。順便說一句,你似乎已經提供了錯誤的corr矩陣到你的示例數據框。例如。 C,D條目應爲-0.347928。 – user3820991 2016-12-16 14:09:05

+0

更正了corr-matrix結果。 – 2016-12-16 15:54:10