Hotellings T² (Teil 2)

Behandlung der Übungsaufgaben zu Hotellings T² mit R
Hotelling
Übungsaufgaben
Autor:in

Joao Schneider

Veröffentlichungsdatum

25. Januar 2023

Pakete

Theorie

Die drei Arten von Konfidenzintervallen für Differenzen von Mittelwerten zwischen den Gruppen \(\small A\) und \(\small B\), \(\small \mu_{iA}-\mu_{iB}\) für \(\small i=1,...,p\), besitzen eine gemeinsame Form. Diese lautet:

\[ \small \underbrace{\bar{x}_{iA}-\bar{x}_{iB}}_{\Delta} ~\pm \underbrace{\sqrt{s_i^2(\frac{n_1+n_2}{n_1n_2})}}_{SE} \cdot \underbrace{t_{krit}}_{Quantil} \]

Nur der kritische Wert muss angepasst werden. Es gilt:

  • Univariat: \(\small t_{krit}=t_{1-\alpha/2}\) mit \(\small df_t=n_1+n_2-2\) Freiheitsgraden
  • Bonferroni: \(\small t_{krit}=t_{1-\alpha/(2p)}\) mit \(\small df_t=n_1+n_2-2\) Freiheitsgraden
  • Roy: \(\small t_{krit}= \sqrt{T^2_{krit}}\) mit \(\small df_1=n_1+n_2-2\) Freiheitsgraden

Der kritische Wert für Roy-Intervalle wird über die F-Verteilung ermittelt. Und zwar gilt:

\[\small T_{krit}^2 = \frac{(n_1+n_2-2)p}{n_1+n_2-p-1}\cdot F_{1-\alpha}\] mit \(\small df_{F}=p, n_1+n_2-p\) Freiheitsgraden

Übungsaufgaben

Aufgabe 1

Aufgabe 1

In einer Untersuchung werden \(\small n_1=7\) Kinder, die einen schizophrenen Vater haben, mit \(\small n_n=9\) Kindern, deren Väter nicht schizophren sind, hinsichtlich ihrer Angst (x1) und Depression (x2) miteinander verglichen. Es mögen sich die folgenden Testwerte ergeben haben:

Vater
schizophren
Vater nicht
schizophren
Angst Depress. Angst Depress.
12 18 8 19
12 21 10 22
14 20 10 20
11 20 11 20
11 20 10 22
12 19 9 23
19 22 12 20
11 21
10 20
  1. Berechnen Sie die Mittelwerte beider Variablen pro Gruppe. Dies kann über die Menüpunkte: Analysieren -> Mittelwerte vergleichen -> Mittelwerte erfolgen. Wie groß sind die Mittelwertunterschiede?
  2. Überprüfen Sie mit der multivariaten GLM Prozedur von SPSS für ein Signifikanzniveau von 5%, ob sich die beiden Stichproben signifikant voneinander unterschieden? Sie finden die Prüfgrößen dazu in der Tabelle Multivariate Tests des SPSS Outputs.
  3. Obwohl die \(\small T^2\)-Prüfgröße von SPSS nicht berichtet wird, kann der Wert leicht aus Hotellings Spur ermittelt werden. Für \(\small T_3^2\) lautet die Formel: \(\small T_3^2 = n_1+n_2-2 \cdot Hotellings Spur\). Berechnen Sie \(\small T^2_3\) sowie die Zähler- und Nennerfreiheitsgrade des \(\small F\)-Tests.
  4. Lassen Sie von SPSS GLM die Parameter ausgeben. Wie werden die Parameter interpretiert?
  5. Führen Sie eine Dummycodierung durch, wobei die zweite Gruppe die Referenzgruppe ist. Verwenden Sie lineare Regression um Angst zu analysieren.
  6. Zu den von SPSS GLM berichteten Parametern werden auch 95% Konfidenzintervalle ausgegeben. Interpretieren Sie die Konfidenzintervalle.
  7. Berechnen Sie diese Konfidenzintervallgrenzen für die Mittelwertunterschiede “von Hand”.
  8. Ermitteln Sie multivariate 95%-Konfidenzintervalle nach Bonferroni bzw. Roy, indem Sie den kritischen Wert entsprechend verändern. Ergeben sich aus den verschiedenen Intervallen unterschiedliche Schlussfolgerungen hinsichtlich des Unterschieds zwischen den Gruppen?
  9. Verifizieren Sie die Berechnungen der simultanen Konfidenzintervalle, indem Sie folgende SPSS MANOVA Kommandos ausführen:
