Корреляция маскированного массива отсутствующих значений (numpy.ma)

Я пытаюсь использовать numpy.ma.corrcoef для расчета корреляций при наличии отсутствующих данных.

Согласно документации: За исключением обработки отсутствующих данных, эта функция делает то же самое, что и numpy.corrcoef. Дополнительные сведения и примеры см. в разделе numpy.corrcoef.

Вот двумерный набор данных, для которого только первая и вторая точки имеют данные для обеих переменных.

array([[ 0.00494576, -0.01331578],
   [-0.00146498, -0.01349548],
   [ 0.00430321,         nan],
   [-0.00937105,         nan],
   [        nan, -0.01356873],
   [        nan, -0.01375538],
   [        nan, -0.00277393],
   [        nan,  0.0082988 ],
   [        nan,  0.        ],
   [        nan,  0.00275103],
   [        nan,  0.00547947],
   [        nan, -0.01375538],
   [        nan,  0.0110194 ],
   [        nan, -0.00549452],
   [        nan,  0.01910017],
   [        nan, -0.02462505],
   [        nan, -0.01676017],
   [        nan,  0.0112046 ],
   [        nan,  0.01108045],
   [        nan,  0.01639381],
   [        nan,  0.01078178],
   [        nan, -0.01078178]])

Когда я использую это как замаскированный массив (np.ma.masked_array(t,np.isnan(t)) где t - это массив выше) и запускаю на нем np.ma.corrcoef (с rowvar=False), корреляция между переменные задаются как -86,52 (по абсолютной величине, а не в процентах!). Принимая во внимание, что выполнение np.corrcoef только для первых двух точек дает корреляцию 1 (опять же абсолютное значение). Это последнее значение, как я думаю, следует ожидать от первой операции в соответствии с документацией.

Информация о моей версии Python (64-разрядная версия Enthought PyLab в Mac OS X.6.8) приведена ниже, и я использую Numpy версии 1.6.1.

Python 2.7.3 |EPD 7.3-1 (64-разрядная версия)| (по умолчанию, 12 апреля 2012 г., 11:14:05) Введите «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.

Пожалуйста, посоветуйте, что мне здесь не хватает! Заранее спасибо.


person Psmith    schedule 13.08.2012    source источник


Ответы (2)


Я думаю, что это, вероятно, ошибка в numpy.ma.corrcoef (или, если быть более точным, возможно, в np.ma.extras._covhelper, который, я думаю, неправильно распространяет маску из одного столбца в другой только для одного ввода массива, но может я не туда смотрел)

Используйте np.ma.corrcoef(b[:,0], b[:,1]) и создайте отчет об ошибке... np.ma.corrcoef(b[:,0], b[:,1]) дает ожидаемый результат, так что это простой обходной путь, пока он не будет исправлен.

person seberg    schedule 14.08.2012
comment
Спасибо, я полагаю, вы смогли воспроизвести это тогда; спасибо за обходной путь, но я не думаю, что это действительно поможет мне так же сильно, как обновление numpy (см. ниже), поскольку мне нужна корреляционная матрица для набора из семи переменных, из которых только две были показаны в примере выше - person Psmith; 14.08.2012
comment
Я получаю тот же ответ «да», поэтому, если предположить, что это неправильно, это ошибка в numpy, и кажется, что она не еще не исправлена ​​​​в более новых версиях. Проблема может усугубиться до вычитания всех чисел, но на следующем этапе они больше не используются... (так что в любом случае было бы хорошо, если бы вы могли написать отчет об ошибке) - person seberg; 14.08.2012

Поскольку a является вашим примером массива, у меня есть:

In [1]: np.ma.corrcoef(a[:2])
Out[1]: 
masked_array(data =
 [[1.0 1.0]
 [1.0 1.0]],
             mask =
 [[False False]
 [False False]],
       fill_value = 1e+20)

Я использую numpy версии 1.6.2

person Nicolas Barbey    schedule 14.08.2012
comment
Спасибо; версия numpy, которую я использую, — 1.6.1, и я хотел бы знать, есть ли у вас какие-либо советы по обновлению Enthought PyLab, которое я использую. Я скачал версию 1.6.2, но когда пытаюсь ее установить, получаю сообщение о том, что необходим Python 2.7. Моя копия Enthought — это версия 2.7.3, но моя версия по умолчанию — 2.6, и именно ее, похоже, улавливает установка numpy. Как мне обновить установку Enthought, пожалуйста? - person Psmith; 14.08.2012