Mathematik für Biologiestudierende II¶

Sommersemester 2024

09.04.2024

© 2024 Prof. Dr. Rüdiger W. Braun

Tests für Erwartungswerte¶

Verbundene und unverbundene Stichproben¶

  • Zwei Versuchsreihen liefern Messergebnisse. Der Test soll entscheiden, ob sich diese Ergebnisse signifikant unterscheiden.

  • Unverbundene Stichproben: Die Messerergebnisse werden an verschiedenen Populationen gewonnen.

Z-Test zum Vergleich zweier Erwartungswerte bei verbundenen Stichproben¶

  • Gegeben sind Zufallsvariable $X_1, \dots, X_n$ und $Y_1, \dots, Y_n$
  • Verteilungsvoraussetzungen:
    • Alle $X_j$ sind normalverteilt mit unbekanntem Erwartungswert $\mu_1$ und bekannter Varianz $\sigma^2$
    • Alle $Y_j$ sind normalverteilt mit unbekanntem Erwartungswert $\mu_2$ und bekannter Varianz $\sigma^2$
    • Die beiden Varianzen müssen also gleich und bekannt sein (unrealistisch)
  • Ziel: $\mu_1$ und $\mu_2$ sollen verglichen werden
  • $x_j$ und $ _j$ seien Realisierungen (d.h., die Daten)
  • $z_j = x_j - y_j$ seien die Differenzen
  • Bestimme arithmetischen Mittelwert $$ \overline z = \frac1n \sum_{j=1}^n z_j $$
  • Die Teststatistik ist $$ t = \frac{\overline z}\sigma \cdot \sqrt{n} $$
  • Die Teststatistik wird mit einem Quantil der Standardnormalverteilung verglichen
  • $\phi$ ist die Verteilungsfunktion der Standardnormalverteilung
  • $q_\alpha$ ist das Quantil der Standardnormalverteilung zum Wert $\alpha$
  • das bedeutet $\Phi(q_\alpha) = \alpha$

Ein- und zweiseitige Tests¶

  • Tests können ein- oder zweiseitig sein
  • Es sind $\mu_1$ und $ \mu_2 $ die unbekannten wahren Erwartungswerte der beiden Stichproben
  • Bei zweiseitigen Tests ist die Nullhypothese von der Form $H_0 = \{\mu_1 = \mu_2\}$
  • Beim einseitigen unteren Test ist die Nullhypothese von der Form $H_0 = \{\mu_1 \ge \mu_2\}$, d.h. die Alternativhypothese ist $\mu_1 < \mu_2$
  • Beim einseitigen oberen Test ist die Nullhypothese von der Form $H_0 = \{\mu_1 \le \mu_2\}$, d.h. die Alternativhypothese ist $\mu_1 > \mu_2$

Entscheidungsregel¶

  • Das Signifikanzniveau sei $\alpha$
  • Beim Z-Test müssen die Quantile der Standardnormalverteilung verwendet werden

\begin{align*} &q_{1-\alpha/2} &&\text{beim zweiseitigen Test} \\ &q_{1-\alpha} &&\text{bei einem einseitigen Test} \end{align*}

  • $z_j = x_j - y_j$ und Teststatistik $$ t = \frac{\overline z}\sigma \cdot \sqrt{n} $$
  • Entscheidung:
    • $H_0 = \{\mu_1=\mu_2\} $: Die Nullhypothese $H_0$ wird abgelehnt, wenn $\left|t\right| > q_{1-\alpha/2}$
    • $H_0 = \{\mu_1\le\mu_2\}$: Die Nullhypothese $H_0$ wird abgelehnt, wenn $t > q_{1-\alpha}$
    • $H_0 = \{\mu_1\ge\mu_2\}$: Die Nullhypothese $H_0$ wird abgelehnt, wenn $t < -q_{1-\alpha}$
  • Der Z-Test wird auch als Gauß-Test bezeichnet
  • Um ihn anzuwenden, muss die Varianz der Daten bekannt sein. Das ist unrealistisch.
  • Für grobe Überschlagsrechnungen hat der Z-Test aber seine Berechtigung
  • in scipy.stats ist der Z-Test nicht implementiert

t-Tests für Mittelwerte¶

Wiederholung aus dem Wintersemester

  • Ein Medikament soll bei einer fortschreitenden Bewegungserkrankung die Verschlechterung aufhalten
  • 900 Patienten bekommen das Verum, weitere 900 ein Placebo
  • Zu den Zeitpunkten $t_0$ (Anfangszeitpunkt) und $t_1$ (Endzeitpunkt) wird die Beweglichkeit durch geschultes Personal auf einer Skala von 1 (schlecht) bis 100 (perfekt) eingeordnet.
In [1]:
import pandas as pd
from scipy import stats
In [2]:
df = pd.read_csv('treatment.csv', index_col=0)
df
Out[2]:
t0 t1 Treatment Difference
0 63.0 62.0 Verum -1.0
1 24.0 22.0 Verum -2.0
2 77.0 72.0 Verum -5.0
3 43.0 41.0 Verum -2.0
4 88.0 84.0 Verum -4.0
... ... ... ... ...
1764 62.0 53.0 Placebo -9.0
1765 54.0 56.0 Placebo 2.0
1766 57.0 52.0 Placebo -5.0
1767 95.0 93.0 Placebo -2.0
1768 41.0 39.0 Placebo -2.0

1769 rows × 4 columns

  • In der Spalte "Difference" steht die Differenz zwischen den beiden Zeitpunkten. Idealerweise ist sie positiv, wenn das Medikament die Verschlechterung sogar umkehrt.
  • Jedenfalls soll der Test zeigen, dass die Differenz bei den Probanden mit Verum im Mittel größer als bei den anderen ist
  • Einseitiger, unverbundener Test
