Mathematik für Biologiestudierende II¶
Sommersemester 2024
28.05.2024
© 2024 Prof. Dr. Rüdiger W. Braun
In [1]:
import numpy as np
import pandas as pd
from scipy import stats
import seaborn as sns
sns.set_theme()
Konfidenzintervalle¶
Konfidenzintervall für den Erwartungswert¶
- $X_1, \dots, X_n$ seien normalverteilt mit unbekanntem Erwartungswert und unbekannter Streuung
- Für den Erwartungswert soll ein Konfidenzintervall zum Konfidenzniveau $1-\alpha$ geschätzt werden
- Benötigt werden das $1 - \frac\alpha2$-Quantil $t_{n-1, 1-\alpha/2}$ der $t$-Verteilung mit $n-1$-Freiheitsgraden,
- das arithmetische Mittel $\overline x$ der Daten,
- und die Stichprobenstreuung $s$ der Daten
- Das Konfidenzintervall ist $$ \left[ \overline x - \frac{s \cdot t_{n-1, 1-\alpha/2}}{\sqrt n},\, \overline x + \frac{s \cdot t_{n-1, 1-\alpha/2}}{\sqrt n} \right] $$
Bedeutung des Konfidenzintervalls¶
- Das Konfidenzintervalls zum Konfidenzniveau $1-\alpha$ ist ein Intervall, in welchem der wahre Erwartungswert $\mu$ mit Wahrscheinlichkeit $1-\alpha$ liegt
- Die beiden Grenzen des Konfidenzintervalls bezeichnet man als obere und untere Vertrauensgrenze
- Das Konfidenzintervall ist die zufallsbehaftete Größe, nicht der Erwartungswert
Beispiel: Roggenpflanzen¶
- Gesunde Roggenpflanzen einer bestimmten Art sind im Mittel $102.5cm$ lang. Die Länge sei normalverteilt
- Durch Umwelteinflüsse änderte sich möglicherweise die mittlere Halmlänge. Das soll zum Konfidenzniveau 95% überprüft werden
- Die folgenden Längen werden gemessen
In [2]:
df = pd.DataFrame()
df['Länge'] = [96.62, 94.91, 85.05, 101.61, 109.55, 93.05, 97.86, 96.66, 95.08, 98.87]
df
Out[2]:
Länge | |
---|---|
0 | 96.62 |
1 | 94.91 |
2 | 85.05 |
3 | 101.61 |
4 | 109.55 |
5 | 93.05 |
6 | 97.86 |
7 | 96.66 |
8 | 95.08 |
9 | 98.87 |
In [3]:
df.describe()
Out[3]:
Länge | |
---|---|
count | 10.000000 |
mean | 96.926000 |
std | 6.233029 |
min | 85.050000 |
25% | 94.952500 |
50% | 96.640000 |
75% | 98.617500 |
max | 109.550000 |
- $1 - \alpha = 0.95$, also $\alpha = 0.05$ und $1 - \frac\alpha2 = 0.975$
- Es wird das Quantil $t_{9,0.975}$ benötigt
In [4]:
P = stats.t(9)
P.ppf(0.975)
Out[4]:
2.2621571627409915
In [5]:
ugrenze = 96.926 - 6.233*P.ppf(0.975) / np.sqrt(10)
ugrenze
Out[5]:
92.46718040519762
In [6]:
ogrenze = 96.926 + 6.233*P.ppf(0.975) / np.sqrt(10)
ogrenze
Out[6]:
101.38481959480238
- Der Erwartungswert für gesunde Pflanzen beträgt 102.5$cm$. Da er nicht in dem Konfidenzintervall zum Konfidenzniveau 95% liegt, kann man zum Signifikanzniveau 5% sagen, dass die Roggenpflanzen geschädigt sind
- Kennt man also das Konfidenzintervall zum Konfidenzniveau $1-\alpha$, so kann man den zweiseitigen t-Test zum Signifikanzniveau $\alpha$ durchführen
- dasselbe mit
statsmodels
In [7]:
import statsmodels.stats.api as sms
sms.DescrStatsW(df.Länge).tconfint_mean()
Out[7]:
(92.46715975315159, 101.38484024684841)
Plot des Konfidenzintervalls¶
Der gelbe Bereich ist das Konfidenzintervall zum Konfidenzniveau 95%
Datenpaare¶
Die Datei enthält Alter und Blutdruck von 30 Probanden
In [8]:
df = pd.read_csv('blutdruckdaten.csv')
df
Out[8]:
Alter | Blutdruck | Größe | |
---|---|---|---|
0 | 17 | 110.0 | 165.3 |
1 | 19 | 125.0 | 180.0 |
2 | 21 | 118.0 | 177.8 |
3 | 23 | 119.0 | 173.3 |
4 | 25 | 125.0 | 173.5 |
5 | 27 | 128.0 | 166.2 |
6 | 36 | 108.0 | 176.1 |
7 | 37 | 136.0 | 184.6 |
8 | 38 | 118.0 | 181.5 |
9 | 38 | 146.0 | 176.3 |
10 | 41 | 122.0 | 176.3 |
11 | 42 | 128.0 | 170.8 |
12 | 42 | 145.0 | 177.0 |
13 | 42 | 158.0 | 171.8 |
14 | 45 | 132.0 | 167.8 |
15 | 45 | 136.0 | 170.7 |
16 | 46 | 144.0 | 177.1 |
17 | 47 | 126.0 | 177.8 |
18 | 47 | 195.0 | 179.2 |
19 | 48 | 148.0 | 177.4 |
20 | 53 | 165.0 | 176.3 |
21 | 53 | 175.0 | 176.3 |
22 | 57 | 152.0 | 171.0 |
23 | 58 | 175.0 | 178.7 |
24 | 63 | 168.0 | 180.1 |
25 | 64 | 184.0 | 175.3 |
26 | 66 | 194.0 | 189.0 |
27 | 67 | 182.0 | 184.7 |
28 | 68 | 177.0 | 177.7 |
29 | 69 | 199.0 | 181.6 |
In [9]:
sns.regplot(df, x='Alter', y='Blutdruck', fit_reg=False);
Wir wollen die "beste" Gerade durch diese Punkte
In [10]:
sns.regplot(df, x='Alter', y='Blutdruck');
Die Bedeutung des hellblauen Bereichs verstehen wir nach der Erläuterung der Geraden
Empirische Kovarianz¶
- Empirische Kovarianz: Wie empirische Varianz, aber für Datenpaare
- Wir haben $n$ Datenpaare $(x_1, y_1), (x_2, y_2), \dots, (x_n,y_n)$
- das arithmetische Mittel der $x_j$ ist $\overline x$, das der $y_j$ ist $\overline y$
- die empirische Kovarianz von $x$ und $y$ ist $$ \text{covar}_{\text{emp}}(x,y) = \frac1{n-1} \bigl( (x_1-\overline x)(y_1-\overline y) + (x_2-\overline x)(y_2-\overline y) + \dots + (x_n-\overline x)(y_n-\overline y)\bigr) $$
- Formel ohne Pünktchen $$ \text{covar}_{\text{emp}}(x,y) = \frac1{n-1} \sum_{j=1}^n (x_j - \overline x)(y_j - \overline y) $$
- Die Kovarianz misst, wie $x$ und $y$ zusammenhängen
In [11]:
df.cov()
Out[11]:
Alter | Blutdruck | Größe | |
---|---|---|---|
Alter | 231.131034 | 348.572414 | 36.128966 |
Blutdruck | 348.572414 | 750.271264 | 69.805057 |
Größe | 36.128966 | 69.805057 | 28.617195 |
- Die Tabelle zeigt für jedes Faktorpaar die zugehörige Kovarianz
- Sie ist symmetrisch
- Auf der Diagonalen stehen die empirischen Varianzen
Lineare Regression¶
- "Lineare Regression": Bestimmung einer Regressionsgeraden
- "linear": auf einer Gerade liegend
- "Gerade": Funktionsvorschrift $$ y = m \cdot x + b $$
- Hierbei ist
- $m$ die Steigung der Geraden
- $b$ der Ordinatenabschnitt der Geraden
- Die Regressionsgerade ist die Gerade mit der bestmöglichen Annäherung an die Datenpunkte
- "bestmöglich" bedeutet $$ \sum_{j=1}^n (m \cdot x_j + b - y_j)^2 \overset{!}{=} \min $$
Formel für die lineare Regression¶
- Gegeben: Datenpaare $(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)$
- Gesucht: Regressionsgerade $y = m \cdot x + b$
- Rechenvorschrift:
\begin{align*} m &= \frac{\text{covar}_\text{emp}(x,y)}{s_x^2} \\ b &= \overline y - m \overline x \end{align*} - Dabei:
- $\overline x$ und $\overline y$: arithmetisches Mittel von $x$ und $y$
- $s_x^2$ empirische Varianz von $x$
- $\text{covar}_\text{emp}(x,y)$ empirische Kovarianz von $x$ und $y$
Beispiel Blutdruck¶
In [12]:
cov = 348.57
var_x = 231.13
m = cov / var_x
m
Out[12]:
1.5081123177432614
In [13]:
df.describe()
Out[13]:
Alter | Blutdruck | Größe | |
---|---|---|---|
count | 30.000000 | 30.000000 | 30.000000 |
mean | 44.800000 | 147.933333 | 176.373333 |
std | 15.202994 | 27.391080 | 5.349504 |
min | 17.000000 | 108.000000 | 165.300000 |
25% | 37.250000 | 125.250000 | 173.350000 |
50% | 45.000000 | 144.500000 | 176.650000 |
75% | 56.000000 | 173.250000 | 179.075000 |
max | 69.000000 | 199.000000 | 189.000000 |
In [14]:
xq = 44.8
In [15]:
yq = 147.93
In [16]:
b = yq - m*xq
b
Out[16]:
80.3665681651019
Blutdruckdaten: Interpretation¶
- Pro Jahr steigt der Blutdruck um 1.5$mm$Hg
- $b$ hat hier keine eigenständige Bedeutung, denn nahe $x=0$ wurden keine Daten erhoben
- Bei einem 50jährigen erwartet man einen Blutdruck von $$ 1.51 \cdot 50 + 80.4 = 155.9 $$
- Das ist absolut ungesund!
In [17]:
sns.regplot(df, x='Alter', y='Blutdruck');
Bedeutung des hellblauen Bereichs¶
seaborn
berechnet ein Konfidenzintervall für $m$ und eins für $b$- und daraus ein Konfidenzintervall für die erwarteten Werte für jedes Alter
- an den Rändern wird die Schätzung ungenauer, daher geht der Konfidenzbereich zu den Rändern hin etwas auseinander
- dasselbe für ein kleineres $\alpha$
- Achtung: der Parameter
ci
wird in % angegeben
In [18]:
sns.regplot(df, x='Alter', y='Blutdruck', ci=99.9);
seaborn
bestimmt das Konfidenzintervall mit einer nichtparametrischen Methode
Beispiel für zwei unkorrelierte Größen¶
- formal ist es auch möglich, Regressionsplot für zwei unkorrelierte Größen auszurechnen
- man glaubt, einen Zusammenhang zu sehen
- das ist ein Irrtum
- die Größe habe ich als normalverteilte Zufallsdaten an den Datensatz angefügt
In [19]:
df['Zufall'] = stats.norm().rvs(30)
In [20]:
sns.regplot(df, x='Zufall', y='Blutdruck');