Pakete importieren¶

In [106]:
import pandas as pd
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.multicomp import pairwise_tukeyhsd
import pingouin as pg
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.anova import AnovaRM
import pandas as pd
import scikit_posthocs as sp
import pingouin as pg
In [107]:
# Excel-Datei einlesen
mitmess = pd.read_excel("mitmess.xlsx")

# Spalten bereinigen (optional)
mitmess.columns = mitmess.columns.str.strip()

# Vorschau anzeigen
print(mitmess.head())
   ID  Gewicht Zeitpunkt
0   1       82        T0
1   2       74        T0
2   3       96        T0
3   4       80        T0
4   5       99        T0

Hypothese¶

H0: Das Gewicht der Testpersonen unterscheidet sich nicht zu verschiedenen Messzeitpunkten. $$M_{T0} = M_{T1} = M_{T2}= M_{T3} $$

H1: das Gewicht der Testpersonen unterscheidet sich zu verschiedenen Messzeitpunkten.

$$M_{T0} \neq M_{T1} \neq M_{T2}\neq M_{T3} \rightarrow \text{min. in einem Vergleich}$$

Voraussetzungen der einfaktoriellen Varianzanalyse mit Messwiederholung¶

Die abhängige Variable ist intervallskaliert -> Die Variable "Gewicht" ist ratioskaliert.

Die abhängige Variable ist normalverteilt innerhalb jedes Messzeitpunktes (Ab > 25 Probanden pro Messzeitpunkt sind Verletzungen in der Regel unproblematisch) -> siehe Histogrammm oder QQ-Plot

Sphärizität ist gegeben -> siehe Mauchly-Test auf Sphärizität

Voraussetzungsprüfung¶

Normalverteilung der Daten mithilfe des Histogrammes¶

In [108]:
sns.displot(
    data=mitmess,
    x="Gewicht",
    col="Zeitpunkt",           # Ein Diagramm für jeden Zeitpunkt
    bins=10,                   # Anzahl der Bins im Histogramm
    kde=False,                 # Optional: Wahrscheinlichkeitsdichtekurve ausschalten
    color="purple",            # Farbe für alle Plots
    aspect=1.5                 # Aspect-Ratio der Subplots (optional)
)

plt.subplots_adjust(top=0.9)    # Abstand oben anpassen, um Titel sichtbar zu machen
plt.suptitle("Histogramme des Gewichts nach Zeitpunkt")  # Titel für alle Subplots
plt.show()
No description has been provided for this image

Die Daten sind augenscheinlich eher nicht normalverteilt. Daher sollte der Friedman bevorzugt werden. Allerdings im Rahmen der Übungen und unter Anbetracht der Größe der Daten wird die Normalverteilung als gegeben angesehen.

In [109]:
import seaborn as sns
import matplotlib.pyplot as plt

# Setzt den Stil für das gesamte Plot
sns.set(style="whitegrid")

# FacetGrid für die Aufteilung nach 'Zeitpunkt'
g = sns.FacetGrid(mitmess, col="Zeitpunkt", hue="Zeitpunkt", col_wrap=2, height=4, palette="pastel")

# Kombiniertes Histogramm und Dichteplot
g.map(sns.histplot, "Gewicht", kde=True, bins=5, alpha=0.6)

# Anpassung der Legende
g.add_legend(title="Untersuchte Zeitpunkte", label_order=["T0", "T1", "T2", "T3"])

# Setze Achsenbeschriftungen
g.set_axis_labels("Gewicht in kg", "Anzahl")

# Titel für jedes Diagramm
g.set_titles("{col_name}")

# Hintergrundfarbe und Anpassung der Gitterlinien
g.fig.set_facecolor("moccasin")  # Gesamt-Hintergrundfarbe
g.set(ylim=(0, None))  # Y-Achse von 0 bis maximaler Wert
g.set(yticks=[0, 5, 10, 15, 20])  # Festlegung der Y-Achsenmarken

# Style der Gitterlinien
for ax in g.axes.flat:
    ax.grid(True, which='both', axis='both', color='gray', linestyle='-', linewidth=0.5)  # Gitterlinien hinzufügen
    ax.set_axisbelow(True)  # Stellt sicher, dass Gitterlinien unter den Balken sind

# Setze eine Titel für das gesamte Diagramm
plt.subplots_adjust(top=0.9)  # Platz für den Haupttitel
g.fig.suptitle("Histogramme und Dichteplots nach Zeitpunkt", fontsize=16)

# Diagramm anzeigen
plt.show()
No description has been provided for this image

Deskriptive Statistik¶

Die Tabellegibt die Mittelwerte, Standardabweichungen und Grössen aller vier Messzeitpunkte wieder. Diese Informationen werden für die Berichterstattung verwendet.

In [110]:
# Gruppierung nach 'Zeitpunkt' und Berechnung der deskriptiven Statistik
summary_stats = mitmess.groupby('Zeitpunkt').agg(
    Anzahl=('Gewicht', 'size'),
    Mittelwert=('Gewicht', 'mean'),
    Median=('Gewicht', 'median'),
    Standardabweichung=('Gewicht', 'std')
).round(2)  # Rundet auf 2 Dezimalstellen

# Ausgabe der deskriptiven Statistik
print(summary_stats)
           Anzahl  Mittelwert  Median  Standardabweichung
Zeitpunkt                                                
T0             73       85.97    85.0                8.82
T1             73       81.86    81.0                9.07
T2             73       77.97    77.0                9.17
T3             73       73.03    73.0                9.39

Es gibt einen Mittelwertsunterschied zwischen den Messzeitpunkten. Vor dem Training wogen die Teilnehmer im Mittel 85,97 kg (SD = 8.82, n=73). Nach einer Woche Training lag das Gewicht bei 81.86 (SD = 9.07,n=73). In der zweiten Woche bei 77.97 kg(SD=9.17,n=73). In der letzten Woche haben die Teilnehmer nur noch 73.03 kg im Schnitt(SD=9.39,n=73) gewogen. Damit haben Sie innerhalb von vier Wochen 12 kg abgenommen.

Hinweis Die Zahl der Daten sollte identsich sein. Hier sind es immer 73 Personen.

Mauchly-Test auf Sphärizität¶

Eine wichtige Voraussetzung für die Durchführung einer Varianzanalyse mit Messwiederholung ist die sogenannte "Compound Symmetry". Diese ist gegeben, wenn die Stichprobenvarianzen der einzelnen Messzeitpunkte homogen sind und die Korrelationen zwischen jedem Paar von Messzeitpunkten identisch sind. Liegen diese Bedingungen vor, spricht man von Compound Symmetry, was eine wesentliche Grundlage für die Varianzanalyse mit Messwiederholung bildet.

Sphärizität ist eine weniger restriktive Form der Compound Symmetry. Sie liegt vor, wenn die Varianzen der Differenzen zwischen jeweils zwei Messzeitpunkten gleich sind. Dieser Test ist ab drei Messzeitpunkten relevant, da bei nur zwei Messzeitpunkten nur ein einziges Paar von Differenzen existiert. Um zu prüfen, ob die Voraussetzung der Sphärizität erfüllt ist, wird der Mauchly-Test durchgeführt. Ist der Mauchly-Test nicht signifikant, kann davon ausgegangen werden, dass Sphärizität vorliegt. Ist der Mauchly-Test jedoch signifikant, liegt keine Sphärizität vor.

Wenn die Voraussetzung der Sphärizität nicht erfüllt ist, müssen die Freiheitsgrade der Signifikanztests angepasst werden. Dies geschieht durch einen Korrekturfaktor, der als Epsilon (ε) bezeichnet wird. In der Praxis wird zwischen zwei gängigen Epsilon-Korrekturen unterschieden: der Greenhouse-Geisser-Korrektur und der Huynh-Feldt-Korrektur. Der Epsilon-Wert nach Greenhouse-Geisser ist oft restriktiver und wird bei stärkeren Verletzungen der Sphärizität verwendet. Wenn der Epsilon-Wert nach Greenhouse-Geisser kleiner als 0.75 ist, wird die Greenhouse-Geisser-Korrektur angewendet. Ist der Epsilon-Wert jedoch größer als 0.75, so wird die Huynh-Feldt-Korrektur eingesetzt.



H0 :Die Varianzen der Differenzen zwischen jeweils zwei Messzeitpunkten sind gleich.
H1 :Die Varianzen der Differenzen zwischen jeweils zwei Messzeitpunkten sind nicht gleich.

Ist das Epsilon: p > 0.05 => Ergebnis nicht Signifikant –> Sphärizität
Ist das Epsilon: p < 0.05 => Ergebnis Signifikant –> keine Sphärizität-> Wenn dies der Fall ist, müssen die Freiheitsgrade mit dem Korrekturfaktor angepasst werden.

-> Ist Epsilon < 0.75 ->Greenhouse-Geisser
-> Ist Epsilon > 0.75 ->Huynh-Feldt

Ergebnisse der einfaktoriellen Varianzanalyse mit Messwiederholung¶

Die Tabelle gibt den Signifikanztest für den sogenannten "Haupteffekt" der Messwiederholung aus. Ein Haupteffekt ist der direkte Effekt eines Faktors auf die abhängige Variable. Es geht bei Innersubjekteffekten um Unterschiede innerhalb von Personen, nicht zwischen Personen.

Da von keine Sphärizität ausgegangen werden kann, müssen die Freiheitsgrade korrigiert werden. Muss eine Korrektur der Tests verwendet werden, so wird entsprechend die Zeile "Greenhouse-Geisser" oder "Huynh-Feldt" berichtet, je nachdem welche der beiden Korrekturen angebracht ist.

In [111]:
# Durchführung einer wiederholten Messungen ANOVA (gemischtes Modell)
model = ols("Gewicht ~ Zeitpunkt + (1|ID)", data=mitmess).fit()
anova_table = sm.stats.anova_lm(model, typ=2)

# Ausgabe der ANOVA-Ergebnisse
print(anova_table)
                 sum_sq     df          F        PR(>F)
Zeitpunkt   6681.791096    3.0  26.707596  2.899993e-15
1 | ID         8.275194    1.0   0.099230  7.529850e-01
Residual   23934.190560  287.0        NaN           NaN

Ist das Epsilon: p > 0.05 => Ergebnis nicht Signifikant –> Sphärizität Ist das Epsilon: p < 0.05 => Ergebnis Signifikant –> keine Sphärizität-> Wenn dies der Fall ist, müssen die Freiheitsgrade mit dem Korrekturfaktor angepasst werden. -> Ist Epsilon < 0.75 ->Greenhouse-Geisser -> Ist Epsilon > 0.75 ->Huynh-Feldt

In [112]:
# Steht noch an .. 

Die Korrektur in diesem Beispiel wird nach Greenhouse-Geisser durchgeführt, dass bedeutet die Freiheitsgrade werden mit dem Greenhouse-Geisser Eplison multipliziert.

$$df1 = 3*0.50228 \rightarrow 1.506$$ $$df2 = 216*0.50228 \rightarrow 108.49$$

Die Freiheitsgrade entnehmen wir der dritte Zeile von "out6".

Eine Varianzanalyse mit Messwiederholung zeigt, dass sich das Training der ProbandInnen je nach Messzeitpunkt unterscheidet. (F(1.506,108.49) = 1676.5, p = .000, n = 73).

Post-hoc-Tests¶

Obwohl der F-Test einen signifikanten Haupteffekt des Trainings zeigt, muss mit Post-hoc-Tests ermittelt werden, zwischen welchen Messzeitpunkten signifikante Unterschiede in der Konzentrationsfähigkeit bestehen.

Die Anzahl der möglichen Paarvergleiche bei vier Gruppen berechnet sich wie folgt:

$$ \frac{k \cdot (k - 1)}{2} = \frac{4 \cdot (4 - 1)}{2} = \frac{12}{2} = 6 $$

Das bedeutet, dass bei vier Gruppen insgesamt 6 Paarvergleiche erforderlich sind.

Bei der Berechnung von Post-hoc-Tests wird für jede Kombination von zwei Mittelwerten ein Vergleich durchgeführt. In diesem Fall, bei vier Gruppen, sind es insgesamt 6 Tests.

Problem: Alpha-Fehler-Inflation¶

Mehrere Tests führen zu einer Erhöhung der Wahrscheinlichkeit eines Alpha-Fehlers (fälschliche Ablehnung der Nullhypothese). Wenn nur ein t-Test mit einem Signifikanzniveau von 0,05 durchgeführt wird, beträgt die Wahrscheinlichkeit, dass kein Fehler auftritt, 95 %. Das bedeutet, es gibt eine 5%-ige Wahrscheinlichkeit für einen Alpha-Fehler.

Wird jedoch mehrere Tests durchgeführt, steigt die Wahrscheinlichkeit, mindestens einen Fehler zu machen.

Im aktuellen Beispiel, bei 6 Paarvergleichen, berechnet sich die Wahrscheinlichkeit, bei jedem Test keinen Fehler zu machen, wie folgt:

$$ P(\text{kein Fehler}) = 0{,}95^6 \approx 0{,}735 $$

Die Wahrscheinlichkeit, mindestens einen Fehler zu machen, beträgt daher:

$$ P(\text{mindestens ein Fehler}) = 1 - 0{,}735 = 0{,}265 $$

Das bedeutet, dass die Wahrscheinlichkeit eines Alpha-Fehlers bei den insgesamt 6 Tests bei 26,5% liegt. Diese Fehlerwahrscheinlichkeit wird als Familywise Error Rate (FWER) bezeichnet.

Lösung: Korrektur für multiple Tests¶

Um die Fehlerwahrscheinlichkeit zu kontrollieren, wird α (das Signifikanzniveau) durch die Anzahl der Paarvergleiche geteilt. Im aktuellen Beispiel ergibt sich:

