web-dev-qa-db-fra.com

Comment effectuer un test t unilatéral à deux échantillons avec numpy/scipy

Dans R, il est possible de réaliser un test t unilatéral à deux échantillons en utilisant simplement

> A = c(0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846)
> B = c(0.6383447, 0.5271385, 1.7721380, 1.7817880)
> t.test(A, B, alternative="greater")

    Welch Two Sample t-test

data:  A and B 
t = -0.4189, df = 6.409, p-value = 0.6555
alternative hypothesis: true difference in means is greater than 0 
95 percent confidence interval:
 -1.029916       Inf 
sample estimates:
mean of x mean of y 
0.9954942 1.1798523 

Dans le monde Python, scipy fournit une fonction similaire ttest_ind , mais ne peut effectuer que des tests t bilatéraux. Les informations les plus proches sur le sujet que j'ai trouvé sont this link, mais il semble plutôt s'agir d'une discussion sur la politique de mise en œuvre unilatérale ou bilatérale dans scipy.

Par conséquent, ma question est la suivante: est-ce que quelqu'un connaît des exemples ou des instructions sur la manière d'effectuer une version unilatérale du test en utilisant numpy/scipy?

28
Timo

De votre lien de liste de diffusion:

parce que les tests unilatéraux peuvent être annulés à partir des tests bilatéraux tests. (Avec les distributions symétriques, la valeur p unilatérale ne représente que la moitié De la valeur p bilatérale)

Scipy indique toujours que la statistique de test est signée. Cela signifie que, étant donné les valeurs p et t d'un test bilatéral, vous rejetteriez l'hypothèse nulle d'un test supérieur à lorsque p/2 < alpha and t > 0 et d'un test inférieur à lorsque p/2 < alpha and t < 0.

55
lvc

Après avoir essayé d'ajouter des informations sous forme de commentaires à la réponse acceptée mais n'ayant pas pu les écrire correctement en raison de restrictions générales imposées aux commentaires, j'ai décidé de mettre mes deux sous comme réponse complète.

D'abord, formulons correctement notre question d'enquête. Les données que nous étudions sont

A = np.array([0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846])
B = np.array([0.6383447, 0.5271385, 1.7721380, 1.7817880])

avec l'échantillon moyen

A.mean() = 0.99549419
B.mean() = 1.1798523

Je suppose que puisque la moyenne de B est évidemment supérieure à la moyenne de A, vous souhaitez vérifier si ce résultat est statistiquement significatif.

Nous avons donc l'hypothèse nulle

H0: A >= B

que nous voudrions rejeter en faveur de l'hypothèse alternative

H1: B > A

Désormais, lorsque vous appelez scipy.stats.ttest_ind(x, y), un test d’hypothèse est effectué sur la valeur de x.mean()-y.mean(), ce qui signifie que pour obtenir des valeurs positives tout au long du calcul (ce qui simplifie toutes les considérations), nous devons appeler 

stats.ttest_ind(B,A)

au lieu de stats.ttest_ind(B,A). Nous obtenons comme réponse

  • t-value = 0.42210654140239207
  • p-value = 0.68406235191764142

et puisque, d'après la documentation c'est la sortie d'un test t bilatéral, nous devons diviser la p par 2 pour notre test unilatéral. Donc, en fonction du niveau d'importance alpha que vous avez choisi, vous avez besoin

p/2 < alpha

afin de rejeter l'hypothèse nulle H0. Pour alpha=0.05, ce n'est clairement pas le cas, donc vous ne pouvez pas rejeterH0.

Une autre façon de décider si vous refusez H0 sans avoir à faire d'algèbre sur t ou p consiste à examiner la valeur t et à la comparer à la valeur critique t t_crit au niveau de confiance souhaité (par exemple 95%). nombre de degrés de liberté df qui s'applique à votre problème. Depuis que nous avons

df = sample_size_1 + sample_size_2 - 2 = 8

nous obtenons d'un tableau statistique comme celui-ci que

t_crit(df=8, confidence_level=95%) = 1.860

Nous avons clairement

t < t_crit

nous obtenons donc à nouveau le même résultat, à savoir que nous ne pouvons pas rejeterH0.

5
bpirvu

Lorsque l'hypothèse nulle est Ho: P1>=P2 et que l'hypothèse alternative est Ha: P1<P2. Afin de le tester en Python, vous écrivez ttest_ind(P2,P1). (Notez que la position est P2 en premier). 

first = np.random.normal(3,2,400)
second = np.random.normal(6,2,400)
stats.ttest_ind(first, second, axis=0, equal_var=True)

Vous obtiendrez le résultat comme ci-dessous Ttest_indResult(statistic=-20.442436213923845,pvalue=5.0999336686332285e-75)

En Python, lorsque statstic <0 votre valeur p réelle est réellement real_pvalue = 1-output_pvalue/2= 1-5.0999336686332285e-75/2, ce qui correspond à environ 0,99. Comme votre valeur p est supérieure à 0,05, vous ne pouvez pas rejeter l'hypothèse nulle que 6> = 3. lorsque statstic >0, le score z réel est en fait égal à -statstic, la valeur p réelle est égale à pvalue/2.

La réponse d'Ivc devrait être quand (1-p/2) < alpha and t < 0, vous pouvez rejeter l'hypothèse inférieure à. 

3
evapanda

Avez-vous regardé ceci: Comment calculer les statistiques "t-test" avec numpy

Je pense que c'est exactement ce que cette question se pose.

Fondamentalement:

import scipy.stats
x = [1,2,3,4]
scipy.stats.ttest_1samp(x, 0)

Ttest_1sampResult(statistic=3.872983346207417, pvalue=0.030466291662170977)

est le même résultat que cet exemple dans R. https://stats.stackexchange.com/questions/51242/statistical-difference-from-zero

1
Jorge