MANOVA X1 X2 BY GRP (1 ,2)
/ CONTRAST ( GRP )= SIMPLE
/ CINTERVAL = JOINT (0.95) MULTIVARIATE ( BONFER ).
MANOVA X1 X2 BY GRP (1 ,2)
/ CONTRAST ( GRP )= SIMPLE
/ CINTERVAL = JOINT (0.95) MULTIVARIATE ( ROY ).

Daten

Code
df_t3 <- haven::read_sav(here("data", "hotellings_T", "t3daten.sav")) %>% 
         janitor::clean_names() %>% 
         haven::zap_formats() %>% 
         haven::zap_widths() %>% 
         haven::zap_labels()

df_lng <- df_t3 %>% 
          rename(diagnosis_father = grp) %>%
          pivot_longer(cols = c(x1, x2),
                       names_to = c("test_child")) %>% 
          mutate(test_child = stringr::str_remove(test_child, "x"),
                 test_child = as.numeric(test_child),
                 test_child = factor(test_child, levels = c(1, 2), 
                                     labels = c("anxiety", "depression")),
                 diagnosis_father = factor(diagnosis_father, levels = c(1, 2), 
                                           labels = c("schizophrenic", 
                                                      "not schizophrenic")))

Teilaufgabe a

Berechnen Sie die Mittelwerte beider Variablen pro Gruppe. Wie groß sind die Mittelwertunterschiede?

df_stat <- df_lng %>% 
           group_by(test_child, diagnosis_father) %>% 
           summarise(M = mean(value),
                     SD = sd(value),
                     n = n())

df_stat
# A tibble: 4 × 5
# Groups:   test_child [2]
  test_child diagnosis_father      M    SD     n
  <fct>      <fct>             <dbl> <dbl> <int>
1 anxiety    schizophrenic      13    2.83     7
2 anxiety    not schizophrenic  10.1  1.17     9
3 depression schizophrenic      20    1.29     7
4 depression not schizophrenic  20.8  1.30     9
df_lbl <- df_stat %>% rename(father = diagnosis_father)
df_lng %>% rename(father = diagnosis_father) %>% 
           ggplot(aes(x = test_child, y = value)) + 
           geom_violin(aes(fill = test_child),
                       trim = FALSE, 
                       show.legend = FALSE, 
                       alpha = .5) +
           geom_boxplot(width = 0.1, alpha = .5) + 
           geom_point(aes(x = test_child, y = M, 
                          # shape = test_child,
                          # color = fill = test_child,
                          fill = test_child), 
                      shape = 23, #21,
                      size = 2,
                      data = df_lbl) +
           scale_fill_brewer(palette = "Accent") +
           # scale_color_brewer("mean", palette = "Accent") +
           facet_wrap(~father,
                      labeller = labeller(father=label_both)) +
           labs(# shape = "arithmetic\nmean", 
                fill = "arithmetic mean",
                x = "child: test",
                y = "test score") +
           theme_bw()

Teilaufgabe b

Überprüfen Sie mit der multivariaten GLM Prozedur von SPSS für ein Signifikanzniveau von 5%, ob sich die beiden Stichproben signifikant voneinander unterschieden? Sie finden die Prüfgrößen dazu in der Tabelle Multivariate Tests des SPSS Outputs.

mdl1 <- lm(cbind(x1, x2) ~ grp, data = df_t3)
fit1 <- Manova(mdl1) #, test.statistic = "Hotelling-Lawley")
summary(fit1)

Type II MANOVA Tests:

Sum of squares and products for error:
         x1       x2
x1 58.88889 13.22222
x2 13.22222 23.55556

------------------------------------------
 
Term: grp 

Sum of squares and products for the hypothesis:
          x1        x2
x1 32.861111 -8.847222
x2 -8.847222  2.381944

Multivariate Tests: grp
                 Df test stat approx F num Df den Df   Pr(>F)  
Pillai            1 0.4864354 6.156637      2     13 0.013148 *
Wilks             1 0.5135646 6.156637      2     13 0.013148 *
Hotelling-Lawley  1 0.9471749 6.156637      2     13 0.013148 *
Roy               1 0.9471749 6.156637      2     13 0.013148 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Teilaufgabe c

Obwohl die \(\small T^2\)-Prüfgröße von SPSS nicht berichtet wird, kann der Wert leicht aus Hotellings Spur ermittelt werden. Für \(\small T_3^2\) lautet die Formel: \(\small T_3^2 = n_1+n_2-2 \cdot Hotellings Spur\). Berechnen Sie \(\small T^2_3\) sowie die Zähler- und Nennerfreiheitsgrade des \(\small F\)-Tests.

