Anova wieloczynnikowa

Challenge

Wykorzystamy zestaw danych dotyczących bólu głowy [pakiet datarium], który zawiera miary wyniku bólu epizodu migrenowego bólu głowy u 72 uczestników leczonych trzema różnymi metodami.

Wśród uczestników znalazło się 36 mężczyzn i 36 kobiet. Mężczyźni i kobiety byli dalej podzieleni w podgrupy, zależnie od tego czy byli na niskim lub wysokim ryzyku migreny.

Chcemy zrozumieć, jak każda zmienna niezależna (rodzaj zabiegów, ryzyko migreny i płeć) współdziałają w przewidywaniu wyniku bólu.

Załaduj dane i skontroluj jeden losowy rząd według kombinacji grup:

set.seed(123)
data("headache", package = "datarium")
headache %>% sample_n_by(gender, risk, treatment, size = 1)
## # A tibble: 12 × 5
##       id gender risk  treatment pain_score
##    <int> <fct>  <fct> <fct>          <dbl>
##  1    21 male   high  X               92.7
##  2    30 male   high  Y               80.1
##  3    33 male   high  Z               81.3
##  4     2 male   low   X               76.8
##  5     8 male   low   Y               80.7
##  6    18 male   low   Z               74.7
##  7    57 female high  X               68.4
##  8    65 female high  Y               82.1
##  9    70 female high  Z               80.4
## 10    42 female low   X               78.1
## 11    48 female low   Y               64.1
## 12    49 female low   Z               69.0

Wizualizacje

pudelkowy <- ggboxplot(
  headache, x = "treatment", y = "pain_score", 
  color = "risk", palette = "jco", facet.by = "gender"
  )
pudelkowy

Testy założeń

ggqqplot(headache, "pain_score", ggtheme = theme_bw()) +
  facet_grid(gender + risk ~ treatment, labeller = "label_both")

headache %>% levene_test(pain_score ~ gender*risk*treatment)
## # A tibble: 1 × 4
##     df1   df2 statistic     p
##   <int> <int>     <dbl> <dbl>
## 1    11    60     0.179 0.998

Jak widać powyżej, nie mamy problemu z brakiem normalności czy różnicą w wariancjach badanych podgrup danych.

Anova

wyniki <- headache %>% anova_test(pain_score~gender*risk*treatment)
wyniki
## ANOVA Table (type II tests)
## 
##                  Effect DFn DFd      F                 p p<.05   ges
## 1                gender   1  60 16.196 0.000163000000000     * 0.213
## 2                  risk   1  60 92.699 0.000000000000088     * 0.607
## 3             treatment   2  60  7.318 0.001000000000000     * 0.196
## 4           gender:risk   1  60  0.141 0.708000000000000       0.002
## 5      gender:treatment   2  60  3.338 0.042000000000000     * 0.100
## 6        risk:treatment   2  60  0.713 0.494000000000000       0.023
## 7 gender:risk:treatment   2  60  7.406 0.001000000000000     * 0.198

Testy post-hoc

library(emmeans)
## Warning: pakiet 'emmeans' został zbudowany w wersji R 4.2.2
parami <- headache %>%
  group_by(gender, risk) %>%
  emmeans_test(pain_score ~ treatment, p.adjust.method = "bonferroni") %>%
  select(-df, -statistic, -p) 

parami %>% filter(gender == "male", risk == "high")
## # A tibble: 3 × 8
##   gender risk  term      .y.        group1 group2      p.adj p.adj.signif
##   <chr>  <chr> <chr>     <chr>      <chr>  <chr>       <dbl> <chr>       
## 1 male   high  treatment pain_score X      Y      0.000386   ***         
## 2 male   high  treatment pain_score X      Z      0.00000942 ****        
## 3 male   high  treatment pain_score Y      Z      0.897      ns

Przeprowadzono trójczynnikową ANOVA w celu określenia wpływu płci, ryzyka i leczenia na pain_score epizodu migrenowego bólu głowy.

Istniała statystycznie istotna trójstronna interakcja między płcią, ryzykiem i leczeniem, F(2, 60) = 7,41, p = 0,001.

Istniała statystycznie istotna prosta dwukierunkowa interakcja między ryzykiem a leczeniem dla mężczyzn, F(2, 60) = 5,2, p = 0,008, ale nie dla kobiet, F(2, 60) = 2,8, p = 0,065.

Istniał statystycznie istotny prosty efekt główny leczenia dla mężczyzn z wysokim ryzykiem migreny, F(2, 60) = 14,8, p < 0,0001), ale nie dla mężczyzn z niskim ryzykiem migreny, F(2, 60) = 0,66, p = 0,521.

Wystąpiła statystycznie istotna średnia różnica między leczeniem X a leczeniem Y. Jednak różnica między leczeniem Y a leczeniem Z, nie była statystycznie istotna.

Wizualizacja Anovy

parami <- parami %>% add_xy_position(x = "treatment")
filtrowane_dane <- parami %>% filter(gender == "male", risk == "high")
pudelkowy +
  stat_pvalue_manual(
    filtrowane_dane, color = "risk", linetype = "risk", hide.ns = TRUE,
    tip.length = 0, step.increase = 0.1, step.group.by = "gender"
  ) +
  labs(
    subtitle = get_test_label(wyniki, detailed = TRUE),
    caption = get_pwc_label(parami)
    )