2011-11-27 91 views
4

實施例的數據集(行隨機從一個更大的矩陣中提取)numpy.ma.cov - 缺失值的成對相關性?

import numpy as np 

test = [[np.nan, np.nan, 0.217, 0.562], 
     [np.nan, np.nan, 0.217, 0.562], 
     [0.269, 0.0, 0.217, 0.562], 
     [np.nan, np.nan, 0.217, -0.953], 
     [np.nan, np.nan, 0.217, -0.788], 
     [0.75, 0.0, 0.217, 0.326], 
     [0.207, 0.0, 0.217, 0.814], 
     [np.nan, np.nan, 0.217, 0.562], 
     [np.nan, np.nan, 0.217, -0.022], 
     [np.nan, np.nan, 0.217, 0.562], 
     [np.nan, np.nan, 0.217, -0.953], 
     [np.nan, np.nan, 0.217, -0.953], 
     [0.078, 0.0, 0.217, -0.953], 
     [np.nan, np.nan, 0.217, -0.953], 
     [0.078, 0.0, 0.217, 0.562]] 

maskedarr = np.ma.array(test) 

np.ma.cov(maskedarr,rowvar=False,allow_masked=True) 

[[-- -- -- --] 
[-- -- -- --] 
[-- -- 0.0 0.0] 
[-- -- 0.0 0.554]] 

然而,如果使用R,

import rpy2.robjects as robjects 

robjects.globalenv['maskedarr'] = robjects.FloatVector(maskedarr.T.flatten()) 
robjects.r(''' 
dim(maskedarr) <- c(%d,%d) 
maskedarr[] <- replace(maskedarr,!is.finite(maskedarr),NA) 
''' % maskedarr.shape) 
robjects.r(''' 
print(cov(maskedarr,use="pairwise")) 
''') 

      [,1] [,2] [,3]  [,4] 
[1,] 0.0769733 0 0 0.0428294 
[2,] 0.0000000 0 0 0.0000000 
[3,] 0.0000000 0 0 0.0000000 
[4,] 0.0428294 0 0 0.5536484 

我得到一個非常不同的矩陣。如果成對相關僅與nan一起被刪除,那麼我會期望類似R的回答 - numpy.ma.cov表示allow_masked=True將允許計算這些成對相關性,但似乎並非如此。我錯過了什麼嗎?

回答

6

您的maskedarr沒有任何蒙版值。

>>> maskedarr.mask 
False 

初始化數組時需要包含mask參數。

>>> maskedarr = np.ma.array(test, mask=np.isnan(test)) 

現在maskedarr.mask如下。

>>> maskedarr.mask 
array([[ True, True, False, False], 
     [ True, True, False, False], 
     [False, False, False, False], 
     [ True, True, False, False], 
     [ True, True, False, False], 
     [False, False, False, False], 
     [False, False, False, False], 
     [ True, True, False, False], 
     [ True, True, False, False], 
     [ True, True, False, False], 
     [ True, True, False, False], 
     [ True, True, False, False], 
     [False, False, False, False], 
     [ True, True, False, False], 
     [False, False, False, False]], dtype=bool) 

這個時間做numpy.ma.cov時:

>>> np.ma.cov(maskedarr,rowvar=False,allow_masked=True) 
masked_array(data = 
[[0.0769732996251 0.0 0.0 0.0428294015418] 
[0.0 0.0 0.0 0.0] 
[0.0 0.0 0.0 0.0] 
[0.0428294015418 0.0 0.0 0.553648402899]], 
      mask = 
[[False False False False] 
[False False False False] 
[False False False False] 
[False False False False]], 
     fill_value = 1e+20) 
+0

啊,我覺得我是在之前對這個燒燬。明確指定掩碼的要求看起來很不直觀...... – hatmatrix

+1

@crippledlambda:最近(最近2個月左右),在numpy郵件列表上有關於掩碼,缺失值和應該採取哪個方向的討論(有時是激烈的討論) )。我想,如果你有任何建議,它可能(現在仍然)是一個好時機,以徵求你的意見。 – lgautier

+0

@Igautier ...謝謝 - 我應該可以列入名單... – hatmatrix