it-swarm.com.de

Wie mache ich einen F-Test in Python?

Wie mache ich einen F-Test, um zu prüfen, ob die Varianz in zwei Vektoren in Python gleichwertig ist?

Zum Beispiel wenn ich habe 

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

gibt es etwas ähnliches zu 

scipy.stats.ttest_ind(a, b)

Ich fand 

sp.stats.f(a, b)

Aber es scheint etwas anderes als ein F-Test zu sein

23
DrewH

Die Teststatistik F-Test für gleiche Varianzen lautet einfach:

F = Var(X) / Var(Y)

Wo F als df1 = len(X) - 1, df2 = len(Y) - 1 verteilt wird

scipy.stats.f das Sie in Ihrer Frage erwähnt haben, hat eine CDF-Methode. Das heißt, Sie können einen p-Wert für die angegebene Statistik generieren und testen, ob dieser p-Wert größer ist als der von Ihnen gewählte Alpha-Wert.

Somit:

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)

Beachten Sie, dass der F-Test extrem empfindlich auf eine Nicht-Normalität von X und Y ist. Daher ist es wahrscheinlich besser, einen robusteren Test wie den - Levene-Test oder Bartlett-Test durchzuführen, sofern Sie nicht vernünftig sind Stellen Sie sicher, dass X und Y normal verteilt sind. Diese Tests finden Sie in der scipy-API:

29
Joel Cornett

Um eine Einweg-Anova zu machen, können Sie verwenden

import scipy.stats as stats

stats.f_oneway(a,b)

Anova prüft auf eine Weise, ob die Varianz zwischen den Gruppen größer ist als die Varianz innerhalb der Gruppen, und berechnet die Wahrscheinlichkeit, dass dieses Varianzverhältnis unter Verwendung der F-Verteilung beobachtet wird. Ein gutes Tutorial finden Sie hier:

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

5

Für alle, die hierher gekommen sind, um einen ANOVA-F-Test zu suchen oder Modelle für die Funktionsauswahl zu vergleichen

4
slushy

wenn Sie einen zweiseitigen Test benötigen, können Sie wie folgt vorgehen, ich habe Alpha = 0,05 gewählt: 

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)

wenn Sie mit einem ANOVA-ähnlichen Test fortfahren möchten, bei dem nur große Werte zur Ablehnung führen können, können Sie mit dem Right-Tail-Test fortfahren. Beachten Sie dabei die Reihenfolge der Varianzen (fstatistics = var1/var2 oder 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)

Der Linke Schwanz kann wie folgt gemacht werden: 

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