Letzte Änderung am 26. February 2025 um 10:45:11

“The ‘C’ students run the world” — Harry Truman

Stand des Kapitels: Konstruktion (seit 02.2025)

Dieses Kapitel wird in den nächsten Wochen geschrieben. Ich plane zum Ende des SoSe 2025 eine neue Version des Kapitels erstellt zu haben. Während das Kapitel entsteht, funktioniert so manaches dann nicht so wie es soll.

33.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.

\[ (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 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.

Die MANOVA

Testing the Assumptions of ANOVAs

One-Way MANOVA in R

Welche Pakete gibt es eigentlich?

Das R Paket {MANOVA.RM}

Friedrich u. a. (2019)

Weitere Tutorien für die 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.

33.2 Genutzte R Pakete

Wir wollen folgende R Pakete in diesem Kapitel nutzen.

R Code [zeigen / verbergen]
pacman::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.

33.3 Daten

R Code [zeigen / verbergen]
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")
Tabelle 33.1— foo.
tinytable_dziyyaulolcr2qe0ohqh
animal weight jump_length
cat 14 24.75
cat 12.9 30.59
cat 15.8 41.64
... ... ...
fox 23.7 55.81
fox 13 32.04
fox 25.5 46.92
Abbildung 33.1— foo.
R Code [zeigen / verbergen]
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")
Tabelle 33.2— foo.
animal stage weight jump_length
cat adult 16.74 39.84
cat adult 16.79 34.42
cat adult 19.3 42.32
fox juvenile 7.3 39.72
fox juvenile 8.66 35.68
fox juvenile 8.13 38.33
Abbildung 33.2— foo.

33.4 Einfaktoriell

R Code [zeigen / verbergen]
manova(cbind(jump_length, weight) ~ animal, data = fac1_cov_tbl) |> 
  summary()
          Df  Pillai approx F num Df den Df   Pr(>F)    
animal     2 0.72364    5.953      4     42 0.000689 ***
Residuals 21                                            
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
R Code [zeigen / verbergen]
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

Das R Paket {MANOVA.RM}

Friedrich u. a. (2019)

R Code [zeigen / verbergen]
MANOVA.wide(cbind(jump_length, weight) ~ animal, data = fac1_cov_tbl,
            iter = 100) |> 
  summary()
Call: 
cbind(jump_length, weight) ~ animal

Descriptive:
  animal n jump_length  weight
1    cat 8      30.476  14.300
2    dog 8      32.909  11.425
3    fox 8      44.340  18.750

Wald-Type Statistic (WTS):
       Test statistic df  p-value 
animal "20.313"       "4" "<0.001"

modified ANOVA-Type Statistic (MATS):
       Test statistic
animal         25.707

p-values resampling:
       paramBS (WTS) paramBS (MATS)
animal "0.04"        "0.02"        

33.5 Zweifaktoriell

R Code [zeigen / verbergen]
manova(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl) |> 
  summary()
             Df  Pillai approx F num Df den Df    Pr(>F)    
animal        2 0.55007    7.967      4     84 1.706e-05 ***
stage         1 0.71783   52.151      2     41 5.439e-12 ***
animal:stage  2 0.43531    5.842      4     84 0.0003379 ***
Residuals    42                                             
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
R Code [zeigen / verbergen]
lm(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl) |> 
  Manova()

Type II MANOVA Tests: Pillai test statistic
             Df test stat approx F num Df den Df    Pr(>F)    
animal        2   0.55007    7.967      4     84 1.706e-05 ***
stage         1   0.71783   52.151      2     41 5.439e-12 ***
animal:stage  2   0.43531    5.842      4     84 0.0003379 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Das R Paket {MANOVA.RM}

Friedrich u. a. (2019)

R Code [zeigen / verbergen]
MANOVA.wide(cbind(jump_length, weight) ~ animal*stage, data = fac2_cov_tbl,
            iter = 100) |> 
  summary()
Call: 
cbind(jump_length, weight) ~ animal * stage

Descriptive:
  animal    stage n jump_length  weight
1    cat juvenile 8      20.280   5.590
2    cat    adult 8      38.360  17.199
3    dog juvenile 8      31.761   5.959
4    dog    adult 8      35.498  11.556
5    fox juvenile 8      37.102   9.304
6    fox    adult 8      40.062  14.293

Wald-Type Statistic (WTS):
             Test statistic df  p-value 
animal       "45.355"       "4" "<0.001"
stage        "106.846"      "2" "<0.001"
animal:stage "40.245"       "4" "<0.001"

modified ANOVA-Type Statistic (MATS):
             Test statistic
animal               43.924
stage               106.346
animal:stage         39.443

p-values resampling:
             paramBS (WTS) paramBS (MATS)
animal       "<0.001"      "<0.001"      
stage        "<0.001"      "<0.001"      
animal:stage "<0.001"      "<0.001"      

33.6 Post-hoc Test

R Code [zeigen / verbergen]
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.