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