Минимальное значение 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)))
Там вы можете получить гораздо больше информации об этом.