numpy.ma.cov - парные корреляции для пропущенных значений? - PullRequest
4 голосов
/ 27 ноября 2011

Пример набора данных (строки были случайным образом извлечены из гораздо большей матрицы)

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 позволит рассчитать эти парные корреляции, но, похоже, не так,Я что-то упустил?

1 Ответ

6 голосов
/ 27 ноября 2011

Ваш 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...