Dieses Kapitel wird in den nächsten Wochen geschrieben. Ich plane zum Begin des WiSe 2025/26 eine neue Version des Kapitels erstellt zu haben. Während das Kapitel entsteht, funktioniert so manches dann nicht so wie es soll.
34.1 Allgemeiner Hintergrund
Das Modell
Beginnen wir also mit der Festlegung welche Art der Analyse wir rechnen wollen. Wichtig ist hier, dass du einen normmalverteiten Messwert \(y\) vorliegen hast und ein oder mehrere Faktoren \(f\). Was sind im Kontext von R Faktoren? Ein Faktor ist eine Behandlung oder eben eine Spalte in deinem Datensatz, der verschiedene Gruppen oder Kategorien beinhaltet. Wir nennen diese Kategorien Level. In den folgenden Datenbeispielen ist die Spalte animal ein Faktor mit drei Leveln. Wir haben dort nämlich die Sprungweiten von drei Floharten gemessen. Jetzt kann es aber auch sein, dass du neben einem Faktor noch eine numeriche Kovariate \(c\) gemessen hast. Oder aber du hast zwei Messwerte, die du dann gemeinsam mit einem Faktor vergleichen willst. Diese drei Analysetypen wollen wir uns in den folgenden Tabs mal näher anschauen.
Am Ende des Kapitels schauen wir uns noch einen weiteren Spezialfall an. Nämlich den Fall, dass wir nicht nur einen Messwert \(y\) vorliegen haben sondern eben mehrere die wir simultan auswerten wollen. Das klingt jetzt erstmal etwas schräg, aber es wird dann klarer, wenn wir uns die Sachlage einmal an einem Beispiel anschauen.
\(f_A \times f_B\) gleich einem beispielhaften Interaktionsterm erster Ordnung
Die ganze multivariate Analyse ist dann etwas seltener, da wir hier dann doch schon einiges an Fallzahl brauchen, damit es dann auch einen Sinn macht. Einiges an Fallzahl heißt dann hier, dass wir dann schon mehr als sechs Beobachtungen in einer Gruppe haben sollten. Wenn du weniger hast, kann es sein, dass du keine signifikanten Unterschiede findest.
Daneben gibt es natürlich noch Spezialfälle wie die gemischte ANOVA (eng. mixed ANOVA), wenn wir Beobachtungen wiederholt messen. Dieses Modell schauen wir uns dann auch nochmal an. Der Unterschied in der Modellierung ist ein Fehlerterm (eng. Error), den wir dann nochmal mit angeben müssen. Dazu dann aber mehr in dem Kapitel zur repeated & mixed ANOVA.
Wir oben schon erwähnt, kann dieses Kapitel nicht alle Themen der ANOVA abarbeiten. Daher präsentiere ich hier eine Liste von Literatur und Links, die mich für dieses Kapitel hier inspiriert haben. Nicht alles habe ich genutzt, aber vielleicht ist für dich was dabei.
lm(cbind(jump_length, weight) ~ animal, data = fac1_cov_tbl) |>Manova()
Type II MANOVA Tests: Pillai test statistic
Df test stat approx F num Df den Df Pr(>F)
animal 2 0.72364 5.953 4 42 0.000689 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
MANOVA.wide(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl,iter =100) |>simCI(contrast ="pairwise", type ="Tukey")
#------ Call -----#
- Contrast: Tukey
- Confidence level: 95 %
#------Multivariate post-hoc comparisons: p-values -----#
contrast p.value
1 cat adult - cat juvenile 0.00
2 dog juvenile - cat juvenile 0.48
3 dog adult - cat juvenile 0.07
4 fox juvenile - cat juvenile 0.01
5 fox adult - cat juvenile 0.00
6 dog juvenile - cat adult 0.06
7 dog adult - cat adult 0.79
8 fox juvenile - cat adult 0.38
9 fox adult - cat adult 1.00
10 dog adult - dog juvenile 0.76
11 fox juvenile - dog juvenile 0.53
12 fox adult - dog juvenile 0.20
13 fox juvenile - dog adult 1.00
14 fox adult - dog adult 0.90
15 fox adult - fox juvenile 0.75
#-----------Confidence intervals for summary effects-------------#
Estimate Lower Upper
cat adult - cat juvenile 29.689 10.087149 49.2908507
dog juvenile - cat juvenile 11.850 -8.683467 32.3834674
dog adult - cat juvenile 21.184 -1.753969 44.1219690
fox juvenile - cat juvenile 20.536 3.362091 37.7099087
fox adult - cat juvenile 28.485 6.034521 50.9354791
dog juvenile - cat adult -17.839 -36.056064 0.3780644
dog adult - cat adult -8.505 -29.394916 12.3849156
fox juvenile - cat adult -9.153 -23.477151 5.1711507
fox adult - cat adult -1.204 -21.557431 19.1494313
dog adult - dog juvenile 9.334 -12.432472 31.1004721
fox juvenile - dog juvenile 8.686 -6.888724 24.2607240
fox adult - dog juvenile 16.635 -4.617127 37.8871269
fox juvenile - dog adult -0.648 -19.278598 17.9825976
fox adult - dog adult 7.301 -16.282470 30.8844696
fox adult - fox juvenile 7.949 -10.078001 25.9760007
Referenzen
Friedrich, S., Konietschke, F., & Pauly, M. (2019). Resampling-based analysis of multivariate data and repeated measures designs with the R package MANOVA. RM.
```{r echo = FALSE}#| message: false#| echo: false#| warning: falsepacman::p_load(tidyverse, readxl, knitr, kableExtra, Hmisc, plyr, patchwork, ggforce, see, sjPlot, tinytable, conflicted)set.seed(202434)conflicts_prefer(dplyr::summarise)conflicts_prefer(dplyr::summarize)conflicts_prefer(dplyr::mutate)conflicts_prefer(magrittr::set_names)```# Die MANOVA {#sec-anova-manova}*Letzte Änderung am `r format(fs::file_info("stat-tests-anova-manova.qmd")$modification_time, '%d. %B %Y um %H:%M:%S')`*> *"The 'C' students run the world" --- [Harry Truman](https://www.stormrake.com/blogs/post/the-world-is-run-by-c-students)*{fig-align="center" width="100%"}::: {.callout-caution appearance="simple"}## Stand des Kapitels: Konstruktion (seit 02.2025)Dieses Kapitel wird in den nächsten Wochen geschrieben. Ich plane zum Begin des WiSe 2025/26 eine neue Version des Kapitels erstellt zu haben. Während das Kapitel entsteht, funktioniert so manches dann nicht so wie es soll.:::## Allgemeiner Hintergrund#### Das Modell {.unnumbered .unlisted}Beginnen wir also mit der Festlegung welche Art der Analyse wir rechnen wollen. Wichtig ist hier, dass du einen normmalverteiten Messwert $y$ vorliegen hast und ein oder mehrere Faktoren $f$. Was sind im Kontext von R Faktoren? Ein Faktor ist eine Behandlung oder eben eine Spalte in deinem Datensatz, der verschiedene Gruppen oder Kategorien beinhaltet. Wir nennen diese Kategorien Level. In den folgenden Datenbeispielen ist die Spalte `animal` ein Faktor mit drei Leveln. Wir haben dort nämlich die Sprungweiten von drei Floharten gemessen. Jetzt kann es aber auch sein, dass du neben einem Faktor noch eine numeriche Kovariate $c$ gemessen hast. Oder aber du hast zwei Messwerte, die du dann gemeinsam mit einem Faktor vergleichen willst. Diese drei Analysetypen wollen wir uns in den folgenden Tabs mal näher anschauen.Am Ende des Kapitels schauen wir uns noch einen weiteren Spezialfall an. Nämlich den Fall, dass wir nicht nur einen Messwert $y$ vorliegen haben sondern eben mehrere die wir simultan auswerten wollen. Das klingt jetzt erstmal etwas schräg, aber es wird dann klarer, wenn wir uns die Sachlage einmal an einem Beispiel anschauen.$$(y_1, y_2, ..., y_j) \sim f_A + f_B + ... + f_P + f_A \times f_B $$mit- $(y_1, y_2)$ gleich der Messwerte oder Outcomes- $f_A + f_B + ... + f_P$ gleich experimenteller Faktoren- $f_A \times f_B$ gleich einem beispielhaften Interaktionsterm erster OrdnungDie ganze multivariate Analyse ist dann etwas seltener, da wir hier dann doch schon einiges an Fallzahl brauchen, damit es dann auch einen Sinn macht. Einiges an Fallzahl heißt dann hier, dass wir dann schon mehr als sechs Beobachtungen in einer Gruppe haben sollten. Wenn du weniger hast, kann es sein, dass du keine signifikanten Unterschiede findest.Daneben gibt es natürlich noch Spezialfälle wie die gemischte ANOVA (eng. *mixed ANOVA*), wenn wir Beobachtungen wiederholt messen. Dieses Modell schauen wir uns dann auch nochmal an. Der Unterschied in der Modellierung ist ein Fehlerterm (eng. *Error*), den wir dann nochmal mit angeben müssen. Dazu dann aber mehr in dem [Kapitel zur repeated & mixed ANOVA](#sec-anova-mixed).Die MANOVA[Testing the Assumptions of ANOVAs](https://cran.r-project.org/web/packages/afex/vignettes/assumptions_of_ANOVAs.html#sphericity)[One-Way MANOVA in R](https://www.datanovia.com/en/lessons/one-way-manova-in-r/)#### Welche Pakete gibt es eigentlich? {.unnumbered .unlisted}[Das R Paket `{MANOVA.RM}`](https://cran.r-project.org/web/packages/MANOVA.RM/vignettes/Introduction_to_MANOVA.RM.html)@friedrich2019resampling::: callout-tip## Weitere Tutorien für die repeated & mixed ANOVAWir oben schon erwähnt, kann dieses Kapitel nicht alle Themen der ANOVA abarbeiten. Daher präsentiere ich hier eine Liste von Literatur und Links, die mich für dieses Kapitel hier inspiriert haben. Nicht alles habe ich genutzt, aber vielleicht ist für dich was dabei.- [Repeated Measures ANOVA in R](https://www.datanovia.com/en/lessons/repeated-measures-anova-in-r/)- [Mixed ANOVA in R](https://www.datanovia.com/en/lessons/mixed-anova-in-r/)- [Master MANOVA in R: One-Way, Two-Way, & Interpretation](https://www.marsja.se/manova-in-r-one-way-two-way-analyses-interpretation/):::## Genutzte R PaketeWir wollen folgende R Pakete in diesem Kapitel nutzen.```{r echo = TRUE}#| message: false#| warning: falsepacman::p_load(tidyverse, magrittr, broom, scales, MANOVA.RM, readxl, see, car, patchwork, effectsize, conflicted)conflicts_prefer(dplyr::mutate)conflicts_prefer(dplyr::summarize)conflicts_prefer(dplyr::filter)cbbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")```An der Seite des Kapitels findest du den Link *Quellcode anzeigen*, über den du Zugang zum gesamten R-Code dieses Kapitels erhältst.## Daten```{r}fac1_cov_tbl <-read_excel("data/fleas_complex_data.xlsx", sheet ="covariate-fac1") |>select(animal, weight, jump_length) |>mutate(animal =as_factor(animal),weight =round(weight, 2),jump_length =round(jump_length, 2)) |>rownames_to_column(".id")``````{r}#| echo: false#| message: false#| warning: false#| label: tbl-fac1cov-table#| tbl-cap: "foo."repeated_raw_tbl <-read_excel("data/fleas_complex_data.xlsx", sheet ="covariate-fac1") |>mutate_if(is.numeric, round, 2)rbind(head(repeated_raw_tbl, n =3),rep("...", times =ncol(repeated_raw_tbl)),tail(repeated_raw_tbl, n =3)) |>tt(width =1, align ="c", theme ="striped")``````{r}#| message: false#| echo: false#| warning: false#| label: fig-ggplot-anova-boxplot-fac1cov#| fig-align: center#| fig-height: 3.5#| fig-width: 7#| fig-cap: "foo."fac1_cov_tbl |>ggplot(aes(x = weight, y = jump_length, color = animal,group = animal)) +theme_minimal() +geom_point() +geom_smooth(method ="lm", se =FALSE) +labs(x ="Gewicht in [mg]", y ="Sprungweite in [cm]", fill ="Flohart") +scale_color_okabeito() +theme(legend.position ="top")``````{r}fac2_cov_tbl <-read_excel("data/fleas_complex_data.xlsx", sheet ="covariate-fac2") |>select(animal, stage, weight, jump_length) |>mutate(animal =as_factor(animal),stage =factor(stage, level =c("juvenile", "adult")),weight =round(weight, 2),jump_length =round(jump_length, 2)) |>rownames_to_column(".id")``````{r}#| echo: false#| message: false#| warning: false#| label: tbl-fac2cov-table#| tbl-cap: "foo."fac2_cov_raw_tbl <-read_excel("data/fleas_complex_data.xlsx", sheet ="covariate-fac2") |>mutate_if(is.numeric, round, 2)rbind(head(fac2_cov_raw_tbl, n =3),rep("...", times =ncol(fac2_cov_raw_tbl)),tail(fac2_cov_raw_tbl, n =3)) |>kable(align ="c", "pipe")``````{r}#| message: false#| echo: false#| warning: false#| label: fig-ggplot-anova-boxplot-fac2cov#| fig-align: center#| fig-height: 3.5#| fig-width: 7#| fig-cap: "foo."ggplot(data = fac2_cov_tbl, aes(x = weight, y = jump_length, color = animal, linetype = stage)) +theme_minimal() +geom_point() +geom_smooth(method ="lm", se =FALSE) +labs(x ="Gewicht in [mg]", y ="Sprungweite in [cm]", color ="Flohart",linetype ="Entwicklungsstadium") +scale_color_okabeito() +theme(legend.position ="top")```## Einfaktoriell::: panel-tabset## `{base}````{r}manova(cbind(jump_length, weight) ~ animal, data = fac1_cov_tbl) |>summary()```## `{car}````{r}lm(cbind(jump_length, weight) ~ animal, data = fac1_cov_tbl) |>Manova()```## `{MANOVA.RM}`[Das R Paket `{MANOVA.RM}`](https://cran.r-project.org/web/packages/MANOVA.RM/vignettes/Introduction_to_MANOVA.RM.html)@friedrich2019resampling```{r}MANOVA.wide(cbind(jump_length, weight) ~ animal, data = fac1_cov_tbl,iter =100) |>summary()```:::## Zweifaktoriell::: panel-tabset## `{base}````{r}manova(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl) |>summary()```## `{car}````{r}lm(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl) |>Manova()```## `{MANOVA.RM}`[Das R Paket `{MANOVA.RM}`](https://cran.r-project.org/web/packages/MANOVA.RM/vignettes/Introduction_to_MANOVA.RM.html)@friedrich2019resampling```{r}MANOVA.wide(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl,iter =100) |>summary()```:::## Post-hoc Test```{r}MANOVA.wide(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl,iter =100) |>simCI(contrast ="pairwise", type ="Tukey")```## Referenzen {.unnumbered}