Как SciPy вычисляет значение p в функции pearsonr ()? - PullRequest
0 голосов
/ 30 апреля 2018

Я много искал, но нет объяснения того, как SciPy вычисляет p-значение для коэффициента корреляции и почему оно ненадежно (запущено SciPy на странице функций) для наборов данных меньше 500.

1 Ответ

0 голосов
/ 01 мая 2018

scipy.stats.pearsonr вычисляет значение p, используя t распределение . (Вы можете проверить исходный код в файле stats.py на github .) Это обязательно должно быть упомянуто в строке документации.

Вот пример. Во-первых, импортируйте pearsonr и реализацию дистрибутива t для scipy:

In [334]: from scipy.stats import pearsonr, t as tdist

Определите x и y для этого примера:

In [335]: x = np.array([0, 1, 2, 3, 5, 8, 13])

In [336]: y = np.array([1.2, 1.4, 1.6, 1.7, 2.0, 4.1, 6.6])

Вычислить r и p для этих данных:

In [337]: r, p = pearsonr(x, y)

In [338]: r
Out[338]: 0.9739566302403544

In [339]: p
Out[339]: 0.0002073053505382502

Теперь снова вычислите p, сначала вычислив статистику t, а затем дважды найдя функцию выживания для этого значения t:

In [340]: df = len(x) - 2

In [341]: t = r * np.sqrt(df/(1 - r**2))

In [342]: 2*tdist.sf(t, df)  # This is the p value.
Out[342]: 0.0002073053505382502

Мы получаем то же значение p, что и ожидалось.

Я не знаю источника утверждения "p-значения не совсем надежны, но, вероятно, являются разумными для наборов данных больше 500 или около того". Если кто-нибудь знает цитируемую ссылку, ее следует добавить в строку документации pearsonr.

...