Scipy kstest возвращает разные p-значения для одинаковых наборов значений

1

В Python 3.6.5 и scipy 1.1.0, когда я запускаю тест Колмогорова-Смирнова для проверки равномерного распределения, я получаю два противоположных результата (с точки зрения p-значения), если я передаю функцию kstest вектором строки или столбца:

from scipy import stats
import numpy as np

>>> np.random.seed(seed=123)
>>> stats.kstest(np.random.uniform(low=0, high=1, size=(10000, 1)), 'uniform')

KstestResult(statistic=0.9999321616877249, pvalue=0.0)

>>> np.random.seed(seed=123)
>>> stats.kstest(np.random.uniform(low=0, high=1, size=(1, 10000)), 'uniform')

KstestResult(statistic=0.9999321616877249, pvalue=0.00013567662455016283)

Вы знаете, почему это так?

Теги:
numpy
p-value
scipy

1 ответ

1
Лучший ответ

В docstring kstest что когда первым аргументом kstest является массив, ожидается, что он будет одномерным массивом. В ваших примерах вы передаете двумерные массивы (где в каждом случае одно из измерений тривиально). Оказывается, что код в kstest не будет делать то, что вы ожидаете, когда входной массив двумерный.

kstest исправление заключается в том, чтобы сгладить массив, прежде чем передавать его в kstest. Для этого можно использовать метод ravel(). Например,

In [50]: np.random.seed(seed=123)

In [51]: x = np.random.uniform(low=0, high=1, size=(10000, 1))

In [52]: stats.kstest(x.ravel(), 'uniform')
Out[52]: KstestResult(statistic=0.008002577626569918, pvalue=0.5437230826096209)

In [53]: np.random.seed(seed=123)

In [54]: x = np.random.uniform(low=0, high=1, size=(1, 10000))

In [55]: stats.kstest(x.ravel(), 'uniform')
Out[55]: KstestResult(statistic=0.008002577626569918, pvalue=0.5437230826096209)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню