Zunächst installieren wir Pakete, die wir benötigen, um die folgenden Analysen durchzuführen.

if (!require('rstudioapi')) install.packages('rstudioapi')
if (!require('CCA')) install.packages('CCA')
if (!require('car')) install.packages('car')
if (!require('dplyr')) install.packages('dplyr')
if (!require('Hmisc')) install.packages('Hmisc')
if (!require('CCP')) install.packages('CCP')

Jetzt laden wir die installierten Pakete. Das Paket “rstudiopai” enthält die Funktion getActiveDocumentContext(), die es uns später erleichtert, das Working Directory zu setzen. Das Paket “CCA” benötigen wir, da es eine Funktion cc() enthält, mit der wir kanonische Korrelationen berechnen können. Das Paket “car” benötigen wir, da es eine Funktion namens Anova() enthält, mit der wir multivariate Varianzanalysen (MANOVAs) berechnen können. Das Paket “dplyr” benötigen wir, da wir mit den dort enthaltenen Funktionen mutate() und recode() Variablen einfach umkodieren können. Das Paket “Hmisc” benötigen wir, da wir mit der darin enthaltenen Funktion rcorr() sehr einfach Korrelationsmatrizen erstellen können. Schließlich benötigen wir noch das Paket “CCP”, da es eine Funktion namens p.asym() enthält, mit der wir Signifikanztests für kanonische Korrelationen anfordern können. 1

library(rstudioapi)
library(CCA)
library(car)
library(dplyr)
library(Hmisc)
library(CCP)

Nun schalten wir die wissenschaftliche Notation ab, um möglichst viele Nachkommastellen im Output zu erhalten (das kann vor allem für p-Werte wichtig sein, die sonst schwer zu interpretieren sind).

options(scipen=999)

Hier setzen wir das Working Directory auf den Pfad, in dem sich auch dieses Notebook befindet. Dadurch findet R alle nötigen Dateien, so lange sich diese im selben Ordner wie dieses Notebook auf Ihrem Rechner befinden.

setwd(dirname(getActiveDocumentContext()$path))

Abweichung vom Nullvektor

Wir laden den Datensatz “multivat.RData” ein (erste Zeile) und lassen ihn uns ausgeben (zweite Zeile), um ihn zu inspizieren.

load('multivat.RData')
multivat

Um uns die Mittelwerte und Standardabweichungen der Skalen des Persönlichkeitsinventars ausgeben zu lassen, können wir wieder die Funktion sapply() verwenden, die wir bereits in Kapitel 2 kennengelernt haben. Die Variablennamen, welche mit “2” enden, geben den Skalenwert zum Ende der Therapie an. Die Variablennamen, die keine “2” am Ende haben geben den Skalenwert zu Beginn der Therapie an (Siehe Buckapitel für eine übersichtlichere Tabelle mit ausgeschriebenen Variablennamen).

sapply(multivat[,4:23], mean)
##    leb    soz    lei    geh    err   aggr   bean  koerp    ges    off   leb2 
##   4.74   5.15   5.77   4.43   5.08   5.61   6.17   5.14   4.90   4.86   4.87 
##   soz2   lei2   geh2   err2  aggr2  bean2 koerp2   ges2   off2 
##   5.38   5.68   4.44   5.10   5.36   5.82   5.19   4.90   4.85
sapply(multivat[,4:23], sd)
##      leb      soz      lei      geh      err     aggr     bean    koerp 
## 2.067644 2.031942 1.895529 2.118962 2.023498 1.932680 1.896595 2.079336 
##      ges      off     leb2     soz2     lei2     geh2     err2    aggr2 
## 1.811858 1.775365 2.120868 2.111919 1.836114 2.161743 2.076808 2.027687 
##    bean2   koerp2     ges2     off2 
## 1.981633 2.028559 1.882938 1.887626

Wir wollen nun überprüfen, ob sich die Patienten zu Therapiebeginn signifikant von der Allgemeinbevölkerung (also der Population) in ihrem Persönlichkeitsprofil unterscheiden. Wir bilden nun 10 neue Variablen (die alle auf “x” enden), indem wir von jeder Originalvariable (zu Zeitpunkt 1) den Wert 5 abziehen. Wir tun dies mit der Funktion mutate() aus dem Paket “dplyr”, die es uns erlaubt, sehr leicht neue Variablen zu berechnen. Da die Variablen stanine-skaliert sind, drücken die neuen Variablen den Unterschied zwischen der jeweiligen Versuchsperson und dem Populationsmittelwert aus. Ein negativer Wert auf einer der neu gebildeten Variablen würde also bedeuten, dass die Person im Vergleich zur Population einen unterdurchschnittlichen Wert hat, ein positiver Wert hingegen, dass sie einen überdurchschnittlichen Wert hat.

multivat <- multivat %>%
  mutate(lebx = leb - 5,
         sozx = soz - 5,
         leix = lei - 5,
         gehx = geh - 5,
         errx = err - 5,
         aggrx = aggr - 5,
         beanx = bean - 5,
         koerpx = koerp - 5,
         gesx = ges - 5,
         offx = off - 5)

Um uns die späteren Analysen zu erleichtern, wollen wir nun nachschauen, in welchen Spalten die neu gebildeten Variablen liegen. Dazu nutzen wir die Funktion colnames() die uns für einen Data-Frame eine Liste mit allen Spaltennamen übergibt. Wir können sehen, dass die neu gebildeten Spaltennamen in den Spaltennummern 24 bis 33 liegen.

colnames(multivat)
##  [1] "vp"     "gr"     "gr2"    "leb"    "soz"    "lei"    "geh"    "err"   
##  [9] "aggr"   "bean"   "koerp"  "ges"    "off"    "leb2"   "soz2"   "lei2"  
## [17] "geh2"   "err2"   "aggr2"  "bean2"  "koerp2" "ges2"   "off2"   "lebx"  
## [25] "sozx"   "leix"   "gehx"   "errx"   "aggrx"  "beanx"  "koerpx" "gesx"  
## [33] "offx"

Nun wollen wir überprüfen, ob sich der Mittelwertsvektor der neu gebildeten Variablen vom Nullvektor unterscheidet. Der Mittelwertsvektor enthält in diesem Fall 10 Werte, nämlich die Mittelwerte unserer Stichproben auf allen 10 neu gebildeten Variablen (die auf “x” enden). Der Nullvektor ist ein Vektor der nur aus Nullen besteht (da wir 10 Variablen haben, also aus 10 Nullen). Zu diesem Zweck berechnen wir eine multivariate Varianzanalyse (MANOVA).

Wenn Sie sich den untenstehenden Code anschauen, haben Sie vermutlich eine ganze Reihe von Fragen, wie zum Beispiel:

Wir wollen die Frage der Reihe nach beantworten. Tatsächlich müssen wir, um eine MANOVA mit dem Paket “car” zu berechnen, im ersten Schritt eine Regression berechnen. Die Ergebnisse dieser Regression übergeben wir dann später einer weiteren Funktion (s.u.), um die MANOVA zu berechnen. Was bedeutet nun das ungewöhnliche Kriterium “as.matrix(multivat[,24:33])”? Wir übergeben der Funktion lm() hier nicht nur eine Kriteriumsvariable, sondern gleich 10 Kriteriumsvariablen. Nämlich die Spalten mit den Nummern 24 bis 33 aus unserem Datensatz “multivat”. Wie wir vorher bestimmt haben, sind das unsere 10 neu gebildeten Variablen, die die Abweichung vom Populationsmittelwert darstellen. Da die Funktion lm() jedoch nicht mit Data-Frames als Kriterium rechnen kann, sondern maximal mit Matrizen, müssen wir die 10 Spalten unseres Data-Frames noch mit der Funktion as.matrix() in eine Matrix umwandeln. Was bedeutet nun die 1 als Prädiktor? Diese 1 bedeutet, dass wir keinen Prädiktor haben, dass wir also nur das Intercept unserer Regression schätzen möchten. Hat man keine Prädiktoren, entspricht das Intercept der Regression dem Mittelwert der Variablen. Da wir hier 10 Variablen als Kriterium haben, erhalten wir 10 Gewichte für das Intercept, jedes Gewicht entspricht dem Mittelwert einer der 10 Variablen. Diese 10 Gewichte (bzw. Mittelwerte) können wir uns ausgeben lassen, wenn wir (in der untenstehenden zweiten Zeile) einfach die Ergebnisse ohne die Funktion summary(), die wir sonst immer benutzt haben, ausgeben lassen. Die 10 ausgegebenen Gewichte des Intercepts entsprechen also dem oben eingeführten Mittelwertsvektor.

reg_intercept <- lm(formula = as.matrix(multivat[,24:33]) ~ 1, data = multivat)
reg_intercept
## 
## Call:
## lm(formula = as.matrix(multivat[, 24:33]) ~ 1, data = multivat)
## 
## Coefficients:
##              lebx   sozx   leix   gehx   errx   aggrx  beanx  koerpx  gesx 
## (Intercept)  -0.26   0.15   0.77  -0.57   0.08   0.61   1.17   0.14   -0.10
##              offx 
## (Intercept)  -0.14

Wie oben bereits angekündigt, übergeben wir die Ergebnisse unserer oben gerechneten Regression (die wir in das Objekt namens “reg_intercept”) gepackt haben, der Funktion Anova() aus dem Paket “car”. Die Funktion car benötigt nämlich einerseits den Vektor der Regressionsgewichte (also in diesem Fall den Mittelwertsvektor) und die ebenfalls in den Ergebnissen gespeicherten Residuen, um die MANOVA rechnen zu können. Sie fragen sich nun zurecht, warum die Funktion “Anova” heißt, wo wir doch eine MANOVA rechnen wollen. Das liegt ganz einfach daran, dass die Funktion erkennt, dass wir nicht nur eine, sondern mehrere abhängige Variablen in unserem Regressionsmodell haben und dann automatisch eine MANOVA rechnet. Wir packen die Ergebnisse der MANOVA dann mittels des Pfeiloperators in ein Objekt namens “manova_nullvektor” und lassen uns mit der Funktion summary() die in diesem Objekt gespeicherten Ergebnisse ausgeben.

manova_nullvektor <- Anova(reg_intercept)
## Note: model has only an intercept; equivalent type-III tests substituted.
summary(manova_nullvektor)
## 
## Type III MANOVA Tests:
## 
## Sum of squares and products for error:
##          lebx   sozx   leix   gehx   errx  aggrx   beanx koerpx   gesx   offx
## lebx   423.24  18.90  -4.98 -25.82 -36.92   2.86   24.42 -12.36    0.4 -28.64
## sozx    18.90 408.75  13.45   0.55 -12.20   4.85  -68.55 -33.10   28.5  13.10
## leix    -4.98  13.45 355.71 105.89 -16.16   0.03   23.91   0.22  -24.3 -15.22
## gehx   -25.82   0.55 105.89 444.51 -15.44  37.77   39.69 -46.02  -30.7 -32.98
## errx   -36.92 -12.20 -16.16 -15.44 405.36  -8.88   -3.36  42.88   21.8  20.12
## aggrx    2.86   4.85   0.03  37.77  -8.88 369.79   33.63  -4.54  -60.9  -2.46
## beanx   24.42 -68.55  23.91  39.69  -3.36  33.63  356.11 -39.38 -112.3  15.38
## koerpx -12.36 -33.10   0.22 -46.02  42.88  -4.54  -39.38 428.04   12.4   7.96
## gesx     0.40  28.50 -24.30 -30.70  21.80 -60.90 -112.30  12.40  325.0 -66.40
## offx   -28.64  13.10 -15.22 -32.98  20.12  -2.46   15.38   7.96  -66.4 312.04
## 
## ------------------------------------------
##  
## Term: (Intercept) 
## 
## Sum of squares and products for the hypothesis:
##          lebx  sozx   leix   gehx  errx  aggrx  beanx koerpx  gesx   offx
## lebx     6.76 -3.90 -20.02  14.82 -2.08 -15.86 -30.42  -3.64   2.6   3.64
## sozx    -3.90  2.25  11.55  -8.55  1.20   9.15  17.55   2.10  -1.5  -2.10
## leix   -20.02 11.55  59.29 -43.89  6.16  46.97  90.09  10.78  -7.7 -10.78
## gehx    14.82 -8.55 -43.89  32.49 -4.56 -34.77 -66.69  -7.98   5.7   7.98
## errx    -2.08  1.20   6.16  -4.56  0.64   4.88   9.36   1.12  -0.8  -1.12
## aggrx  -15.86  9.15  46.97 -34.77  4.88  37.21  71.37   8.54  -6.1  -8.54
## beanx  -30.42 17.55  90.09 -66.69  9.36  71.37 136.89  16.38 -11.7 -16.38
## koerpx  -3.64  2.10  10.78  -7.98  1.12   8.54  16.38   1.96  -1.4  -1.96
## gesx     2.60 -1.50  -7.70   5.70 -0.80  -6.10 -11.70  -1.40   1.0   1.40
## offx     3.64 -2.10 -10.78   7.98 -1.12  -8.54 -16.38  -1.96   1.4   1.96
## 
## Multivariate Tests: (Intercept)
##                  Df test stat approx F num Df den Df          Pr(>F)    
## Pillai            1 0.4855747 8.495252     10     90 0.0000000013227 ***
## Wilks             1 0.5144253 8.495252     10     90 0.0000000013227 ***
## Hotelling-Lawley  1 0.9439169 8.495252     10     90 0.0000000013227 ***
## Roy               1 0.9439169 8.495252     10     90 0.0000000013227 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wir wir sehen, bekommen wir zunächst eine Warnmeldung, dass unser Modell nur ein Intercept hat und keine unabhängigen Variablen. Das ist aber genau das, was wir in diesem Fall haben möchten, denn wir wollen ja überprüfen, ob sich der Mittelwertsvektor vom Nullvektor unterscheidet. Danach findet sich eine dreigeteilte Ausgabe. Wir fangen hier einmal in umgekehrter Reihenfolge an, die Ausgabe zu erklären:

Falls Sie vor allem den letzten beiden Punkten nicht gut folgen konnten: Keine Sorge! Es ist nicht entscheidend, dass Sie wissen, wie genau die einzelnen Werte in den Matrizen berechnet werden. Wir werden an dieser Stelle auch nicht erklären, wie auf Basis dieser Matrizen letztlich die MANOVA berechnet wird, weil dies Grundkentnisse in linearer Algebra (also den Rechenregeln mit Matrizen) voraussetzt.

Sie sollten lediglich wissen, welche Informationen in den beiden Matrizen jeweils implizit gespeichert sind:

Wir wollen nun noch überprüfen, in welchen Einzelvariablen Unterschiede zwischen unserer Stichprobe und der Population bestehen. Dies können wir einfach bewerkstelligen, indem wir der Funktion summary() zusätzlich noch das Argument “univariate = TRUE” übergeben.

summary(manova_nullvektor, univariate = TRUE)
## 
## Type III MANOVA Tests:
## 
## Sum of squares and products for error:
##          lebx   sozx   leix   gehx   errx  aggrx   beanx koerpx   gesx   offx
## lebx   423.24  18.90  -4.98 -25.82 -36.92   2.86   24.42 -12.36    0.4 -28.64
## sozx    18.90 408.75  13.45   0.55 -12.20   4.85  -68.55 -33.10   28.5  13.10
## leix    -4.98  13.45 355.71 105.89 -16.16   0.03   23.91   0.22  -24.3 -15.22
## gehx   -25.82   0.55 105.89 444.51 -15.44  37.77   39.69 -46.02  -30.7 -32.98
## errx   -36.92 -12.20 -16.16 -15.44 405.36  -8.88   -3.36  42.88   21.8  20.12
## aggrx    2.86   4.85   0.03  37.77  -8.88 369.79   33.63  -4.54  -60.9  -2.46
## beanx   24.42 -68.55  23.91  39.69  -3.36  33.63  356.11 -39.38 -112.3  15.38
## koerpx -12.36 -33.10   0.22 -46.02  42.88  -4.54  -39.38 428.04   12.4   7.96
## gesx     0.40  28.50 -24.30 -30.70  21.80 -60.90 -112.30  12.40  325.0 -66.40
## offx   -28.64  13.10 -15.22 -32.98  20.12  -2.46   15.38   7.96  -66.4 312.04
## 
## ------------------------------------------
##  
## Term: (Intercept) 
## 
## Sum of squares and products for the hypothesis:
##          lebx  sozx   leix   gehx  errx  aggrx  beanx koerpx  gesx   offx
## lebx     6.76 -3.90 -20.02  14.82 -2.08 -15.86 -30.42  -3.64   2.6   3.64
## sozx    -3.90  2.25  11.55  -8.55  1.20   9.15  17.55   2.10  -1.5  -2.10
## leix   -20.02 11.55  59.29 -43.89  6.16  46.97  90.09  10.78  -7.7 -10.78
## gehx    14.82 -8.55 -43.89  32.49 -4.56 -34.77 -66.69  -7.98   5.7   7.98
## errx    -2.08  1.20   6.16  -4.56  0.64   4.88   9.36   1.12  -0.8  -1.12
## aggrx  -15.86  9.15  46.97 -34.77  4.88  37.21  71.37   8.54  -6.1  -8.54
## beanx  -30.42 17.55  90.09 -66.69  9.36  71.37 136.89  16.38 -11.7 -16.38
## koerpx  -3.64  2.10  10.78  -7.98  1.12   8.54  16.38   1.96  -1.4  -1.96
## gesx     2.60 -1.50  -7.70   5.70 -0.80  -6.10 -11.70  -1.40   1.0   1.40
## offx     3.64 -2.10 -10.78   7.98 -1.12  -8.54 -16.38  -1.96   1.4   1.96
## 
## Multivariate Tests: (Intercept)
##                  Df test stat approx F num Df den Df          Pr(>F)    
## Pillai            1 0.4855747 8.495252     10     90 0.0000000013227 ***
## Wilks             1 0.5144253 8.495252     10     90 0.0000000013227 ***
## Hotelling-Lawley  1 0.9439169 8.495252     10     90 0.0000000013227 ***
## Roy               1 0.9439169 8.495252     10     90 0.0000000013227 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Type III Sums of Squares
##             df   lebx   sozx   leix   gehx   errx  aggrx  beanx koerpx gesx
## (Intercept)  1   6.76   2.25  59.29  32.49   0.64  37.21 136.89   1.96    1
## residuals   99 423.24 408.75 355.71 444.51 405.36 369.79 356.11 428.04  325
##               offx
## (Intercept)   1.96
## residuals   312.04
## 
##  F-tests
##             lebx sozx leix gehx errx aggrx beanx koerpx gesx offx
## (Intercept) 1.58 0.54 16.5 7.24 0.16  9.96 38.06   0.45  0.3 0.62
## 
##  p-values
##             lebx      sozx      leix           gehx      errx      aggrx    
## (Intercept) 0.2115418 0.4621332 0.000097411980 0.0083872 0.6934316 0.0021179
##             beanx          koerpx    gesx      offx     
## (Intercept) 0.000000015073 0.5023303 0.5822471 0.4322474

Wie Sie sehen, wurde unserem Output jetzt noch ein weiterer Teil unten hinzugefügt, welcher F-Werte und p-Niveaus für die einzelnen Variablen enthält. Da wir aber keine spezifischen Hypothesen hatten, in welchen Variablen genau Unterschiede bestehen, sollten wir eine Korrektur des Alpha-Niveaus durchführen, da es sonst bei der Durchführung von 10 t-Tests zu einer Akkumulation des Alpha-Fehlers kommt. Machen Sie sich klar: Würden wir 20 t-Tests ohne Adjustierung des Alpha-Niveaus durchführen, wäre erwartungsgemäß einer dieser t-Tests zufälligerweise signifikant.

Die Adujstierung des Alpha-Niveaus mit der Bonferroni-Holm Korrektur (siehe Buchkapitel für Details) lässt sich auch leicht bewerkstelligen, indem wir der Funktion summary() zusätzlich noch das Argument “p.adjust.method = ‘holm’” übergeben.

summary(manova_nullvektor, univariate = TRUE, p.adjust.method = 'holm')
## 
## Type III MANOVA Tests:
## 
## Sum of squares and products for error:
##          lebx   sozx   leix   gehx   errx  aggrx   beanx koerpx   gesx   offx
## lebx   423.24  18.90  -4.98 -25.82 -36.92   2.86   24.42 -12.36    0.4 -28.64
## sozx    18.90 408.75  13.45   0.55 -12.20   4.85  -68.55 -33.10   28.5  13.10
## leix    -4.98  13.45 355.71 105.89 -16.16   0.03   23.91   0.22  -24.3 -15.22
## gehx   -25.82   0.55 105.89 444.51 -15.44  37.77   39.69 -46.02  -30.7 -32.98
## errx   -36.92 -12.20 -16.16 -15.44 405.36  -8.88   -3.36  42.88   21.8  20.12
## aggrx    2.86   4.85   0.03  37.77  -8.88 369.79   33.63  -4.54  -60.9  -2.46
## beanx   24.42 -68.55  23.91  39.69  -3.36  33.63  356.11 -39.38 -112.3  15.38
## koerpx -12.36 -33.10   0.22 -46.02  42.88  -4.54  -39.38 428.04   12.4   7.96
## gesx     0.40  28.50 -24.30 -30.70  21.80 -60.90 -112.30  12.40  325.0 -66.40
## offx   -28.64  13.10 -15.22 -32.98  20.12  -2.46   15.38   7.96  -66.4 312.04
## 
## ------------------------------------------
##  
## Term: (Intercept) 
## 
## Sum of squares and products for the hypothesis:
##          lebx  sozx   leix   gehx  errx  aggrx  beanx koerpx  gesx   offx
## lebx     6.76 -3.90 -20.02  14.82 -2.08 -15.86 -30.42  -3.64   2.6   3.64
## sozx    -3.90  2.25  11.55  -8.55  1.20   9.15  17.55   2.10  -1.5  -2.10
## leix   -20.02 11.55  59.29 -43.89  6.16  46.97  90.09  10.78  -7.7 -10.78
## gehx    14.82 -8.55 -43.89  32.49 -4.56 -34.77 -66.69  -7.98   5.7   7.98
## errx    -2.08  1.20   6.16  -4.56  0.64   4.88   9.36   1.12  -0.8  -1.12
## aggrx  -15.86  9.15  46.97 -34.77  4.88  37.21  71.37   8.54  -6.1  -8.54
## beanx  -30.42 17.55  90.09 -66.69  9.36  71.37 136.89  16.38 -11.7 -16.38
## koerpx  -3.64  2.10  10.78  -7.98  1.12   8.54  16.38   1.96  -1.4  -1.96
## gesx     2.60 -1.50  -7.70   5.70 -0.80  -6.10 -11.70  -1.40   1.0   1.40
## offx     3.64 -2.10 -10.78   7.98 -1.12  -8.54 -16.38  -1.96   1.4   1.96
## 
## Multivariate Tests: (Intercept)
##                  Df test stat approx F num Df den Df          Pr(>F)    
## Pillai            1 0.4855747 8.495252     10     90 0.0000000013227 ***
## Wilks             1 0.5144253 8.495252     10     90 0.0000000013227 ***
## Hotelling-Lawley  1 0.9439169 8.495252     10     90 0.0000000013227 ***
## Roy               1 0.9439169 8.495252     10     90 0.0000000013227 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Type III Sums of Squares
##             df   lebx   sozx   leix   gehx   errx  aggrx  beanx koerpx gesx
## (Intercept)  1   6.76   2.25  59.29  32.49   0.64  37.21 136.89   1.96    1
## residuals   99 423.24 408.75 355.71 444.51 405.36 369.79 356.11 428.04  325
##               offx
## (Intercept)   1.96
## residuals   312.04
## 
##  F-tests
##             lebx sozx leix gehx errx aggrx beanx koerpx gesx offx
## (Intercept) 1.58 0.54 16.5 7.24 0.16  9.96 38.06   0.45  0.3 0.62
## 
##  p-values
##             lebx      sozx      leix           gehx      errx      aggrx    
## (Intercept) 0.2115418 0.4621332 0.000097411980 0.0083872 0.6934316 0.0021179
##             beanx          koerpx    gesx      offx     
## (Intercept) 0.000000015073 0.5023303 0.5822471 0.4322474
## 
##  p-values adjusted (by term) for simultaneous inference by holm method
##             lebx       sozx       leix       gehx       errx       aggrx     
## (Intercept) 1.00000000 1.00000000 0.00087671 0.05871038 1.00000000 0.01694286
##             beanx         koerpx     gesx       offx      
## (Intercept) 0.00000015073 1.00000000 1.00000000 1.00000000

Wir sehen, dass uns nun zusätzlich zu den unkorrigierten p-Werten Bonferroni-Holm korrigierte p-Werte ausgegeben wurden. Der qualitative Schluss bleibt jedoch unverändert, dass signifikante Unterschiede auf den Variablen leix, gehx, aggrx und beanx bestehen.

Illustration des Zusammenhangs zwischen der Korrelation von Variablen und dem Ergebnis der MANOVA

Wie wir oben (und im Buchkapitel) bereits ausgeführt haben, hängt das Ergebnis einer MANOVA maßgeblich davon ab,

Wir wollen dies anhand des Datensatzes “wilkslambda” tun, den wir hier einlesen und uns anzeigen lassen.

load('wilkslambda.RData')
wilkslambda

Wie wir sehen, enthält der Datensatz die Werte von sechs Versuchspersonen. Die Variablen AGGRx und BEANx kennen wir bereits. Sie bilden die Abweichung der Versuchspersonen vom Populationsmittelwert auf den Variablen Aggresivität und Beanspruchung ab. Die Variablen BEANx2 und BEANx3 wurden gebildet, indem die bestehenden Werte der Variablen BEANx unter den Versuchspersonen so vertauscht wurden, dass die resultierenden Variablen maximal positiv (BEANx2) oder negativ (BEANx3) mit AGGRx korrelieren.

Mit der Funktion sapply(), die wir bereits mehrfach kennengelernt haben, lassen wir uns die Mittelwerte aller vier Variablen ausgeben. Wir sehen, dass alle BEAN-Variablen den gleichen positiven Mittelwert haben. Dies ist nicht überraschend, da ja alle drei Variablen die gleichen Einzelwerte aufweisen. Der Mittelwert der Variable AGGRx ist auch positiv. Somit sind die Mittelwerte von AGGRx auf der einen Seite und der BEAN Variablen auf der anderen Seite gleichsinnig.

sapply(X = wilkslambda, FUN = mean)
##    AGGRx    BEANx   BEANx2   BEANx3 
## 1.833333 1.666667 1.666667 1.666667

Wir wollen uns nun auch noch einmal die Korrelationen der Variablen untereinader mittels der Funktion rcorr() aus dem Paket “Hmisc” anschauen.

rcorr(as.matrix(wilkslambda))
##        AGGRx BEANx BEANx2 BEANx3
## AGGRx   1.00  0.04   0.92  -0.96
## BEANx   0.04  1.00   0.09  -0.11
## BEANx2  0.92  0.09   1.00  -0.96
## BEANx3 -0.96 -0.11  -0.96   1.00
## 
## n= 6 
## 
## 
## P
##        AGGRx  BEANx  BEANx2 BEANx3
## AGGRx         0.9412 0.0089 0.0022
## BEANx  0.9412        0.8699 0.8376
## BEANx2 0.0089 0.8699        0.0028
## BEANx3 0.0022 0.8376 0.0028

Wir sehen, dass die Variable BEANx unkorreliert mit der Variable AGGRx ist. Die Variable BEANx2 ist stark positiv, die Variable BEANx3 stark negativ mit AGGRx korreliert.

Nun rechnen wir drei MANOVAS, bei denen wir die Abweichung von jeweils zwei Variablen (AGGRx und einer der BEAN Variablen) vom Nullvektor testen. Wie wir oben bereits gesehen haben, müssen wir im ersten Schritt für jede der drei MANOVAs zunächst eine Regression fitten, was wir mit untenstehendem Code tun.

reg_x <- lm(formula = as.matrix(wilkslambda[, 1:2]) ~ 1, data = wilkslambda)
reg_x2 <- lm(formula = as.matrix(wilkslambda[, c(1,3)]) ~ 1, data = wilkslambda)
reg_x3 <- lm(formula = as.matrix(wilkslambda[, c(1,4)]) ~ 1, data = wilkslambda)

Nun rechnen wir zunächst die MANOVA mit den beiden unkorrelierten Variablen AGGRx und BEANx. Wir sehen, dass hier die Größe von Wilks Lamda .33 entspricht, was mit einem p-Wert von \(p = 0.106\) assoziiert ist. Der Mittelwertsvektor der beiden Variablen weicht also nicht signifikant vom Nullvektor ab.

manova_x <- Anova(reg_x)
## Note: model has only an intercept; equivalent type-III tests substituted.
summary(manova_x)
## 
## Type III MANOVA Tests:
## 
## Sum of squares and products for error:
##            AGGRx      BEANx
## AGGRx 18.8333333  0.6666667
## BEANx  0.6666667 15.3333333
## 
## ------------------------------------------
##  
## Term: (Intercept) 
## 
## Sum of squares and products for the hypothesis:
##          AGGRx    BEANx
## AGGRx 20.16667 18.33333
## BEANx 18.33333 16.66667
## 
## Multivariate Tests: (Intercept)
##                  Df test stat approx F num Df den Df  Pr(>F)
## Pillai            1 0.6749342 4.152601      2      4 0.10567
## Wilks             1 0.3250658 4.152601      2      4 0.10567
## Hotelling-Lawley  1 2.0763006 4.152601      2      4 0.10567
## Roy               1 2.0763006 4.152601      2      4 0.10567

Nun rechnen wir die MANOVA mit den stark positiv korrelierten Variablen AGGRx und BEANx2. Wir sehen, dass das Wilks Lamda nun mit .47 deutlich größer ist. Da Wilks Lamda als Fehlervarianz interpretiert werden kann, ist dementsprechend das assoziierte p-Niveau deutlich größer als vorher, \(p = .222\).

manova_x2 <- Anova(reg_x2)
## Note: model has only an intercept; equivalent type-III tests substituted.
summary(manova_x2)
## 
## Type III MANOVA Tests:
## 
## Sum of squares and products for error:
##           AGGRx   BEANx2
## AGGRx  18.83333 15.66667
## BEANx2 15.66667 15.33333
## 
## ------------------------------------------
##  
## Term: (Intercept) 
## 
## Sum of squares and products for the hypothesis:
##           AGGRx   BEANx2
## AGGRx  20.16667 18.33333
## BEANx2 18.33333 16.66667
## 
## Multivariate Tests: (Intercept)
##                  Df test stat approx F num Df den Df  Pr(>F)
## Pillai            1 0.5289855 2.246154      2      4 0.22185
## Wilks             1 0.4710145 2.246154      2      4 0.22185
## Hotelling-Lawley  1 1.1230769 2.246154      2      4 0.22185
## Roy               1 1.1230769 2.246154      2      4 0.22185

Schließlich rechnen wir die MANOVA mit den stark negativ korrelierten Variablen AGGRx und BEANx3. Wir sehen, dass das Wilks Lamda nun mit .02 deutlich kleiner ist. Der assoziierte p-Wert ist nun signifikant, \(p < .001\).

manova_x3 <- Anova(reg_x3)
## Note: model has only an intercept; equivalent type-III tests substituted.
summary(manova_x3)
## 
## Type III MANOVA Tests:
## 
## Sum of squares and products for error:
##            AGGRx    BEANx3
## AGGRx   18.83333 -16.33333
## BEANx3 -16.33333  15.33333
## 
## ------------------------------------------
##  
## Term: (Intercept) 
## 
## Sum of squares and products for the hypothesis:
##           AGGRx   BEANx3
## AGGRx  20.16667 18.33333
## BEANx3 18.33333 16.66667
## 
## Multivariate Tests: (Intercept)
##                  Df test stat approx F num Df den Df     Pr(>F)    
## Pillai            1   0.98232 111.0909      2      4 0.00031276 ***
## Wilks             1   0.01768 111.0909      2      4 0.00031276 ***
## Hotelling-Lawley  1  55.54545 111.0909      2      4 0.00031276 ***
## Roy               1  55.54545 111.0909      2      4 0.00031276 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Anhand dieses Beispiels können wir also sehen, dass das Erebnis einer MANOVA bei gleichsinnigen Variablensets (deren Mittelwerte beide positiv oder beide negativ sind) eher signifikant ausfällt, je negativer die Korrelation zwischen den Variablen ist (siehe Buchkapitel für mehr Details).

Unterschied zweier Vektoren

Wir wollen nun überprüfen, ob sich das Persönlichkeitsprofil der Patienten im Laufe der Therapie signifikant verändert. Dazu berechnen wir zunächst Differenzvariablen für jede Skala, indem wir den Wert der Patienten zu Therapiebeginn vom Wert der Patienten zum Therapieende abziehen. Wir nutzen dazu wieder die Funktion mutate() aus dem Paket “dplyr”.

multivat <- multivat %>%
  mutate(dleb = leb2 - leb,
         dsoz = soz2 - soz,
         dlei = lei2 - lei,
         dgeh = geh2 - geh,
         derr = err2 - err,
         daggr = aggr2 - aggr,
         dbean = bean2 - bean,
         dkoerp = koerp2 - koerp,
         dges = ges2 - ges,
         doff = off2 - off)

Wir nutzen wieder die Funktion colnames(), um zu überprüfen, welche Spaltennummern die neu gebildeten Variablen haben. Wie wir sehen können, befinden sich die neu gebildeten Variablen in den Spalten 34 bis 43.

colnames(multivat)
##  [1] "vp"     "gr"     "gr2"    "leb"    "soz"    "lei"    "geh"    "err"   
##  [9] "aggr"   "bean"   "koerp"  "ges"    "off"    "leb2"   "soz2"   "lei2"  
## [17] "geh2"   "err2"   "aggr2"  "bean2"  "koerp2" "ges2"   "off2"   "lebx"  
## [25] "sozx"   "leix"   "gehx"   "errx"   "aggrx"  "beanx"  "koerpx" "gesx"  
## [33] "offx"   "dleb"   "dsoz"   "dlei"   "dgeh"   "derr"   "daggr"  "dbean" 
## [41] "dkoerp" "dges"   "doff"

Wie oben berechnen wir wieder eine Regression der neu gebildeten Variablen, ohne jedoch einen Prädiktor in das Modell aufzunehmen. Wir erhalten als Gewichte für die Konstante wieder den Mittelwertsvektor der neu gebildeten Variablen.

reg_diff <- lm(formula = as.matrix(multivat[,34:43]) ~ 1, data = multivat)
reg_diff
## 
## Call:
## lm(formula = as.matrix(multivat[, 34:43]) ~ 1, data = multivat)
## 
## Coefficients:
##              dleb                      dsoz                    
## (Intercept)   0.129999999999999976685   0.230000000000000065503
##              dlei                      dgeh                    
## (Intercept)  -0.089999999999999996669   0.010000000000000001943
##              derr                      daggr                   
## (Intercept)   0.019999999999999996947  -0.250000000000000222045
##              dbean                     dkoerp                  
## (Intercept)  -0.350000000000000199840   0.050000000000000044409
##              dges                      doff                    
## (Intercept)   0.000000000000000002776  -0.010000000000000001943

Ebenfalls analog zu den obigen Analysen übergeben wir die Ergebnisse der Regression (die im Objekt “reg_diff” gespeichert sind) wieder der Funktion Anova() aus dem Paket “car”.