HS <- manova(mdl1) %>% 
      summary.manova(test = "Hotelling-Lawley") %$% 
      Eigenvalues[,1]

HS
      grp 
0.9471749 
df_t3 %>% group_by(grp) %>% count() %>% 
          pivot_wider(names_from = grp, values_from = n, names_prefix = "n") %>% 
          mutate(p = ncol(.), # p = Anzahl AVs  
                 HS = HS) -> df_ni
df_ni %>% summarise(T_sq = (n1+n2-2) * HS,
                    df_1 = p,
                    df_2 = n1+n2-p-1)
# A tibble: 1 × 3
   T_sq  df_1  df_2
  <dbl> <int> <dbl>
1  13.3     2    13

Teilaufgabe d

Lassen Sie von SPSS GLM die Parameter ausgeben. Wie werden die Parameter interpretiert?

summary(mdl1)
Response x1 :

Call:
lm(formula = x1 ~ grp, data = df_t3)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.1111 -1.0278 -0.1111  0.8889  6.0000 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   15.889      1.694   9.377 2.06e-07 ***
grp           -2.889      1.034  -2.795   0.0143 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.051 on 14 degrees of freedom
Multiple R-squared:  0.3582,    Adjusted R-squared:  0.3123 
F-statistic: 7.812 on 1 and 14 DF,  p-value: 0.01432


Response x2 :

Call:
lm(formula = x2 ~ grp, data = df_t3)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.0000 -0.7778  0.0000  1.0556  2.2222 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  19.2222     1.0716   17.94 4.68e-11 ***
grp           0.7778     0.6537    1.19    0.254    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.297 on 14 degrees of freedom
Multiple R-squared:  0.09183,   Adjusted R-squared:  0.02697 
F-statistic: 1.416 on 1 and 14 DF,  p-value: 0.2539

Mittelwerte der Gruppe schizophren ergeben sich als:

  • AV Angst: Intercept + grp = 15.889 - 2.889 = 13
  • AV Depression: Intercept + grp = 19.2222 + 0.7778 = 20

grp ist dabei der Gruppenmittelwertsunterschied. Entsprechend geben sich die Mittelwerte der Gruppe nicht schizophren als:

  • AV Angst: 13 - 2.889 = 10.11
  • AV Depression: 20 + 0.7778 = 20.78

Die AV Angst unterscheidet sich demnach signifikant zwischen beiden Gruppen (p < .05), nicht aber die mittlere Ausprägung der AV Depression.

Teilaufgabe e

Führen Sie eine Dummycodierung durch, wobei die zweite Gruppe die Referenzgruppe ist. Verwenden Sie lineare Regression um Angst zu analysieren.

df_t3 <- df_t3 %>% mutate(z = if_else(grp==1,1,0))
mdl2 <- lm(x1 ~ z, data = df_t3)
summary(mdl2)

Call:
lm(formula = x1 ~ z, data = df_t3)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.1111 -1.0278 -0.1111  0.8889  6.0000 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  10.1111     0.6836  14.790 6.13e-10 ***
z             2.8889     1.0336   2.795   0.0143 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2.051 on 14 degrees of freedom
Multiple R-squared:  0.3582,    Adjusted R-squared:  0.3123 
F-statistic: 7.812 on 1 and 14 DF,  p-value: 0.01432

Teilaufgabe f

Zu den von SPSS GLM berichteten Parametern werden auch 95% Konfidenzintervalle ausgegeben. Interpretieren Sie die Konfidenzintervalle.

confint(mdl1)
                    2.5 %    97.5 %
x1:(Intercept) 12.2547567 19.523021
x1:grp         -5.1056887 -0.672089
x2:(Intercept) 16.9237952 21.520649
x2:grp         -0.6242496  2.179805

Die F-Statistik der MANOVA zeigte einen signifikanten Unterschied für mindestens eine der beiden abhängigen Variablen an, \(\small F(2, 13) = 6.16\), \(\small p <.05\). Dieser ist auf den Gruppenmittelwertsunterschied der ersten AV Angst zurückzuführen, für die Gruppenmittelwertunterschide der AV Depression konnte kein signifikanter Unterschied gezeigt werden (vgl. Output: 0 in 95%KI enthalten).

Teilaufgabe g

Berechnen Sie diese Konfidenzintervallgrenzen für die Mittelwertunterschiede “von Hand”.

Benötigt werden Differenz, Standardfehler und kriterischer t-Wert:

