web-dev-qa-db-fra.com

Valeur de p de la statistique de test du chi carré en Python

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

31
Davy Kavanagh

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

PDF CDF

43
learner

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

20
jb.

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
17

Vous vouliez faire:

>>> 1 - stats.chi2.cdf(3.84, 1)
0.050043521248705147
5
David Robinson

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)
3
SARose

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ù,

  • P est la probabilité d'une distribution normale (par exemple k-variée) w/covariance connue (cov) et moyenne,
  • X est une variable aléatoire de cette distribution normale,
  • m (x) est la distance de mahalanobis = sqrt (<cov ^ {- 1} (x-moyenne), x-moyenne>. Notez qu'en 1-d, ce n'est que la valeur absolue du z-score.
  • G est le CDF de la distribution chi ^ 2 w/k degrés de liberté.

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
2
travelingbones