Минимальное значение p для scipy.stats.pearsonr

Я использую scipy.stats.pearsonr для своих данных и получаю

(0,9672434106763087, 0,0)

Разумно, что значение r высокое, а значение p очень низкое. Однако p, очевидно, не равно 0, поэтому я хотел бы знать, что означает p=0.0. Это р<10^-10, р <10^-100 или какой предел?

1 ответ

Как указал @MB-F в комментариях, он рассчитывается аналитически.

В коде для версии 0.19.1 вы можете изолировать эту часть кода и построить график p-значения с точки зренияr

      import numpy as np
import matplotlib.pyplot as plt
from scipy.special import betainc
r = np.linspace(-1, 1, 1000)*(1-1e-10);

for n in [10, 100, 1000]:
    df = n - 2
    t_squared = r**2 * (df / ((1.0 - r) * (1.0 + r)))
    prob = betainc(0.5*df, 0.5, df/(df+t_squared))
    plt.semilogy(r, prob, label=f'n={n}')
plt.axvline(0.9672434106763087, ls='--', color='black', label='r value')
plt.legend()
plt.grid()

Текущая стабильная версия 1.9.3 использует другую формулу

      import numpy as np
import matplotlib.pyplot as plt
from scipy.special import btdtr
r = np.linspace(-1, 1, 1000)*(1-1e-10);
for n in [10, 100, 1000]:
    ab = 0.5*n
    prob = btdtr(ab, ab, 0.5*(1-abs(r)))
    plt.semilogy(r, prob, label=f'n={n}')
plt.axvline(0.9672434106763087, ls='--', color='black', label='r value')
plt.legend()
plt.grid()

Но дают те же результаты.

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

Бета-распределение

Scipy предоставляет набор вероятностных распределений , в том числе бета-распределение .

Линия

          prob = btdtr(ab, ab, 0.5*(1-abs(r)))

может быть заменен на

      from scipy.stats import beta
prob = beta(ab, ab).cdf(0.5*(1-abs(r)))

Там вы можете получить гораздо больше информации об этом.

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