\[ \small \underbrace{\bar{x}_{iA}-\bar{x}_{iB}}_{\Delta} ~\pm \underbrace{\sqrt{s_i^2(\frac{n_1+n_2}{n_1n_2})}}_{SE} \cdot \underbrace{t_{krit}}_{Quantil} \]

Den Standardfehler der Mittelwertdifferenzen müssen wir wiederum erst ausrechnen, ich habe die Formel dafür in die nachfolgende Funktion eingesetzt, um etwas Arbeit zu sparen:

se_pooled <- function(n_1, n_2, SD_1, SD_2) {
                      SE <- sqrt(((n_1 - 1) * SD_1^2 + (n_2 - 1) * SD_2^2) /
                                   (n_1 + n_2 - 2)) * sqrt(1/n_1 + 1/n_2)
                      return(SE)
                      }

Mit se_pooled können wir nun das univariate KI berechnen: \(\small t_{krit}=t_{1-\alpha/2}\) mit \(\small df_t=n_1+n_2-2\) Freiheitsgraden

df_KI <- df_stat %>% 
         mutate(diagnosis_father = as.numeric(diagnosis_father)) %>% 
         pivot_wider(values_from = c(M, SD, n), 
                     names_from = diagnosis_father) %>% 
         mutate(SE = se_pooled(n_1, n_2, SD_1, SD_2),
                delta = M_1 - M_2,
                p = nrow(.),
                alpha = .05,
                t_krit = qt(p = alpha/2, 
                            df = (n_1+n_2-2), lower.tail = FALSE),
                KI_UG_univ = delta - SE * t_krit,
                KI_OG_univ = delta + SE * t_krit)

df_KI %>% select(test_child, delta, starts_with("KI"))
delta 95% KI
anxiety 2.89 0.67, 5.11
depression −0.78 −2.18, 0.62

Teilaufgabe h

Ermitteln Sie multivariate 95%-Konfidenzintervalle nach Bonferroni bzw. Roy, indem Sie den kritischen Wert entsprechend verändern. Ergeben sich aus den verschiedenen Intervallen unterschiedliche Schlussfolgerungen hinsichtlich des Unterschieds zwischen den Gruppen?

Die Konfidenzintervalle lassen sich über die oben gegebenen Formeln berechnen:

  • Bonferroni: \(\small t_{krit}=t_{1-\alpha/(2p)}\) mit \(\small df_t=n_1+n_2-2\) Freiheitsgraden
  • Roy: \(\small t_{krit}= \sqrt{T^2_{krit}}\) via F-Verteilung: \(\small T_{krit}^2 = \frac{(n_1+n_2-2)p}{n_1+n_2-p-1}\cdot F_{1-\alpha}\) mit \(\small df_{F}=p, n_1+n_2-p\) Freiheitsgraden
df_KI %>% mutate(t_krit_bonf = qt(p = alpha/(2*p), 
                                  df = (n_1+n_2-2), 
                                  lower.tail = FALSE),
                 KI_UG_bonf = delta - SE * t_krit_bonf,
                 KI_OG_bonf = delta + SE * t_krit_bonf,
                 F_krit_roy = qf(p = alpha, 
                                 lower.tail = FALSE,
                                 df1 = p, 
                                 df2 = n_1+n_2-p),
                 Tsq_krit_roy = (((n_1 + n_2 - 2)*p)/
                                 (n_1 + n_2 - p - 1))*F_krit_roy,
                 t_krit_roy = sqrt(Tsq_krit_roy),
                 KI_UG_roy = delta - SE * t_krit_roy,
                 KI_OG_roy = delta + SE * t_krit_roy) -> df_KI

df_KI %>% select(test_child, delta, starts_with("KI")) %>% 
          pivot_longer(col = starts_with("KI"),
                       names_pattern = "KI_(.*)_(.*)",
                       names_to = c("border", "type")) -> df_KI_lng

df_KI_lng %>% pivot_wider(names_from = border, values_from = value) -> df_KI_wd
delta UG OG
anxiety
univ. 2.89 0.67 5.11
bonf. 2.89 0.30 5.48
roy 2.89 −0.04 5.82
depression
univ. −0.78 −2.18 0.62
bonf. −0.78 −2.42 0.86
roy −0.78 −2.63 1.08
df_KI_wd %>% ggplot(aes(x = type, y = delta)) + 
             geom_pointrange(aes(ymin = UG, ymax = OG)) + 
             geom_hline(yintercept = 0, linetype = 3) +
             coord_flip() + 
             facet_wrap(~test_child, scales = "free_x") +
             labs(x = "CI Type") + 
             theme_bw()

