DS3 - Vom experimentellen Design zur
explorativen Datenanalyse & Data Mining
Saskia Otto
Universität Hamburg, IMF
Wintersemester 2024/2025
y_{ij} = \alpha + \beta x_{ij} + u_j + \epsilon_{ij} u_j \sim N(0, \sigma_u^2) \epsilon \sim N(0, \sigma^2) u_1, u_2,..,u_N, \epsilon_1, \epsilon_2,..,\epsilon_N~~~\text{sind unabhängig}
y = \mathbf{X}\beta + \mathbf{Z}u + \epsilon, \quad wobei E \begin{bmatrix} u \\ \epsilon \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} \text{ und } var \begin{bmatrix} u \\ \epsilon \end{bmatrix} = \begin{bmatrix} \boldsymbol{G} & 0 \\ 0 & \boldsymbol{R} \end{bmatrix}
Krzywinski et al. (2014): Nested designs, Nature Methods 11, 977–978
Mathematische Darstellung:
y_{ijk} = \mu + \alpha_i + u_{j(i)} + \epsilon_{ijk}
aov()
ist die Effektgröße \alpha_i einer festen Faktorstufe i definiert als \bar{y}_i - \mu.u_i = (\bar{y}_i - \mu)(\frac{\sigma_u^2}{\sigma_u^2 + \sigma^2/n})
\sigma^2 = Residualvarianz; \sigma^2_u = Varianz zwischen den Gruppen, die die Korrelation zwischen den Pseudoreplikaten innerhalb jeder Gruppe einführt.
Y_{ij} = \beta_0 + \beta_1 X_{ij} + u_j + \epsilon_{ij}
Y_{ij} = (\beta_0 + u_{0j}) + (\beta_1 + u_{1j})X_i + \epsilon_{ij}
\text{AIC} = -2 \log(L) + 2 k
→ Mehr dazu in der nächsten VL zur multiplen Regression..
lmer()
Funktion aus dem Paket ‘lme4’lme()
Funktion aus dem Paket ‘nlme’ → hier vorgestellt:‘Random intercept model’ - nur 1 zufälliger Faktor (B):
Nested 2-way ANOVA - A = fest, B = zufällig (Verschachtelung definiert durch einzigartige IDs):
Nested 4-way ANOVA - A = fest, B und C und D zufällig, D nested in C, nested in B:
Regressionsmodell als ‘random intercept model’ - X = Kovariate:
‘Random intercept and slope model’ - X kommt auch in die ‘random’ Formel:
Funktion | Ausgabe |
---|---|
anova(model) |
Data frame mit den Freiheitsgraden, den F- und p-Werten der festen Effekte. |
summary(model) |
Numerische Zusammenfassung des Modells inkl. AIC-, BIC-, und log-Likelihood-Werte. |
plot(model, form) |
Ausgabe eines einzigen Plots, standardmäßig Residuen vs. gefittete Werte; form = optionale Formel, die den gewünschten Diagrammtyp angibt. |
fixed.effects(model) |
Geschätzte Parameter der festen Effekte. |
random.effects(model) |
Vorhergesagte Parameter der zufälligen Effekte. |
VarCorr(model) |
Geschätzten Varianzen, Standardabweichungen (und Korrelationen) zwischen den Termen der Zufallseffekte, Fehler-Varianz und Standardabweichung innerhalb der Gruppen (Residuen). |
\begin{align*} \text{Zellzahl} &= \text{Dosis} + \text{Fehler}\\ \text{(N - 1)} &= \text{(p - 1)} + \text{(N - p)}\\ \text{(7)} &= \text{(1)} + \text{(6)} \end{align*}
# A tibble: 24 × 5
obj_id dosis_fac ek_id_fac ek_falsch_codiert zellzahl
<int> <fct> <fct> <fct> <dbl>
1 1 0 1 1 63
2 2 0 1 1 56
3 3 0 1 1 48
4 4 0 2 2 55
5 5 0 2 2 56
6 6 0 2 2 64
7 7 0 3 3 55
8 8 0 3 3 55
9 9 0 3 3 54
10 10 0 4 4 39
11 11 0 4 4 51
12 12 0 4 4 44
13 13 100 5 1 79
14 14 100 5 1 93
15 15 100 5 1 87
16 16 100 6 2 92
17 17 100 6 2 96
18 18 100 6 2 92
19 19 100 7 3 86
20 20 100 7 3 87
21 21 100 7 3 82
22 22 100 8 4 88
23 23 100 8 4 85
24 24 100 8 4 78
Wenn die ID der Erlenmeyerkolben nicht einmalig ist
numDF denDF F-value p-value
(Intercept) 1 19 858.3768 <.0001
dosis_fac 1 19 267.1188 <.0001
Konsequenzen falscher Kodierung
# Vorhersagen für feste und zufällige Effekte berechnen
df$predictions_fixed <- predict(mod_lme, level = 0) # nur feste Effekte
df$predictions_total <- predict(mod_lme, level = 1) # feste und zufällige Effekte
ggplot(df, aes(x = dosis_fac)) +
geom_point(aes(y = zellzahl, color = "Beobachtete Werte"), size = 2) +
geom_point(aes(y = predictions_total, color = "Gesamte Vorhersage (feste + zufällige Effekte) pro EK"), size = 3) +
geom_point(aes(y = predictions_fixed, color = "Nur feste Effekte"), size = 4, shape = 1) +
labs(y = "Zellzahl", x = "Dosis", color = "Legende") +
theme_bw()
ek_id_fac = pdLogChol(1)
Variance StdDev
(Intercept) 18.60648 4.313523
Residual 25.66667 5.066228
Beispiel ist aus Kapitel 9.1 in Quinn & Keough (2002): Experimental Design and Data Analysis for Biologists
Y_{ijk} = \mu + \alpha_i + u_{j(i)} + \epsilon_{ijk}
\Rightarrow \text{Fadenalgenbedeckung}_{ijk} = \mu + \text{Seeigeldichte}_i + \text{Patch}_{j(i)} + \epsilon_{ijk}
H0_{Seeigeldichte}: \alpha_1 = \alpha_2 = .. \alpha_i = 0
H0_{Patches}: \sigma_{u}^2 = 0
'data.frame': 80 obs. of 4 variables:
$ Treatment: int 100 100 100 100 100 100 100 100 100 100 ...
$ Patch : int 1 1 1 1 1 2 2 2 2 2 ...
$ Quadrat : int 1 2 3 4 5 1 2 3 4 5 ...
$ Algae : int 0 0 0 6 2 0 0 0 0 0 ...
Beide Faktoren müssen in R als Faktor definiert sein. Der verschachtelte Faktor (hier ‘Patch’) muss für jede Stufe eine einzigartige ID haben!
Prüfen der Freiheitsgrade für ‘Treatment’:
\begin{align*} \text{Algae} &= \text{Treatment} + \text{Fehler}\\ \text{(N - 1)} &= \text{(p - 1)} + \text{(N - p)}\\ \text{(15)} &= \text{(3)} + \text{(12)} \end{align*}
→ Die Verteilung sieht nicht gut aus. Lösung: Transformation oder ein anderes Modellierungsverfahren.
# Vorhersagen für feste und zufällige Effekte berechnen
sea_urchins$predictions_fixed <- predict(lme_sea_urchins, level = 0) # nur feste Effekte
sea_urchins$predictions_total <- predict(lme_sea_urchins, level = 1) # feste+zufällige Effekte
ggplot(sea_urchins, aes(x = Treatment)) +
geom_jitter(aes(y = Algae, colour = Patch), size = 2, width = 0.05, alpha = 0.99) +
geom_point(aes(y = predictions_total, colour = Patch), size = 4, shape = 8) +
scale_colour_brewer(palette = "Set1") +
guides(colour = guide_legend(title = "Patches (hier gleich kodiert)")) +
# Folgender Befehl erlaubt eine zweite Farbskala:
ggnewscale::new_scale_color() +
geom_point(aes(y = predictions_fixed,
colour = "Fester Effekt der Seeigeldichte"), size = 5, shape = 0) +
scale_colour_manual(values = "black") +
guides(colour = guide_legend(title = "")) +
labs(y = "Algenbedeckung", x = "Seeigeldichte") +
theme_bw(base_size = 15) +
theme(legend.position = "bottom")
Berechnung der prozentualen Varianzkomponenten in der zufälligen Komponente:
Patch_unique = pdLogChol(1)
Variance StdDev
(Intercept) 294.3125 17.15554
Residual 298.6000 17.28005
Beispiel aus Sokal & Rohlf (1995): Biometry.
WH Freeman and Co., New York, NY.
'data.frame': 36 obs. of 4 variables:
$ Glycogen : int 131 130 131 125 136 142 150 148 140 143 ...
$ Treatment: int 1 1 1 1 1 1 1 1 1 1 ...
$ Rat : int 1 1 1 1 1 1 2 2 2 2 ...
$ Liver : int 1 1 2 2 3 3 1 1 2 2 ...
Pseudoreplikation wird durch Mittelung berücksichtigt:
lme_glycogen <- lme(
fixed = Glycogen ~ Treatment,
random = ~ 1 | Rat_unique/Liver_unique,
data = glycogen
)
anova(lme_glycogen)
numDF denDF F-value p-value
(Intercept) 1 18 2738.654 <.0001
Treatment 2 3 2.929 0.1971
Variance StdDev
Rat_unique = pdLogChol(1)
(Intercept) 36.06482 6.005399
Liver_unique = pdLogChol(1)
(Intercept) 14.16667 3.763863
Residual 21.16667 4.600725
[1] 50.51191 19.84201 29.64607
Variance StdDev
Rat_unique = pdLogChol(1)
(Intercept) 36.06482 6.005399
Liver_unique = pdLogChol(1)
(Intercept) 14.16667 3.763863
Residual 21.16667 4.600725
[1] 50.51191 19.84201 29.64607
Konsequenz für zukünftige Experimente
Call:
lm(formula = w_ln ~ tl_ln + loc, data = ChinookArg)
Residuals:
Min 1Q Median 3Q Max
-0.60633 -0.19351 -0.00076 0.14352 1.61286
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.12169 0.56827 -14.292 < 2e-16 ***
tl_ln 2.30492 0.12563 18.347 < 2e-16 ***
locPetrohue -0.22813 0.08013 -2.847 0.00528 **
locPuyehue -0.45699 0.09231 -4.951 2.74e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.3186 on 108 degrees of freedom
Multiple R-squared: 0.8962, Adjusted R-squared: 0.8934
F-statistic: 311 on 3 and 108 DF, p-value: < 2.2e-16
chinook_lme1 <- lme(fixed = w_ln ~ tl_ln, random = ~1 | loc, data = ChinookArg)
summary(chinook_lme1)
Linear mixed-effects model fit by REML
Data: ChinookArg
AIC BIC logLik
80.97081 91.77273 -36.48541
Random effects:
Formula: ~1 | loc
(Intercept) Residual
StdDev: 0.2187328 0.318637
Fixed effects: w_ln ~ tl_ln
Value Std.Error DF t-value p-value
(Intercept) -8.490223 0.5502014 108 -15.43112 0
tl_ln 2.336738 0.1225207 108 19.07218 0
Correlation:
(Intr)
tl_ln -0.972
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-1.8743469 -0.6029318 0.0192709 0.4386401 5.0896512
Number of Observations: 112
Number of Groups: 3
chinook_lme2 <- lme(fixed = w_ln ~ tl_ln, random = ~tl_ln | loc, data = ChinookArg)
summary(chinook_lme2)
Linear mixed-effects model fit by REML
Data: ChinookArg
AIC BIC logLik
84.97081 101.1737 -36.48541
Random effects:
Formula: ~tl_ln | loc
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 2.187328e-01 (Intr)
tl_ln 3.504195e-05 -0.001
Residual 3.186370e-01
Fixed effects: w_ln ~ tl_ln
Value Std.Error DF t-value p-value
(Intercept) -8.490223 0.5502014 108 -15.43112 0
tl_ln 2.336738 0.1225207 108 19.07218 0
Correlation:
(Intr)
tl_ln -0.972
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-1.8743469 -0.6029318 0.0192709 0.4386401 5.0896512
Number of Observations: 112
Number of Groups: 3
ChinookArg <- ChinookArg |>
mutate(
pred_ancova = predict(chinook_ancova),
pred_lme1_fixed = predict(chinook_lme1, level = 0),
pred_lme1_total = predict(chinook_lme1, level = 1)
)
# ANCOVA
p1 <- ggplot(ChinookArg, aes(x = tl_ln, y = w_ln, colour = loc)) +
geom_point() +
scale_colour_manual(values =
c("forestgreen", "orange1", "deeppink4")) +
guides(colour = "none") +
geom_line(aes(x = tl_ln, y = pred_ancova), linewidth = 1.1) +
labs(x = "ln(Länge)", y = "ln(Gewicht)",
title = "ANCOVA-Modell")
# LME1
p2 <- ggplot(ChinookArg, aes(x = tl_ln, y = w_ln, colour = loc)) +
geom_point() +
scale_colour_manual(values =
c("forestgreen", "orange1", "deeppink4")) +
guides(colour = "none") +
geom_line(aes(x = tl_ln, y = pred_lme1_fixed), colour = "black", linewidth=2) +
geom_line(aes(x = tl_ln, y = pred_lme1_total)) +
labs(x = "ln(Länge)", y = "ln(Gewicht)",
title = "LME (Random Intercept-Modell)")
gridExtra::grid.arrange(p1, p2, nrow = 1)
Revision der DS2 Fallstudien-Analysen als LME
Vorbereitung @home
Dann testen Sie doch Ihr Wissen in folgendem Abschlussquiz…
Bei weiteren Fragen: saskia.otto(at)uni-hamburg.de
Diese Arbeit is lizenziert unter einer Creative Commons Attribution-ShareAlike 4.0 International License mit Ausnahme der entliehenen und mit Quellenangabe versehenen Abbildungen.
Kurswebseite: Data Science 3