J'ai calculé une statistique de test qui est distribuée comme un chi carré avec 1 degré de liberté, et je veux savoir quelle valeur P cela correspond à l'utilisation de python.
Je suis un python et débutant en mathématiques/statistiques, donc je pense que ce que je veux ici est la fonction de déni de probabilité pour la distribution chi2 de SciPy. Cependant, lorsque j'utilise ceci comme ceci:
from scipy import stats
stats.chi2.pdf(3.84 , 1)
0.029846
Cependant, certains googler et parler à certains collègues qui connaissent les mathématiques mais pas python ont dit que cela devrait être 0,05.
Des idées? À la vôtre, Davy
Rappel rapide ici:
Fonction de densité de probabilité: pensez-y comme une valeur en points; quelle est la densité en un point donné?
Fonction de distribution cumulative: c'est la masse de probabilité de la fonction jusqu'à un point donné; quel pourcentage de la distribution se situe d'un côté de ce point?
Dans votre cas, vous avez pris le PDF, pour lequel vous avez obtenu la bonne réponse. Si vous essayez 1 - CDF:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
Pour calculer la probabilité d'une hypothèse nulle à partir d'une somme en ciseaux et de degrés de liberté, vous pouvez également appeler chisqprob
:
>>> from scipy.stats import chisqprob
>>> chisqprob(3.84, 1)
0.050043521248705189
Remarque:
chisqprob est déconseillé! stats.chisqprob est déconseillé dans scipy 0.17.0; utilisez stats.distributions.chi2.sf à la place
Alors que stats.chisqprob () et 1-stats.chi2.cdf () semblent comparables pour les petites valeurs de chi carré, pour les grandes valeurs de chi carré, la première est préférable. Ce dernier ne peut pas fournir une valeur de p inférieure à la machine epsilon et donnera des réponses très inexactes proches de la machine epsilon. Comme l'ont montré d'autres, des valeurs comparables résultent pour de petites valeurs de chi carré avec les deux méthodes:
>>>from scipy.stats import chisqprob, chi2
>>>chisqprob(3.84,1)
0.050043521248705189
>>>1 - chi2.cdf(3.84,1)
0.050043521248705147
L'utilisation de 1-chi2.cdf () se décompose ici:
>>>1 - chi2.cdf(67,1)
2.2204460492503131e-16
>>>1 - chi2.cdf(68,1)
1.1102230246251565e-16
>>>1 - chi2.cdf(69,1)
1.1102230246251565e-16
>>>1 - chi2.cdf(70,1)
0.0
Tandis que chisqprob () vous donne des résultats précis pour une plage beaucoup plus large de valeurs de chi carré, produisant des valeurs de p presque aussi petites que le plus petit flottant supérieur à zéro, jusqu'à ce qu'il soit trop bas:
>>>chisqprob(67,1)
2.7150713219425247e-16
>>>chisqprob(68,1)
1.6349553217245471e-16
>>>chisqprob(69,1)
9.8463440314253303e-17
>>>chisqprob(70,1)
5.9304458500824782e-17
>>>chisqprob(500,1)
9.505397766554137e-111
>>>chisqprob(1000,1)
1.7958327848007363e-219
>>>chisqprob(1424,1)
1.2799986253099803e-311
>>>chisqprob(1425,1)
0.0
Mise à jour: comme indiqué, chisqprob () est déconseillé pour la version 0.17.0 de scipy. Les valeurs chi carré de haute précision peuvent désormais être obtenues via scipy.stats.distributions.chi2.sf (), par exemple:
>>>from scipy.stats.distributions import chi2
>>>chi2.sf(3.84,1)
0.050043521248705189
>>>chi2.sf(1424,1)
1.2799986253099803e-311
Vous vouliez faire:
>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
Certaines des autres solutions sont obsolètes. Utilisez la fonction de survie scipy.stats.chi2
. C'est la même chose que 1 - cdf(chi_statistic, df)
Exemple:
from scipy.stats import chi2
p_value = chi2.sf(chi_statistic, df)
Si vous voulez comprendre les mathématiques, la valeur de p d'un échantillon, x (fixe), est
P [P (X) <= P (x)] = P [m (X)> = m (x)] = 1 - G (m (x) ^ 2)
où,
Donc, si vous calculez la valeur de p d'une observation fixe, x, alors vous calculez m(x) (score z généralisé), et 1-G (m (x) ^ 2).
par exemple, il est bien connu que si x est échantillonné à partir d'une distribution normale univariée (k = 1) et a un score z = 2 (c'est 2 écarts-types de la moyenne), alors la valeur p est d'environ 0,046 (voir un tableau des scores z)
In [7]: from scipy.stats import chi2
In [8]: k = 1
In [9]: z = 2
In [10]: 1-chi2.cdf(z**2, k)
Out[10]: 0.045500263896358528