$$ \frac{0{,}05}{6} = 0{,}008 $$

Dies bedeutet, dass für jeden Test ein Signifikanzniveau von 0,008 verwendet wird, um die Familywise Error Rate zu kontrollieren.

In [113]:
dunn_results = sp.posthoc_dunn(mitmess, val_col='Gewicht', group_col='Zeitpunkt', p_adjust='holm')

print(dunn_results)
              T0        T1        T2            T3
T0  1.000000e+00  0.034682  0.000015  2.403653e-12
T1  3.468247e-02  1.000000  0.034682  5.413931e-06
T2  1.527497e-05  0.034682  1.000000  2.529000e-02
T3  2.403653e-12  0.000005  0.025290  1.000000e+00

Es wird ersichtlich, dass alle vier Messzeitpunkt sich signifikant unterscheiden(p < .008). Daher lassen sich für eigenständige Gruppen bilden. Diese vier Gruppen sind generalisierbar.

Profildiagramm¶

In [114]:
#Folgt

Ea zeigt sich, dass die Gewichtsreduzierung mithilfe des Training erfolgreich ist.

Das partielle Eta-Quadrat¶

Das partielle Eta-Quadrat (partielles η2) ist ein Mass für die Effektgrösse:

Während bei eta² angegeben wird, wie viel der Gesamtvariation durch einen Effekt erklärt wird, ist es beim partiellen eta2 lediglich der Anteil der Effektvariation an der Summe aus Effekt- und Residualvariation.

$$ eta_p^2 = \frac{QS_{Treatment}}{QS_{Treatment}+QS_{Residual}}$$

In [115]:
# folgt

Im vorliegenden Beispiel beträgt das partielle Eta-Quadrat .9588. Das heisst, es wird 95,88% der Variation der Gewichtsreduktion durch die Messzeite aufgeklärt.

Berechnung der Effektstärke¶

Um die Bedeutsamkeit eines Ergebnisses zu beurteilen, werden Effektstärken berechnet. Im Beispiel sind zwar einige der Mittelwertsunterschiede zwar signifikant, doch es stellt sich die Frage, ob sie gross genug sind, um als bedeutend eingestuft zu werden.

Da R das partielle Eta-Quadrat ausgibt, wird dieses hier in die Effektstärke nach Cohen (1992) umgerechnet. In diesem Fall befindet sich die Effektstärke immer zwischen 0 und unendlich.

$$f=\sqrt\frac{\eta^{2}}{1-\eta^{2}}=\sqrt\frac{eta^{2}}{1-eta^{2}}$$

In [116]:
# folgt

Um zu beurteilen, wie gross dieser Effekt ist, kann man sich an der Einteilung von Cohen (1988) orientieren: $$ \begin{align} \text{Schwacher Effekt: } 0.10 &< ||f|| < 0.25 \\ \text{Schwacher bis mittlerer Effekt: } 0.25 &= ||f|| \\ \text{Mittlerer Effekt: } 0.25 &< ||f|| < 0.40 \\ \text{Mittlerer bis starker Effekt: }0.40 &= ||f|| \\ \text{Starker Effekt: } 0.40 &< ||f|| \end{align} $$

Damit entsprechen die Effektstärken von 4.825 einem starken Effekt.

Eine Aussage¶

Eine Varianzanalyse mit Messwiederholung zeigt, dass sich das Training der ProbandInnen je nach Messzeitpunkt unterscheidet. (F(1.51,108.49) = 1676.5, p = .000, partielles η2 = .9588, n = 73). Der Mauchly-Test ergab, dass keine Sphärizität gegeben ist, weshalb die Greenhouse-Geisser-Korrektur angewendet wurde (ϵ = .50228), wodurch sich korrigierte Freiheitsgrade ergeben.

Der Post-Hoc-Test zeigt, dass das Training der ProbandInnen zum Messzeitpunkt T0 (vor dem Training)(M = 85.97, SD = 8.82, n = 73) signifikant höher als zu Messzeitpunkt T1(erste Woche)(M = 81.86, SD = 9.07, n = 73) , Messzeitpunkt T2(zweite Woche) (M = 77.97, SD = 9.17, n = 73) und Messzeitpunkt T3(dritte Woche)(M = 73.02, SD = 9.39, n = 73). Die Teilnehmer haben im Schnitt 12 kg abgenommen.

Es können vier Gruppen generalisiert werden. Zu Beginn des Trainings gewiegen die Teilnehmer am meistern und den vier Einheiten am wenigsten. Das Training ist ein Erfolg.

Die Effektstärke liegt bei f=4.82 und entspricht damit nach Cohen (1988) einem starken Effekt.

H0 kann verworfen werden, H1 angenommen.