manova_diffvektor <- Anova(reg_diff)
## Note: model has only an intercept; equivalent type-III tests substituted.
summary(manova_diffvektor)
## 
## Type III MANOVA Tests:
## 
## Sum of squares and products for error:
##         dleb  dsoz  dlei                      dgeh  derr daggr dbean dkoerp
## dleb   31.31 -3.99  4.17  0.8700000000000015498713 -1.26 -1.75 -6.45  -0.65
## dsoz   -3.99 31.71  0.07 -6.2299999999999995381472 -0.46  0.75 -2.95   0.85
## dlei    4.17  0.07 30.19  0.0900000000000025501823  1.18 -7.25 -2.15  -1.55
## dgeh    0.87 -6.23  0.09 20.9899999999999877786649  0.98  0.25 -0.65   2.95
## derr   -1.26 -0.46  1.18  0.9799999999999990940580 29.96  2.50 -3.30  -0.10
## daggr  -1.75  0.75 -7.25  0.2500000000000014432899  2.50 28.75  1.25  -2.75
## dbean  -6.45 -2.95 -2.15 -0.6500000000000009103829 -3.30  1.25 30.75   0.75
## dkoerp -0.65  0.85 -1.55  2.9500000000000041744386 -0.10 -2.75  0.75  32.75
## dges   -5.00  1.00 -1.00  0.0000000000000001141991  5.00 -3.00 -1.00   2.00
## doff    3.13 -2.77 -1.09  0.0100000000000004113376 -0.98  2.75  0.65   4.05
##                             dges  doff
## dleb   -5.0000000000000000000000  3.13
## dsoz    1.0000000000000004440892 -2.77
## dlei   -0.9999999999999997779554 -1.09
## dgeh    0.0000000000000001141991  0.01
## derr    5.0000000000000000000000 -0.98
## daggr  -3.0000000000000000000000  2.75
## dbean  -0.9999999999999998889777  0.65
## dkoerp  1.9999999999999997779554  4.05
## dges   24.0000000000000000000000  1.00
## doff    0.9999999999999995559108 30.99
## 
## ------------------------------------------
##  
## Term: (Intercept) 
## 
## Sum of squares and products for the hypothesis:
##                              dleb                       dsoz
## dleb    1.68999999999999950262008  2.99000000000000065725203
## dsoz    2.99000000000000021316282  5.29000000000000270006240
## dlei   -1.16999999999999970690112 -2.07000000000000072830630
## dgeh    0.13000000000000000444089  0.23000000000000012101431
## derr    0.25999999999999989785948  0.46000000000000007549517
## daggr  -3.25000000000000222044605 -5.75000000000000621724894
## dbean  -4.55000000000000159872116 -8.05000000000000781597009
## dkoerp  0.65000000000000046629367  1.15000000000000124344979
## dges    0.00000000000000003608225  0.00000000000000006383782
## doff   -0.13000000000000000444089 -0.23000000000000012101431
##                              dlei                        dgeh
## dleb   -1.16999999999999970690112  0.130000000000000004440892
## dsoz   -2.07000000000000072830630  0.230000000000000121014310
## dlei    0.80999999999999994226840 -0.090000000000000024424907
## dgeh   -0.09000000000000001054712  0.010000000000000003677614
## derr   -0.17999999999999996558309  0.020000000000000000416334
## daggr   2.25000000000000177635684 -0.250000000000000277555756
## dbean   3.15000000000000168753900 -0.350000000000000255351296
## dkoerp -0.45000000000000039968029  0.050000000000000051347815
## dges   -0.00000000000000002498002  0.000000000000000002775558
## doff    0.09000000000000001054712 -0.010000000000000003677614
##                               derr                      daggr
## dleb    0.259999999999999897859482 -3.25000000000000222044605
## dsoz    0.460000000000000075495166 -5.75000000000000710542736
## dlei   -0.179999999999999965583086  2.25000000000000177635684
## dgeh    0.020000000000000000416334 -0.25000000000000027755576
## derr    0.039999999999999986954879 -0.50000000000000033306691
## daggr  -0.500000000000000333066907  6.25000000000001065814104
## dbean  -0.700000000000000288657986  8.75000000000001243449788
## dkoerp  0.100000000000000074940054 -1.25000000000000222044605
## dges    0.000000000000000005551115 -0.00000000000000006938894
## doff   -0.020000000000000000416334  0.25000000000000027755576
##                             dbean                     dkoerp
## dleb   -4.55000000000000159872116  0.65000000000000046629367
## dsoz   -8.05000000000000781597009  1.15000000000000146549439
## dlei    3.15000000000000168753900 -0.45000000000000039968029
## dgeh   -0.35000000000000025535130  0.05000000000000005828671
## derr   -0.70000000000000028865799  0.10000000000000007494005
## daggr   8.75000000000001243449788 -1.25000000000000222044605
## dbean  12.25000000000001421085472 -1.75000000000000266453526
## dkoerp -1.75000000000000266453526  0.25000000000000044408921
## dges   -0.00000000000000009714451  0.00000000000000001387779
## doff    0.35000000000000025535130 -0.05000000000000005828671
##                                              dges                        doff
## dleb    0.000000000000000036082248300317582637153 -0.130000000000000004440892
## dsoz    0.000000000000000063837823915946520798165 -0.230000000000000121014310
## dlei   -0.000000000000000024980018054066022771022  0.090000000000000024424907
## dgeh    0.000000000000000002775557561562892275233 -0.010000000000000003677614
## derr    0.000000000000000005551115123125782239814 -0.020000000000000000416334
## daggr  -0.000000000000000069388939039072345406865  0.250000000000000277555756
## dbean  -0.000000000000000097144514654701258913119  0.350000000000000255351296
## dkoerp  0.000000000000000013877787807814469081547 -0.050000000000000051347815
## dges    0.000000000000000000000000000000000770372 -0.000000000000000002775558
## doff   -0.000000000000000002775557561562892275233  0.010000000000000003677614
## 
## Multivariate Tests: (Intercept)
##                  Df test stat approx F num Df den Df          Pr(>F)    
## Pillai            1 0.4700234 7.981881     10     90 0.0000000044632 ***
## Wilks             1 0.5299766 7.981881     10     90 0.0000000044632 ***
## Hotelling-Lawley  1 0.8868757 7.981881     10     90 0.0000000044632 ***
## Roy               1 0.8868757 7.981881     10     90 0.0000000044632 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wie wir sehen, ergeben wieder alle vier Prüfgrößen dasselbe Ergebnis: Es gibt offenbar einen signifikanten Unterschied zwischen dem Persönlichkeitsprofil der Patienten zu Beginn und zum Ende der Therapie.

Kanonische Korrelationsanalyse

Die Kanonische Korrelationsanalyse dient dazu, die Zusammenhänge zwischen zwei Gruppen von Variablen zu analysieren. Wir wollen dies anhand des Datensatzes “cancorr.RData” veranschaulichen, den wir hier einlesen und uns anzeigen lassen.

load('cancorr.RData')
cancorr

Der Datensatz besteht aus zwei Gruppen von Variablen. Die erste Gruppe besteht aus dem Alter der Versuchspersonen und der Depressivität. Die anderen Gruppe von Variablen enthält zeit- und zukunftsbezogene Einstellungen der Versuchspersonen.

Wir wollen uns nun zunächst die bivariaten Korrelationen der Variablen mittels einer Korrelationsmatrix verdeutlichen. Dazu nutzen wir wieder die Funktion rcorr aus dem Paket “Hmisc”.

rcorr(as.matrix(cancorr[,-1]))
##       alter   dep   kkr   off   ktr   aff   vgo   end   obs
## alter  1.00  0.08 -0.22 -0.27 -0.11 -0.14  0.30  0.09  0.17
## dep    0.08  1.00 -0.61 -0.45 -0.61 -0.70  0.40 -0.15  0.64
## kkr   -0.22 -0.61  1.00  0.53  0.63  0.68 -0.44  0.16 -0.55
## off   -0.27 -0.45  0.53  1.00  0.45  0.56 -0.34  0.12 -0.39
## ktr   -0.11 -0.61  0.63  0.45  1.00  0.69 -0.29  0.18 -0.54
## aff   -0.14 -0.70  0.68  0.56  0.69  1.00 -0.36  0.17 -0.62
## vgo    0.30  0.40 -0.44 -0.34 -0.29 -0.36  1.00 -0.09  0.51
## end    0.09 -0.15  0.16  0.12  0.18  0.17 -0.09  1.00 -0.14
## obs    0.17  0.64 -0.55 -0.39 -0.54 -0.62  0.51 -0.14  1.00
## 
## n
##       alter  dep  kkr  off  ktr  aff  vgo  end  obs
## alter  1069 1045 1009 1035 1049 1022 1030 1038 1045
## dep    1045 1085 1030 1054 1065 1041 1051 1056 1064
## kkr    1009 1030 1046 1029 1032 1030 1041 1033 1035
## off    1035 1054 1029 1073 1060 1040 1053 1060 1063
## ktr    1049 1065 1032 1060 1085 1045 1055 1061 1068
## aff    1022 1041 1030 1040 1045 1060 1052 1043 1048
## vgo    1030 1051 1041 1053 1055 1052 1071 1052 1057
## end    1038 1056 1033 1060 1061 1043 1052 1076 1064
## obs    1045 1064 1035 1063 1068 1048 1057 1064 1083
## 
## P
##       alter  dep    kkr    off    ktr    aff    vgo    end    obs   
## alter        0.0075 0.0000 0.0000 0.0004 0.0000 0.0000 0.0053 0.0000
## dep   0.0075        0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
## kkr   0.0000 0.0000        0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
## off   0.0000 0.0000 0.0000        0.0000 0.0000 0.0000 0.0000 0.0000
## ktr   0.0004 0.0000 0.0000 0.0000        0.0000 0.0000 0.0000 0.0000
## aff   0.0000 0.0000 0.0000 0.0000 0.0000        0.0000 0.0000 0.0000
## vgo   0.0000 0.0000 0.0000 0.0000 0.0000 0.0000        0.0031 0.0000
## end   0.0053 0.0000 0.0000 0.0000 0.0000 0.0000 0.0031        0.0000
## obs   0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000

