Как вы можете выполнить односторонний двухэлементный тест Колмогорова – Смирнова в Python? - PullRequest
3 голосов
/ 08 октября 2019

Я пытаюсь выполнить тест KS с двумя выборками в Python 3, чтобы обнаружить любую существенную разницу между дистрибутивами. Для удобства, позволяя a и b столбцу данных .csv, который я хотел бы сравнить, я просто запустил следующий "код":

from scipy.stats import ks_2samp
ks_2samp(a, b)

Возвращаемые значения содержали наибольшее расстояние (statistics) и значение p (pvalue):

Ks_2sampResult(statistic=0.0329418537762845, pvalue=0.000127997328482532)

Что я хотел бы знать, так как ks_2samp обрабатывает толькодвусторонний двухсэмплированный тест KS, есть ли способ выполнить односторонний двухсэмплированный тест KS в Python?

Кроме того, как я могу узнать положение, в котором происходит наибольшее расстояние? (Значение по оси X).

1 Ответ

2 голосов
/ 08 октября 2019

scipy.stats.ks_2samp уже поддерживает то, что вы хотите. Вам просто нужно указать направление, в котором вы хотите проверить, то есть какой образец считается большим или меньшим, чем другой.

Эта опция для установки alternative, однако, доступна только начиная с scipy 1.3.0.

ks_2samp(a, b, alternative='less')     # get p-value for testing if a < b
ks_2samp(a, b, alternative='greater')  # get p-value for testing if a > b

Редактировать: Чтобы определить значение x, где произошло наибольшее различие, вы можете использовать эту функцию (в основном копирование-вставка из источника ks_2samp):

def ks_2samp_x(data1, data2, alternative="two-sided"):
    data1 = np.sort(data1)
    data2 = np.sort(data2)
    n1 = data1.shape[0]
    n2 = data2.shape[0]

    data_all = np.concatenate([data1, data2])
    # using searchsorted solves equal data problem
    cdf1 = np.searchsorted(data1, data_all, side='right') / n1
    cdf2 = np.searchsorted(data2, data_all, side='right') / n2
    cddiffs = cdf1 - cdf2
    minS = np.argmin(cddiffs)   # ks_2samp uses np.min or np.max respectively 
    maxS = np.argmax(cddiffs)   # now we get instead the index in data_all
    alt2Dvalue = {'less': minS, 'greater': maxS, 'two-sided': max(minS, maxS)}
    d_arg = alt2Dvalue[alternative]
    return data_all[d_arg]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...