web-dev-qa-db-fra.com

Comment puis-je faire un test F en python

Comment puis-je faire un test F pour vérifier si la variance est équivalente dans deux vecteurs en Python?

Par exemple si j'ai 

a = [1,2,1,2,1,2,1,2,1,2]
b = [1,3,-1,2,1,5,-1,6,-1,2]

y a-t-il quelque chose de semblable à 

scipy.stats.ttest_ind(a, b)

J'ai trouvé 

sp.stats.f(a, b)

Mais cela semble être quelque chose de différent d'un test F

23
DrewH

La statistique de test F test à variance égale est simplement:

F = Var(X) / Var(Y)

F est distribué sous la forme df1 = len(X) - 1, df2 = len(Y) - 1

scipy.stats.f dont vous avez parlé dans votre question utilise une méthode CDF. Cela signifie que vous pouvez générer une valeur p pour la statistique donnée et vérifier si cette valeur p est supérieure au niveau alpha choisi.

Ainsi:

alpha = 0.05 #Or whatever you want your alpha to be.
p_value = scipy.stats.f.cdf(F, df1, df2)
if p_value > alpha:
    # Reject the null hypothesis that Var(X) == Var(Y)

Notez que le test F est extrêmement sensible à la non-normalité de X et Y, il est donc probablement préférable de faire un test plus robuste tel que test de Levene ou test de Bartlett sauf si vous êtes raisonnablement raisonnable Assurez-vous que X et Y sont distribués normalement. Ces tests peuvent être trouvés dans le scipy api:

29
Joel Cornett

Pour faire un anova à sens unique, vous pouvez utiliser

import scipy.stats as stats

stats.f_oneway(a,b)

Anova vérifie si la variance entre les groupes est supérieure à la variance au sein des groupes et calcule la probabilité d'observer ce rapport de variance à l'aide de la distribution F. Un bon tutoriel peut être trouvé ici:

https://www.khanacademy.org/math/probability/statistics-inferential/anova/v/anova-1-calculating-sst-total-sum-of-squares

5
Ryszard Cetnarski

Pour tous ceux qui sont venus ici à la recherche d'un test ANOVA F ou pour comparer les modèles de sélection

4
slushy

si vous avez besoin d’un test bilatéral, vous pouvez procéder comme suit, j’ai choisi alpha = 0.05: 

a = [1,2,1,2,1,2,1,2,1,2]
b = [1,3,-1,2,1,5,-1,6,-1,2]
print('Variance a={0:.3f}, Variance b={1:.3f}'.format(np.var(a, ddof=1), np.var(b, ddof=1)))
fstatistics = np.var(a, ddof=1)/np.var(b, ddof=1) # because we estimate mean from data
fdistribution = stats.f(len(a)-1,len(b)-1) # build an F-distribution object
p_value = 2*min(fdistribution.cdf(f_critical), 1-fdistribution.cdf(f_critical))
f_critical1 = fdistribution.ppf(0.025)
f_critical2 = fdistribution.ppf(0.975)
print(fstatistics,f_critical1, f_critical2 )
if (p_value<0.05):
    print('Reject H0', p_value)
else:
    print('Cant Reject H0', p_value)

si vous souhaitez procéder à un test de type ANOVA où seules des valeurs élevées peuvent provoquer un rejet, vous pouvez procéder à un test à droite, vous devez faire attention à l'ordre des écarts (fstatistics = var1/var2 ou var2/var1): 

a = [1,2,1,2,1,2,1,2,1,2]
b = [1,3,-1,2,1,5,-1,6,-1,2]
print('Variance a={0:.3f}, Variance b={1:.3f}'.format(np.var(a, ddof=1), np.var(b, ddof=1)))
fstatistics = max(np.var(a, ddof=1), np.var(b, ddof=1))/min(np.var(a, ddof=1), np.var(b, ddof=1)) # because we estimate mean from data
fdistribution = stats.f(len(a)-1,len(b)-1) # build an F-distribution object 
p_value = 1-fdistribution.cdf(fstatistics)
f_critical = fd.ppf(0.95)
print(fstatistics, f_critical)
if (p_value<0.05):
    print('Reject H0', p_value)
else:
    print('Cant Reject H0', p_value)

Le gauche peut être fait comme suit: 

a = [1,2,1,2,1,2,1,2,1,2]
b = [1,3,-1,2,1,5,-1,6,-1,2]
print('Variance a={0:.3f}, Variance b={1:.3f}'.format(np.var(a, ddof=1), np.var(b, ddof=1)))
fstatistics = min(np.var(a, ddof=1), np.var(b, ddof=1))/max(np.var(a, ddof=1), np.var(b, ddof=1)) # because we estimate mean from data
fdistribution = stats.f(len(a)-1,len(b)-1) # build an F-distribution object
p_value = fdistribution.cdf(fstatistics)
f_critical = fd.ppf(0.05)
print(fstatistics, f_critical)
if (p_value<0.05):
    print('Reject H0', p_value)
else:
    print('Cant Reject H0', p_value)
0
Ala Ham