Wie wir sehen können, sind Alter und Deppression fast vollständig unkorreliert. Die beiden Variablen weisen aber Korrelationen unterschiedlicher Größe mit den Variablen der anderen Gruppe auf.

Als Vorbereitung für die kanonische Korrelationsanalyse sagen wir R nun zunächst, welche Variablen zu welchem Set gehören. Wir packen also die Variablen alter und dep in ein Objekt namens set1 und die zeit- und zukunftsbezogenen Einstellungsvariablen in set2.

set1 <-cancorr[,2:3]
set2 <- cancorr[,4:10]

Nun können wir mit der Funktion cc() aus dem Paket “CCA” ganz einfach eine kanonische Korrelationsanalyse berechnen. Wir müssen der Funktion lediglich die beiden Variablensets als Argumente übergeben. Die Ergebnisse packen wir in ein Objekt namens “kk_ergebnisse”

kk_ergebnisse <- cc(set1, set2)

Der Output der Funktion cc() ist leider ziemlich groß und unübersichtlich. Deswegen wollen wir uns hier nur ausgewählte Teile des Outputs ausgeben lassen. Zunächst wollen wir uns mit dem untenstehenden Code die Korrelationen zwischen den beiden kanonischen Variaten anzeigen lassen. Uns werden hier zwei Korrelationen ausgegeben, da zwei Variatenpaare gebildet wurden. Dies liegt daran, da das kleinere unserer Variablensets zwei Variablen enthält.

kk_ergebnisse$cor
## [1] 0.7767382 0.3256089

Nun lassen wir uns mit dem untenstehenden Code die a- und b-Gewichte unserer Linearkombinationen anzeigen (siehe Buchkaptiel). Im oberen Bereich der Ausgabe sehen wir die a-Gewichte des ersten Variablensets für die kanonische Variate \(U_1\) (erste Spalte) und für die kanonische Variate \(U_2\) (zweite Spalte). Im unteren Bereich der Ausgabe sehen wir die b-Gewichte des zweiten Variablensets für die kanonische Variate \(V_1\) (erste Spalte) und für die kanonische Variate \(V_2\).

kk_ergebnisse$xcoef
##              [,1]        [,2]
## alter -0.03001591 -0.14050875
## dep   -0.13896711  0.04179087
kk_ergebnisse$ycoef
##             [,1]        [,2]
## kkr  0.038882873  0.04200230
## off  0.027963585  0.21775660
## ktr  0.053398137 -0.07954655
## aff  0.087392910 -0.13361869
## vgo -0.030030457 -0.19136091
## end -0.006709366 -0.09485797
## obs -0.091324267  0.06058324

Nun wollen wir uns noch die Korrelationen (Ladungen) der Variablen mit den Variaten ausgeben lassen. Der obere Teil der Ausgabe gibt die Ladungen der Variablen des ersten Sets auf die Variaten \(U_1\) und \(U_2\) an. Der untere Teil gibt die Ladungen des zweiten Sets auf die Variaten \(V_1\) und \(V_2\) an.

kk_ergebnisse$scores$corr.X.xscores
##             [,1]       [,2]
## alter -0.2932742 -0.9596798
## dep   -0.9786672  0.2153579
kk_ergebnisse$scores$corr.Y.yscores
##           [,1]        [,2]
## kkr  0.8084056  0.11759317
## off  0.6225350  0.42588768
## ktr  0.7824375 -0.22339008
## aff  0.8917654 -0.20012975
## vgo -0.5657356 -0.56155573
## end  0.1611399 -0.40012073
## obs -0.8404694  0.06065356

Gruppenunterschiede

Wir kehren nun zum Datensatz “multivat” zurück, der die Persönlichkeitsprofile von Patienten zu Beginn und Ende eines bestimmten Zeitraums enthält. Wir wollen nun die Gruppenvariable gr in die Analyse mit aufnehmen. Diese Variable repräsentiert, ob die Patienten zu Beginn des Zeitraums einer Therapiegruppe oder einer Wartekontrollgruppe zugewiesen wurden. Wir wollen nun überprüfen, ob sich die Veränderungen im Persönlichkeitsprofil der Patienten über diesen Zeitraum hinweg zwischen der Therapie- und der Wartekontrollgruppe unterscheiden. Zu diesem Zweck fitten wir im ersten Schritt wieder eine Regression mit den 10 Differenzvariablen zwischen Zeitpunkt 1 und Zeitpunkt 2 als abhängigen Variablen. Im Gegensatz zu vorhin nehmen wir nun allerdings einen Prädiktor mit auf: Die Gruppenvariable gr. Anhand der Ausgabe können wir sehen, dass wir für jede Variable nun eine Schätzung des Intercepts und des Regressionsgewichts des Prädiktors erhalten.

reg_gr <- lm(formula = as.matrix(multivat[,34:43]) ~ gr, data = multivat)
reg_gr
## 
## Call:
## lm(formula = as.matrix(multivat[, 34:43]) ~ gr, data = multivat)
## 
## Coefficients:
##              dleb                      dsoz                    
## (Intercept)   0.040000000000000049405   0.200000000000000094369
## gr            0.179999999999999937828   0.059999999999999983902
##              dlei                      dgeh                    
## (Intercept)   0.019999999999999996947   0.079999999999999932276
## gr           -0.220000000000000056621  -0.139999999999999902300
##              derr                      daggr                   
## (Intercept)   0.039999999999999966138  -0.340000000000000413003
## gr           -0.039999999999999959199   0.180000000000000520695
##              dbean                     dkoerp                  
## (Intercept)  -0.340000000000000357492   0.040000000000000042466
## gr           -0.019999999999999639594   0.020000000000000017764
##              dges                      doff                    
## (Intercept)   0.000000000000000003276  -0.260000000000000119904
## gr           -0.000000000000000001000   0.500000000000000333067

Analog zu den obigen Analysen rechnen wir wieder eine MANOVA, indem wir die Ergebnisse der Regression wieder der Funktion Anova() aus dem Paket “car” übergeben. Die Ergebnisse der MANOVA packen wir in ein Objekt namens “manova_gr”. Mittels der Funktion summary() lassen wir uns wieder die Ergebnisse ausgeben.