Teilaufgabe i

Verifizieren Sie die Berechnungen der simultanen Konfidenzintervalle, indem Sie folgende SPSS MANOVA Kommandos ausführen:

MANOVA X1 X2 BY GRP (1 ,2)
/ CONTRAST ( GRP )= SIMPLE
/ CINTERVAL = JOINT (0.95) MULTIVARIATE ( BONFER ).
MANOVA X1 X2 BY GRP (1 ,2)
/ CONTRAST ( GRP )= SIMPLE
/ CINTERVAL = JOINT (0.95) MULTIVARIATE ( ROY ).

Aufgabe 2

Aufgabe 2

Mit der AGGREGATE-Anweisung lassen sich leicht Quadratsummen für jede der beiden Gruppen ermitteln. Die folgenden Syntaxkommandos können dazu verwendet werden:

* Mittelwerte berechnen .
AGGREGATE
/ BREAK = GRP
/M1 M2= MEAN (X1 X2 ).

* Quadrate und Kreuzprodukte berechnen .
COMPUTE Q1 =(X1 -M1 )**2.
COMPUTE Q2 =(X2 -M2 )**2.
COMPUTE Q3 =(X1 -M1 )*( X2 -M2 ).

* Quadrate und Kreuzprodukte summieren .
AGGREGATE OUTFILE =*
/ BREAK = GRP
/ D11 D22 D12 = SUM (Q1 Q2 Q3 ).
  1. Führen Sie diese Kommandos mit Hilfe der Menüs aus:
    • AGGREGATE kann über den Menüpunkt “Daten –> Aggregieren” aufgerufen werden.
    • COMPUTE kann über den Menüpunkt “Transformieren –> Variable berechnen” aufgerufen werden.
  2. Verwenden die berechneten Größen, um mit Hilfe der SPSS Matrix Sprache den \(\small T_3^2\) Wert, welcher zuvor mit Hilfe von Hotellings Spur ermittelt wurde, zu berechnen.

Teilaufgabe a

Führen Sie diese Kommandos mit Hilfe der Menüs aus:

Eine minimale Anpassung der Synatax ergibt für die \(\small \mathbf{D_1}\) Matrix:

df_1 <- filter(df_t3, grp==1)
n1 <- nrow(df_1)
X1.1 <- df_1$x1
X2.1 <- df_1$x2

M1.1 <- mean(X1.1)
M2.1 <- mean(X2.1)
M1 <- matrix(c(M1.1, M2.1))

Q1.1 <- (X1.1-M1.1)^2
Q2.1 <- (X2.1-M2.1)^2
Q3.1 <- (X1.1-M1.1)*(X2.1-M2.1)

D1 <- matrix(c(sum(Q1.1), sum(Q3.1), sum(Q3.1), sum(Q2.1)), ncol = 2)

Analog ergibt sich \(\small \mathbf{D_1}\) über:

df_2 <- filter(df_t3, grp==2)
n2 <- nrow(df_2)

X1.2 <- df_2$x1
X2.2 <- df_2$x2

M1.2 <- mean(X1.2)
M2.2 <- mean(X2.2)
M2 <- matrix(c(M1.2, M2.2))

Q1.2 <- (X1.2-M1.2)^2
Q2.2 <- (X2.2-M2.2)^2
Q3.2 <- (X1.2-M1.2)*(X2.2-M2.2)

D2 <- matrix(c(sum(Q1.2), sum(Q3.2), sum(Q3.2), sum(Q2.2)), ncol = 2)

Teilaufgabe b

Verwenden die berechneten Größen, um mit Hilfe der SPSS Matrix Sprache den \(\small T_3^2\) Wert, welcher zuvor mit Hilfe von Hotellings Spur ermittelt wurde, zu berechnen.

Mit den \(\small \mathbf{D}\)-Matrizen lassen sich die \(\small \mathbf{W}\)- und \(\small \mathbf{S}\)-Matrix berechnen:

W <- D1+D2; W
         [,1]     [,2]
[1,] 58.88889 13.22222
[2,] 13.22222 23.55556
S <- 1/(n1+n2-2) * W; S
          [,1]      [,2]
[1,] 4.2063492 0.9444444
[2,] 0.9444444 1.6825397

Damit lässt sich dann wiederum \(\small T^2_3\) wie folgt berechnen:

T3_sq <- n1*n2 / (n1+n2) * t(M1-M2) %*% solve(S) %*% (M1-M2) 
T3_sq <- T3_sq[1,1]; T3_sq
[1] 13.26045