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))
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:
lm()
, die wir bis jetzt nur dazu genutzt haben, um
Regressionen zu rechnen?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.
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).
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.
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
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.
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.↩︎
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.↩︎