manova_gr <- Anova(reg_gr)
summary(manova_gr)
## 
## Type II MANOVA Tests:
## 
## Sum of squares and products for error:
##         dleb  dsoz  dlei                      dgeh  derr daggr dbean dkoerp
## dleb   30.50 -4.26  5.16  1.5000000000000048849813 -1.08 -2.56 -6.36  -0.74
## dsoz   -4.26 31.62  0.40 -6.0200000000000066791017 -0.40  0.48 -2.92   0.82
## dlei    5.16  0.40 28.98 -0.6800000000000009370282  0.96 -6.26 -2.26  -1.44
## dgeh    1.50 -6.02 -0.68 20.5000000000000035527137  0.84  0.88 -0.72   3.02
## derr   -1.08 -0.40  0.96  0.8400000000000008570922 29.92  2.68 -3.32  -0.08
## daggr  -2.56  0.48 -6.26  0.8800000000000021138646  2.68 27.94  1.34  -2.84
## dbean  -6.36 -2.92 -2.26 -0.7199999999999988631316 -3.32  1.34 30.74   0.76
## dkoerp -0.74  0.82 -1.44  3.0199999999999995736744 -0.08 -2.84  0.76  32.74
## dges   -5.00  1.00 -1.00  0.0000000000000001174571  5.00 -3.00 -1.00   2.00
## doff    0.88 -3.52  1.66  1.7600000000000011191048 -0.48  0.50  0.90   3.80
##                             dges  doff
## dleb   -5.0000000000000000000000  0.88
## dsoz    1.0000000000000000000000 -3.52
## dlei   -0.9999999999999997779554  1.66
## dgeh    0.0000000000000001174571  1.76
## derr    5.0000000000000000000000 -0.48
## daggr  -3.0000000000000004440892  0.50
## dbean  -0.9999999999999996669331  0.90
## dkoerp  1.9999999999999997779554  3.80
## dges   24.0000000000000000000000  1.00
## doff    1.0000000000000000000000 24.74
## 
## ------------------------------------------
##  
## Term: gr 
## 
## Sum of squares and products for the hypothesis:
##                               dleb                        dsoz
## dleb    0.809999999999999387156890  0.269999999999999795718963
## dsoz    0.269999999999999851230115  0.089999999999999955035968
## dlei   -0.989999999999999991118216 -0.330000000000000015543122
## dgeh   -0.629999999999999338307077 -0.209999999999999770183834
## derr   -0.179999999999999771294057 -0.059999999999999921451721
## daggr   0.810000000000002162714452  0.270000000000000739408534
## dbean  -0.089999999999998345212582 -0.029999999999999450717159
## dkoerp  0.090000000000000052180482  0.030000000000000019706459
## dges   -0.000000000000000004500532 -0.000000000000000001500177
## doff    2.250000000000000888178420  0.750000000000000333066907
##                              dlei                        dgeh
## dleb   -0.98999999999999988009591 -0.629999999999999338307077
## dsoz   -0.32999999999999996003197 -0.209999999999999797939410
## dlei    1.21000000000000063060668  0.769999999999999684696661
## dgeh    0.76999999999999957367436  0.489999999999999269473250
## derr    0.21999999999999983457677  0.139999999999999763522496
## daggr  -0.99000000000000321076499 -0.630000000000001447730824
## dbean   0.10999999999999804378703  0.069999999999998688271496
## dkoerp -0.11000000000000012545520 -0.070000000000000006661338
## dges    0.00000000000000000550065  0.000000000000000003500414
## doff   -2.75000000000000266453526 -1.750000000000000000000000
##                               derr                       daggr
## dleb   -0.179999999999999743538481  0.810000000000002051692150
## dsoz   -0.059999999999999921451721  0.270000000000000683897383
## dlei    0.219999999999999834576769 -0.990000000000003210764987
## dgeh    0.139999999999999763522496 -0.630000000000001336708522
## derr    0.039999999999999917565940 -0.180000000000000354161145
## daggr  -0.180000000000000354161145  0.810000000000004716227409
## dbean   0.019999999999999618777169 -0.089999999999998636646126
## dkoerp -0.019999999999999996946887  0.090000000000000343614026
## dges    0.000000000000000001000118 -0.000000000000000004500532
## doff   -0.499999999999999833466546  2.250000000000007993605777
##                               dbean                       dkoerp
## dleb   -0.0899999999999983452125818  0.0900000000000000383026943
## dsoz   -0.0299999999999994507171586  0.0300000000000000162370117
## dlei    0.1099999999999980576648184 -0.1100000000000001393329896
## dgeh    0.0699999999999986882714964 -0.0700000000000000066613381
## derr    0.0199999999999996187771689 -0.0199999999999999969468867
## daggr  -0.0899999999999986505239136  0.0900000000000003436140261
## dbean   0.0099999999999996393856838 -0.0099999999999998284705427
## dkoerp -0.0099999999999998284705427  0.0100000000000000175554016
## dges    0.0000000000000000005000591 -0.0000000000000000005000591
## doff   -0.2499999999999956701302040  0.2500000000000003885780586
##                                                dges                       doff
## dleb   -0.00000000000000000450053217833586183000555  2.25000000000000044408921
## dsoz   -0.00000000000000000150017739277862080233931  0.75000000000000022204460
## dlei    0.00000000000000000550065044018827942196026 -2.75000000000000266453526
## dgeh    0.00000000000000000350041391648344654956987 -1.74999999999999977795540
## derr    0.00000000000000000100011826185241316222990 -0.49999999999999983346655
## daggr  -0.00000000000000000450053217833587723738578  2.25000000000000799360578
## dbean   0.00000000000000000050005913092619810700161 -0.24999999999999567013020
## dkoerp -0.00000000000000000050005913092620754415753  0.25000000000000038857806
## dges    0.00000000000000000000000000000000002500591 -0.00000000000000001250148
## doff   -0.00000000000000001250147827315518561587700  6.25000000000000888178420
## 
## Multivariate Tests: gr
##                  Df test stat approx F num Df den Df     Pr(>F)    
## Pillai            1 0.2955829 3.734559     10     89 0.00032662 ***
## Wilks             1 0.7044171 3.734559     10     89 0.00032662 ***
## Hotelling-Lawley  1 0.4196134 3.734559     10     89 0.00032662 ***
## Roy               1 0.4196134 3.734559     10     89 0.00032662 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wir können sehen, dass wieder alle vier Prüfkriterien ein identisches Ergebnis produzieren: Ja, die Veränderungen im Persönlichkeitsprofil der Patienten zwischen dem Zeitpunkt 1 und dem Zeitpunkt 2 unterschieden sich zwischen der Therapie- und der Wartekontrollgruppe.

Wir können das Zustandekommen der Prüfgrößen illustrieren, indem wir eine Regression mit der Gruppenvariable als Kriterum und den 10 Differenzvariablen als Prädiktoren rechnen:

reg_illu <- lm(formula = gr ~ dleb + dsoz + dlei + dgeh + derr + daggr + dbean + dkoerp + dges + doff, data = multivat)
summary(reg_illu)
## 
## Call:
## lm(formula = gr ~ dleb + dsoz + dlei + dgeh + derr + daggr + 
##     dbean + dkoerp + dges + doff, data = multivat)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.69739 -0.38396  0.06992  0.34504  0.90048 
## 
## Coefficients:
##             Estimate Std. Error t value        Pr(>|t|)    
## (Intercept)  0.47691    0.06110   7.805 0.0000000000109 ***
## dleb         0.14643    0.08505   1.722          0.0886 .  
## dsoz         0.06702    0.08333   0.804          0.4234    
## dlei        -0.16741    0.08481  -1.974          0.0515 .  
## dgeh        -0.15032    0.10114  -1.486          0.1407    
## derr        -0.01356    0.08416  -0.161          0.8724    
## daggr        0.08790    0.08825   0.996          0.3219    
## dbean       -0.00600    0.08367  -0.072          0.9430    
## dkoerp      -0.01899    0.07988  -0.238          0.8127    
## dges         0.01995    0.09565   0.209          0.8353    
## doff         0.38245    0.08217   4.654 0.0000112769612 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4448 on 89 degrees of freedom
## Multiple R-squared:  0.2956, Adjusted R-squared:  0.2164 
## F-statistic: 3.735 on 10 and 89 DF,  p-value: 0.0003266

Wie wir sehen, entspricht nun das multiple R² der Regression der Prüfgröße “Pillai” aus der MANOVA. Ferner entspricht der globale F-Test der aufgeklärten Varianz in der Regression dem F-Test des Faktors gr aus der MANOVA.

Nun möchten wir veranschaulichen, was passiert, wenn der Gruppenfaktor im Rahmen einer MANOVA mehr als zweigestuft ist. Stellen wir uns vor, dass es in der im Datensatz “multivat” enthaltenen Therapiestudie tatsächlich drei Gruppen gab: Eine Therapiegruppe, eine Wartekontrollgruppe und eine Placebokontrollgruppe. Diese Gruppenstruktur wird durch die Variable gr2 repräsentiert. Der erste Schritt ist komplett analog zur obigen Analyse: Wir rechnen eine Regression der 10 Differenzvariablen auf den dreigestuften Prädiktor gr. Wir müssen nur eine wichtige Maßnahme treffen: Die Variable gr2 ist mit den Werten 0, 1 und 2 codiert. R denkt also standardmäßig, dass es sich hierbei um eine intervallskalierte Variable handelt. Dies ist natürlich nicht der Fall (und würde zu falschen Ergebnissen führen, wenn wir R in dem Glauben ließen). Deswegen müssen wir mit der Funktion as.factor() die Variable gr2 zunächst in einen Faktor tranformieren und dann als Prädiktor in die Regression aufnehmen. 2

reg_gr2 <- lm(formula = as.matrix(multivat[,34:43]) ~ as.factor(gr2), data = multivat)
reg_gr2
## 
## Call:
## lm(formula = as.matrix(multivat[, 34:43]) ~ as.factor(gr2), data = multivat)
## 
## Coefficients:
##                  dleb                    dsoz                  
## (Intercept)       0.0399999999999998898   0.2799999999999999156
## as.factor(gr2)1   0.0000000000000001795  -0.1600000000000000311
## as.factor(gr2)2   0.1800000000000001599  -0.0199999999999996361
##                  dlei                    dgeh                  
## (Intercept)       0.1599999999999997535  -0.0000000000000003775
## as.factor(gr2)1  -0.2799999999999999156   0.1600000000000009470
## as.factor(gr2)2  -0.3599999999999995426  -0.0599999999999997619
##                  derr                    daggr                 
## (Intercept)      -0.0399999999999999245  -0.4400000000000002243
## as.factor(gr2)1   0.1599999999999997813   0.2000000000000006217
## as.factor(gr2)2   0.0399999999999999384   0.2799999999999998046
##                  dbean                   dkoerp                
## (Intercept)      -0.3200000000000000067   0.0800000000000001682
## as.factor(gr2)1  -0.0399999999999999661  -0.0800000000000010147
## as.factor(gr2)2  -0.0400000000000003200  -0.0199999999999997437
##                  dges                    doff                  
## (Intercept)       0.0399999999999995914  -0.2000000000000003997
## as.factor(gr2)1  -0.0799999999999997380  -0.1199999999999989686
## as.factor(gr2)2  -0.0399999999999993000   0.4400000000000005018

Die Ergebnisse der Regression übergeben wir wieder der Funktion Anova() aus dem Paket “car”. Anschließend lassen wir uns die Ergebnisse ausgeben.

