Die F-Verteilung

Die F-Verteilung

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import f

Die Snedecor-\(F\)-Verteilung oder die Fisher-Snedecor-Verteilung (nach Sir Ronald A. Fisher und George W. Snedecor) oder kurz die \(F\)-Verteilung ist eine kontinuierliche Wahrscheinlichkeitsverteilung mit dem Bereich \([0 \ \),\( \ +\infty[\), abhängig von zwei Parametern, die mit \(v_1,v_2\) bezeichnet werden ([Fahrmeir et al., 2016] s.281, [Scheid, 2021] s.179). In statistischen Anwendungen sind \(v_1,v_2\) positive ganze Zahlen.

Seien \(Y_1\) und \(Y_2\) seien zwei unabhängige Zufallsvariablen, die Chi-Quadrat-verteilt sind, mit \(v_1\) bzw. \(v_2\) Freiheitsgraden. Dann wird die Verteilung des Verhältnisses (\(Z\))

\[Z = \frac{Y_1/v_1}{Y_2/v_2}\]

als \(F\)-Verteilung mit \(v_1\) und \(v_2\) Freiheitsgraden bezeichnet. Die \(F\)-Verteilung wird häufig auch als Verteilung des Varianzverhältnisses bezeichnet ([Fahrmeir et al., 2016] s.281).

Eine \(F\)-Verteilung hat zwei Zahlen von Freiheitsgraden, \(v_1\) und \(v_2\), die ihre Form bestimmen. Die erste Zahl der Freiheitsgrade, \(v_1\), wird als die Freiheitsgrade des Zählers und die zweite, \(v_2\), als die Freiheitsgrade des Nenners bezeichnet.

from scipy.stats import f
import numpy as np
import matplotlib.pyplot as plt

v1 = [1, 5, 10, 20, 50, 100]
v2 = 20
x = np.linspace(0, 3, 1000)
fig, ax = plt.subplots()
for _df in v1:
    ax.plot(x, f.pdf(x, dfn=_df, dfd=v2), label=f"$v_1$={_df}")
ax.set_title(
    "F-Warscheinlichkeitsdichtefunktion mit unterschiedlichen Freiheitsgraden ($v_1$, $v_2 =20$)"
)
ax.legend(fontsize=18)
ax.set_ylim(-0.02, 1.5)
ax.axvline(0, color="k")
<matplotlib.lines.Line2D at 0x16ca8bee0>
../_images/06_Die_F_Verteilung_7_1.png
from scipy.stats import f
import numpy as np
import matplotlib.pyplot as plt

v1 = 20
v2 = [1, 5, 10, 20, 50, 100]

x = np.linspace(0, 3, 1000)
fig, ax = plt.subplots()
for _df in v2:
    ax.plot(x, f.pdf(x, dfn=v1, dfd=_df), label=f"$v_1$={_df}")
ax.set_title(
    "F-Warscheinlichkeitsdichtefunktion mit unterschiedlichen Freiheitsgraden ($v_1=20$, $v_2$)"
)
ax.legend(fontsize=18)
ax.set_ylim(-0.02, 1.5)
ax.axvline(0, color="k")
<matplotlib.lines.Line2D at 0x16d3c3e20>
../_images/06_Die_F_Verteilung_8_1.png

Grundlegende Eigenschaften von F-Kurven

  • Die Gesamtfläche unter einer \(F\)-Kurve ist gleich \(1\). -Eine \(F\)-Kurve beginnt bei \(0\) auf der horizontalen Achse und erstreckt sich unendlich weit nach rechts, wobei sie sich der horizontalen Achse nähert, diese aber nie berührt.

  • Eine \(F\)-Kurve ist rechtsschief.

Die F-Verteilung in Python


Die wichtigsten Funktionen zur Interaktion mit der \(F\)-Verteilung sind f.pdf(), f.cdf(), f.ppf(), f.rvs(). Die Funktion f.pdf() liefert die Dichte, die Funktion f.cdf() die Verteilungsfunktion, die Funktion f.ppf() die Quantilfunktion und die Funktion f.rvs() erzeugt Zufallsabweichungen.

Wir verwenden die Funktion f.pdf(), um die Dichte bei einem Wert von \(1,2\) einer \(F\)-Kurve mit \(v_1=10\) und \(v_2=20\).

f.pdf(1.2, 10, 20)
0.5626124566227062

Wir verwenden f.cdf(), um die Fläche unter der Kurve für das Intervall \([0 \ \),\( \ 1,5]\) und das Intervall \([1,5 \ \),\( \ +\infty[\) einer F-Kurve mit \(v_1=10\) und \(v_2=20\) zu berechnen. Weiter fragen wir Python, ob die Summe der Intervalle \([0 \ \),\( \ 1,5]\) und \([1,5 \ \),\( \ +\infty[\) den Wert \(1\) ergibt.

f_cdf1 = f.cdf(1.5, 10, 20)
f_cdf1
0.7890535374813874
f_cdf2 = 1 - f.cdf(1.5, 10, 20)
f_cdf2
0.2109464625186126
f_cdf1 + f_cdf2
1.0

Wir verwenden f.ppf(), um das Quantil für eine bestimmte Fläche (= Wahrscheinlichkeit) unter der Kurve für eine \(F\)-Kurve mit \(v_1=10\) und \(v_2=20\) zu berechnen, die \(q=0,25,0,5,0,75\) und \(0,999\) entspricht.

q = [0.25, 0.5, 0.75, 0.999]
f.ppf(q, 10, 20)
array([0.65639363, 0.96626389, 1.39948744, 5.07524621])

Wir verwenden die Funktion f.rvs(), um \(100.000\) Zufallswerte aus der \(F\)-Verteilung mit \(v_1=10\) und \(v_2=20\) zu erzeugen. Anschließend zeichnen wir ein Histogramm und vergleichen es mit der Wahrscheinlichkeitsdichtefunktion der \(F\)-Verteilung mit \(v_1=10\) und \(v_2=20\) (orange Linie).

# Erzeuge Chi^2 Werte
f_rvs = f.rvs(10, 20, size=10000)

# Erzeuge x-werte
x = np.linspace(0, 5, num=1000)

# Plotte t-Verteilung
fig, ax = plt.subplots()
# plt.xlim(0,4.5)

ax.set_title("Histogramm der F-Verteilung mit $v_1=10$ und $v_2=20$ Freiheitsgraden")
ax.set_ylabel("Wahrscheinlichkeitsdichte")
ax.hist(f_rvs, bins=30, edgecolor="k", density=True)
ax.plot(x, f.pdf(x, 10, 20), linewidth=6, alpha=0.8)
[<matplotlib.lines.Line2D at 0x16d49b3d0>]
../_images/06_Die_F_Verteilung_21_1.png