Как 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