Как scipy.stats обращается с nans?

Я пытаюсь сделать некоторые статистические данные в Python. У меня есть данные с несколькими пропущенными значениями, заполненные np.nan, и я не уверен, должен ли я удалить это вручную, или scipy может справиться с этим. Итак, я попробовал оба:

 import scipy.stats, numpy as np
a = [0.75, np.nan, 0.58337, 0.75, 0.75, 0.91663, 1.0, np.nan, 0.663, 0.837,     0.837, 1.0, 0.663, 1.0, 1.0, 0.91663, 0.75, 0.41669, 0.58337, 0.663, 0.75, 0.58337] 
b = [0.837, np.nan, 0.663, 0.58337, 0.75, 0.75, 0.58337, np.nan, 0.166, 0.5,     0.663, 1.0, 0.91663, 1.0, 0.663, 0.75, 0.75, 0.41669, 0.331, 0.25, 1.0, 0.91663]

d_1, d_2 = a,b
wilc1 =  scipy.stats.wilcoxon(d_1, d_2, zero_method = 'pratt')

d_1, d_2 = [], []
for d1, d2 in zip(a, b):
    if np.isnan(d1) or np.isnan(d2):
        pass
    else:
        d_1.append(d1)
        d_2.append(d2)

wilc2 =  scipy.stats.wilcoxon(d_1, d_2, zero_method = 'pratt')
print wilc1
print wilc2

Я получаю два предупреждения:

C:\Python27\lib\site-packages\scipy\stats\morestats.py:1963: RuntimeWarning: invalid value encountered in greater
  r_plus = sum((d > 0) * r, axis=0

и два выхода Уилкоксона

(54.0, 0.018545881687477818)
(54.0, 0.056806600853965265)

Как видите, у меня есть две одинаковые тестовые статистики (W) и два разных P-значения. Какой из них правильный?

Я предполагаю, что Уилкоксон правильно обрабатывает пропущенные значения при вычислении статистики теста, но при вычислении P-значения он использует len() всех данных, а не только действительные случаи. Может ли это считаться ошибкой?

1 ответ

Решение

Вы не можете математически выполнить тестовую статистику на основе нан. Если вы не найдете доказательства / документацию о специальном обращении с нан, вы не можете полагаться на это.

Мой опыт показывает, что в целом, даже numpy не обрабатывает nan специально, например, для медианы. Вместо этого результаты являются такими, какими они являются в результате реализации алгоритма.

Например, numpy.median(), кажется, в конечном итоге рассматривает nan как inf, помещая nan выше медианы. Это, вероятно, просто побочный эффект результатов a<b сравнения всегда ложны для нан. Подобный эффект, вероятно, стоит за вашими двумя идентичными значениями статистики теста W.

Также обратите внимание: в numpy есть несколько вариантов методов, таких как http://docs.scipy.org/doc/numpy/reference/generated/numpy.nanmean.html

Другие вопросы по тегам