2011-11-27 92 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