In [3]:
dfv = df[df.Treatment=='Verum']
dfv.describe()
Out[3]:
t0 t1 Difference
count 887.000000 887.000000 887.000000
mean 61.073281 57.054115 -4.019166
std 20.169044 20.405522 3.093843
min 5.000000 1.000000 -15.000000
25% 47.000000 43.000000 -6.000000
50% 61.000000 57.000000 -4.000000
75% 75.000000 71.000000 -2.000000
max 100.000000 100.000000 5.000000
In [4]:
dfp = df[df.Treatment=='Placebo']
dfp.describe()
Out[4]:
t0 t1 Difference
count 882.000000 882.000000 882.000000
mean 63.548753 59.189342 -4.359410
std 20.061947 20.266874 3.089117
min 0.000000 0.000000 -13.000000
25% 50.000000 45.000000 -6.000000
50% 64.000000 60.000000 -4.000000
75% 78.000000 74.000000 -2.000000
max 100.000000 100.000000 5.000000
  • Aus der Gruppe der Probanden mit Verum sind 13 Leute ausgeschieden
  • aus der anderen 18
In [5]:
stats.ttest_ind(dfv.Difference, dfp.Difference, alternative='greater')
Out[5]:
TtestResult(statistic=2.314493969317715, pvalue=0.010377396661800722, df=1767.0)

Die Nullhypothese, dass das Medikament nicht besser wirkt als Placebo, kann zum Signifikanzniveau $\alpha=0.011$ abgelehnt werden.

Effektstärke¶

Beim Vergleich zweier Mittelwerte kann "Cohen's d" zur Messung der Effektstärke verwendet werden.

$$ d = \left| \frac{\overline x - \overline y}s \right| $$

wobei $\overline x$ und $\overline y$ die beiden Mittelwerte, $s$ die Stichprobenstreuung und $|a|$ den Betrag von $a$ bezeichnet.

  • Bei verbundenen Stichproben verwendet man die Stichprobenstreuung der Differenz
  • Bei unverbundenen Stichproben verwendet man die Standardabweichung der gepoolten Stichproben (s. Lektion 12)
In [6]:
import numpy as np
In [7]:
n1 = dfv.Difference.count()
n2 = dfp.Difference.count()
xq = dfv.Difference.mean()
yq = dfp.Difference.mean()
sx = dfv.Difference.std()
sy = dfp.Difference.std()
In [8]:
zaehler = (n1-1)*sx**2 + (n2-1)*sy**2
nenner = n1+n2-2
sp = np.sqrt(zaehler/nenner)
sp
Out[8]:
3.091487580276714
In [9]:
d = (xq - yq) / sp
d
Out[9]:
0.11005857045633367

Interpretation der Effektgröße¶

d-Wert Interpretation
0.2 geringer Effekt
0.5 mittlerer Effekt
0.8 starker Effekt

Wir haben also einen geringen Effekt beobachtet

Power-Analyse¶

Bauer Pillenhuber wird verdächtigt, seine Bio-Hühnchen mit Antibiotika vollzudröhnen. Wir wollen das durch Blutuntersuchungen nachweisen.

  • Es handelt sich um den Vergleich mit einem Referenzwert, also einen verbundenen t-Test
  • Er ist einseitig
  • Wie viele Tiere müssen untersucht werden?
  • Wir erwarten einen starken Effekt, sagen wir d=0.7
  • Wir verlangen ein Signifikanzniveau von $\alpha=0.01$, um niemanden zu Unrecht zu verdächtigen
In [10]:
import statsmodels.stats.power as smp   
In [11]:
import seaborn as sns
sns.set_theme()        

Power: Wahrscheinlichkeit, dass die Nullhypothese abgelehnt wird, wenn tatsächlich die Alternative gilt

In [12]:
poweranalyse = smp.TTestPower()
In [13]:
poweranalyse.power(effect_size=0.7, alpha=0.01, nobs=10)
Out[13]:
0.2260109977856286
In [14]:
poweranalyse.plot_power(effect_size=[0.7], alpha=0.01, nobs=np.arange(2,100), 
                         alternative='larger');
# nobs: "number of observations"
No description has been provided for this image

Wir sollten 35 Hühner untersuchen

In [15]:
poweranalyse.power(effect_size=0.7, alpha=0.01, nobs=35, alternative='larger')
Out[15]:
0.9502228513191198

Power-Analyse für unverbundene t-Tests¶

  • Sie wollen wissen, ob auf sandigem Boden das Verhältnis von Kiefern zu Fichten ein anderes als auf lehmigem ist
  • Sie erwarten einen mittleren Effekt
  • Sie wählen den Standardwert $\alpha=0.05$
  • Es handelt sich um einen unverbundenen Test
  • Sie wählen $n_1$ sandige und $n_2=n_1$ lehmige Waldparzellen aus
  • Wie groß müssen $n_1$ und $n_2$ sein?
In [16]:
poweranalyse = smp.TTestIndPower()  # Ind = Independent
In [17]:
poweranalyse.plot_power(effect_size=[0.5], alpha=0.05, nobs=np.arange(2,150));
No description has been provided for this image

Sie müssen ca 100 Parzellen von jeder Sorte ansehen, um eine Power von knapp 95% zu erreichen

In [18]:
poweranalyse.power(effect_size=0.5, alpha=0.05, nobs1=100, ratio=1)
Out[18]:
0.9404271933839895
  • ratio ist das Verhältnis $\frac{n_2}{n_1}$
  • Man plant eingentlich immer mit ratio=1
  • Dann kann man diese Angabe bei poweranalyse.power weglassen