manova_gr2 <- Anova(reg_gr2)
summary(manova_gr2)
## 
## Type II MANOVA Tests:
## 
## Sum of squares and products for error:
##         dleb  dsoz  dlei  dgeh  derr daggr dbean dkoerp  dges  doff
## dleb   30.50 -4.26  5.16  1.50 -1.08 -2.56 -6.36  -0.74 -5.00  0.88
## dsoz   -4.26 31.30 -0.16 -5.70 -0.08  0.88 -3.00   0.66  0.84 -3.76
## dlei    5.16 -0.16 28.00 -0.12  1.52 -5.56 -2.40  -1.72 -1.28  1.24
## dgeh    1.50 -5.70 -0.12 20.18  0.52  0.48 -0.64   3.18  0.16  2.00
## derr   -1.08 -0.08  1.52  0.52 29.60  2.28 -3.24   0.08  5.16 -0.24
## daggr  -2.56  0.88 -5.56  0.48  2.28 27.44  1.44  -2.64 -2.80  0.80
## dbean  -6.36 -3.00 -2.40 -0.64 -3.24  1.44 30.72   0.72 -1.04  0.84
## dkoerp -0.74  0.66 -1.72  3.18  0.08 -2.64  0.72  32.66  1.92  3.68
## dges   -5.00  0.84 -1.28  0.16  5.16 -2.80 -1.04   1.92 23.92  0.88
## doff    0.88 -3.76  1.24  2.00 -0.24  0.80  0.84   3.68  0.88 24.56
## 
## ------------------------------------------
##  
## Term: as.factor(gr2) 
## 
## Sum of squares and products for the hypothesis:
##                            dleb  dsoz  dlei  dgeh  derr daggr dbean dkoerp
## dleb    0.810000000000000386358  0.27 -0.99 -0.63 -0.18  0.81 -0.09   0.09
## dsoz    0.270000000000001461054  0.41  0.23 -0.53 -0.38 -0.13  0.05   0.19
## dlei   -0.989999999999998880895  0.23  2.19  0.21 -0.34 -1.69  0.25   0.17
## dgeh   -0.630000000000000892619 -0.53  0.21  0.81  0.46 -0.23 -0.01  -0.23
## derr   -0.179999999999999549249 -0.38 -0.34  0.46  0.36  0.22 -0.06  -0.18
## daggr   0.809999999999998165912 -0.13 -1.69 -0.23  0.22  1.31 -0.19  -0.11
## dbean  -0.090000000000001606493  0.05  0.25 -0.01 -0.06 -0.19  0.03   0.03
## dkoerp  0.090000000000003299583  0.19  0.17 -0.23 -0.18 -0.11  0.03   0.09
## dges    0.000000000000002398461  0.16  0.28 -0.16 -0.16 -0.20  0.04   0.08
## doff    2.250000000000000444089  0.99 -2.33 -1.99 -0.74  1.95 -0.19   0.37
##                           dges  doff
## dleb    0.00000000000000238698  2.25
## dsoz    0.16000000000000033640  0.99
## dlei    0.27999999999999580780 -2.33
## dgeh   -0.16000000000000241807 -1.99
## derr   -0.15999999999999983680 -0.74
## daggr  -0.19999999999999734657  1.95
## dbean   0.03999999999999953593 -0.19
## dkoerp  0.08000000000000104250  0.37
## dges    0.07999999999999948819  0.12
## doff    0.12000000000000571321  6.43
## 
## Multivariate Tests: as.factor(gr2)
##                  Df test stat approx F num Df den Df     Pr(>F)    
## Pillai            2 0.3827668 2.106452     20    178 0.00549463 ** 
## Wilks             2 0.6428373 2.175698     20    176 0.00393312 ** 
## Hotelling-Lawley  2 0.5157738 2.243616     20    174 0.00282753 ** 
## Roy               2 0.4212144 3.748808     10     89 0.00031372 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wie wir sehen, haben wir nun zum ersten mal den Fall, dass die vier Prüfkriterien unterschiedliche Ergebnisse liefern. Zwar lassen alle Prüfkriterien den gleichen qualitativen Schluss zu, nämlich dass es Unterschiede in der Veränderung der Persönlichkeitsprofile zwischen den beiden Gruppen gibt. Allerdings sehen wir, dass es Unterschiede in den mit den jeweiligen Prüfgrößen assoziierten F-Werten und p-Niveaus gibt.

Wie können wir uns nun klar machen, wie die Prüfgrößen berechnet werden. Wir können nun nicht einfach, wie im vorherigen Fall, eine Regression von gr2 auf die 10 Differenzvariablen berechnen, da gr2 mehr als zwei Stufen hat und die Regression gr2 als intervallskalierte Variable behandeln würde (siehe Fußnote 2). Sie ahnen vielleicht, was wir stattdessen tun können: Wir können zunächst die dreigestufte Gruppenvariable in zwei Kontrastvariablen umkodieren und anschließend eine kanonische Korrelation zwischen den beiden Kontrastvariablen in Set A und den 10 Differenzvariablen in Set B berechnen. Um dies zu tun, nutzen wir zunächst wieder die Funktion mutate() aus dem Paket “dplyr”, um die Kontrastvariablen zu bilden.

multivat <- multivat %>%
  mutate(k1 = recode(gr2, '0' = 1, '1' = -1, '2' = 0),
         k2 = recode(gr2, '0' = -0.5, '1' = -0.5, '2' = 1))

Um unsere spätere Analyse zu vereinfachen, schauen wir nun wieder mittels der Funktion colnames(), in welchen Spalten sich unsere Kontrastvariablen und unsere Differenzvariablen befinden. Die Kontrastvariablen befinden sich in den Spalten mit den Nummern 44 und 45. Die Differenzvariablen haben nach wie vor die Nummern 34 bis 43.

colnames(multivat)
##  [1] "vp"     "gr"     "gr2"    "leb"    "soz"    "lei"    "geh"    "err"   
##  [9] "aggr"   "bean"   "koerp"  "ges"    "off"    "leb2"   "soz2"   "lei2"  
## [17] "geh2"   "err2"   "aggr2"  "bean2"  "koerp2" "ges2"   "off2"   "lebx"  
## [25] "sozx"   "leix"   "gehx"   "errx"   "aggrx"  "beanx"  "koerpx" "gesx"  
## [33] "offx"   "dleb"   "dsoz"   "dlei"   "dgeh"   "derr"   "daggr"  "dbean" 
## [41] "dkoerp" "dges"   "doff"   "k1"     "k2"

Wir sagen R nun also, dass die beiden Kontrastvariablen in Set A und die 10 Differenzvariablen in Set B gehen sollen.

setA <- multivat[,44:45]
setB <- multivat[,34:43]

Nun rechnen wir wieder mit der Funktion cc aus dem Paket “CCA” eine kanonische Korrelationsanalyse und packen die Ergebnisse in das Objekt kk_Gruppe.

kk_gruppe <- cc(setA, setB)

Wir lassen uns zunächst wieder die Korrelationen zwischen den beiden kanonischen Variatenpaaren ausgeben.

kk_gruppe$cor
## [1] 0.5444046 0.2939224

Nun wollen wir uns noch einen Signifikanztest ausgeben lassen, ob diese beiden Korrelationen signifikant von 0 verschieden sind. Dazu benötigen wir die Funktion p.aysm() aus dem Paket “CCP”. Diese Funktion erwartet vier Argumente:

canon_correlations <- kk_gruppe$cor
p.asym(rho = canon_correlations, N = 100, p = 2, q = 10, tstat = 'Wilks')
## Wilks' Lambda, using F-approximation (Rao's F):
##               stat    approx df1 df2     p.value
## 1 to 2:  0.6428373 2.1756979  20 176 0.003933116
## 2 to 2:  0.9136096 0.9350877   9  89 0.499095190

Der für uns entscheidende Test ist in der Zeile “1 to 2” angegeben. Diese Zeile gibt an, ob das Gesamt der kanonischen Korrelationen als von 0 verschieden angenommen werden kann. Wie Sie sehen, ist dieser Test identisch zum Wilks Lambda des Faktors gr2 aus der obigen MANOVA. Dem Buchkapitel können Sie weitere Details dazu entnehmen, wie genau die kanonischen Korrelationen mit den vier Prüfgrößen der MANOVA zusammenhängen.


  1. Leider nutzen die in Kapitel 7 verwendeten Pakete häufig identische Funktionsnamen. So haben beispielsweise sowohl das Paket “dplyr” als auch das Paket “car” eine Funktion namens recode(). Bei derartigen Konflikten bestimmt immer das letzte geladene Paket, welche Funktion sich letztlich hinter einem bestimmten Funktionsnamen verbirgt. Daher sollten sie die Reihenfolge, in der die Pakete hier geladen werden, nicht verändern, da es sonst zu Fehlern kommen kann.↩︎

  2. Wir sollten der Vollständigkeit halber hinzufügen, dass R natürlich auch nicht bei der obigen Analyse wissen konnte, dass es sich bei der Variable gr um eine nominalskalierte Variable handelt. Da die Variable allerdings nur zweigestuft war, führte das nicht zu Fehlern in der Berechnung der Regression. Wenn Sie sich klar machen wollen, warum das so ist, können Sie zum Kapitel 6 zurückkehren.↩︎