Kontrastanalyse

Übung Forschungsmethodik II | SS 2024

Autor
TU Chemnitz

C. Maiwald

Professur Forschungsmethoden und Analyseverfahren in der Biomechanik

Datum

11. April 2024

1 Datensätze laden

Die Datensätze liegen als .RData-Files vor. Daher genügt der load-Befehl.

load("SEDL1.RData")
load("SEDL2.RData")
load("FURR2.RData")

2 Beispielrechnungen

Wir nutzen an dieser Stelle die bereits aus dem Skript und der Vorlesung bekannten Datenbeispiele für unabhängige und abhängige Stichproben sowie für ein mehrfaktorielles Design.

2.1 Datensatz SEDL1: Unabhängige Stichproben

library(ggplot2)

MW <- aggregate(Score ~ Gruppe, SEDL1, mean)

P1 <- ggplot(SEDL1, aes(x=Gruppe, y=Score, fill=Gruppe))+
  geom_dotplot(binaxis = "y", stackdir="center", dotsize=1, binwidth = 0.08)+
  geom_segment(data=MW, aes(x=as.numeric(Gruppe)-0.15, xend=as.numeric(Gruppe)+0.15, y=Score, yend=Score), color="red", linewidth=1)+
  theme_minimal()+
  labs(x="Gruppe", y="Score")+
  theme(legend.position = "none")+
  scale_fill_manual(values = c("grey20", "cyan", "purple"))
plot(P1)

FÜr den Datensatz SEDL1 liegen die vorgeschlagenen Lambda-Gewichte vor: \(\lambda_{SEDL1} = \{0; 100; 20\}\). Wenn wir diesen Vektor als named numerical angeben, brauchen wir uns um die Reihenfolge der Faktorlevels in der Gruppierungsvariable keine Gedanken machen. So lange die Namen der Elemente des Lambda-Vektors mit den Faktorlevels übereinstimmen, findet cofad automatisch die Richtige Zuordnung des entsprechenden Gewichts zur jeweiligen Gruppe.

Zusätzlich müssen wir noch angeben, welche Variable als Zielgröße (“dependent variable”: dv) und welche als Gruppierungsvariable (“between-subjects”: between) dient.

library(cofad)

# Lambda-Vektor als named numerical:
lambda.SEDL1 <- c("Kontrolle" = 0, "TR.maennl" = 100, "TR.weibl"= 20)

KA.SEDL1 <- calc_contrast(dv = Score, between = Gruppe,
                    lambda_between = lambda.SEDL1,
                    data = SEDL1)
Warning in calc_contrast(dv = Score, between = Gruppe, lambda_between =
lambda.SEDL1, : lambdas are centered and rounded to 3 digits
print.cofad_bw(KA.SEDL1)

Contrast Analysis for between factor design

F(1,12) = 6.519; p = 0.02531656
Contrasts:  Kontrolle = -40; TR.maennl = 60; TR.weibl = -20
r_effectsize = 0.593

Wie wird dieses Ergebnis interpretiert? Unklar ist zunächst, warum hier ein F-Test zur Anwendung kommt, wo doch in den Originalquellen immer von einem t-Test die Rede ist. Auch im Lehrbuch von Sedlmeier & Renkewitz (2018) ist die Rede von t-Tests. Wie kommt man nun von diesem F-Wert zum erwarteten t-Wert?

Da in einer Kontrastanalyse immer der Kontrast L gegen den Kontrast der Nullhypothese (also \(\lambda_{H_0} = \{0;0;0\}\) getestet wird, testen wir immer zwei “Gruppen” (Vektoren aus “Lambda-gewichteten” Mittelwerten) gegeneinander. Auch eine ANOVA bzw. den F-Test einer ANOVA kann man mit Daten ausführen, die nur aus zwei Gruppen bestehen. In einem solchen Fall sind F-Test und t-Test ineinander überführbar bzw. äquivalent. Der t-Wert ergibt sich dann wie folgt: \(t = \sqrt{F}\).

Den zugehörigen t-Wert zum erhaltenen F-Wert, sowie den zu diesem t-Wert gehörigen p-Wert ermitteln wir mit folgendem Procedere:

t.SEDL1 <- sqrt(KA.SEDL1$sig[1]) 
p.SEDL1 <- 1 - pt(t.SEDL1, df=12) 
print(p.SEDL1)
[1] 0.01265828

Der p-Wert des t-Tests ist auf dem 5%-Niveau statistisch signifikant. Er ist zudem genau halb so groß wie der des F-Tests. Wieso ist dies der Fall?

Tipp

Der F-Test entspricht im vorliegenden Fall der ungerichteten Variante des t-Tests – wir können allerdings in der Kontrastanalyse einen gerichteten t-Test verwenden, da wir eine gerichtete Hypothese prüfen. Daher können wir den p-Wert des F-Tests halbieren, um den p-Wert für die Prüfung der gerichteten Hypothese zu ermitteln.

2.2 Datensatz SEDL2: Abhängige Stichproben

MW2 <- aggregate(Score ~ Bedingung, SEDL2, mean)

P2 <- ggplot(SEDL2, aes(x=Bedingung, y=Score))+
  geom_dotplot(binaxis = "y", stackdir="center", dotsize=1, fill=SEDL2$ID, binwidth = 0.4)+
  geom_segment(data=MW2, aes(x=as.numeric(Bedingung)-0.15, xend=as.numeric(Bedingung)+0.15, y=Score, yend=Score), color="red", linewidth=1)+
  theme_minimal()+
  labs(x="Bedingung", y="Score")+
  theme(legend.position = "none")
plot(P2)

Bei der Berechnung der Kontrastanalyse mit abhängigen Stichproben wird der L-Vektor nicht auf Basis der Gruppenmittelwerte, sondern auf Basis der gewichteten Einzelwerte jeder Person gebildet. Dieser Unterschied ist aber für uns in der Bedienung der Funktion nicht erkennbar. Es kann sogar mit derselben Funktion gearbeitet werden, es sind lediglich die Funktionsparameter anzupassen. Die Lambda-Gewichte werden für die Bedingugen Jazz, Klassik, Ohne und Rauschen wie folgt gewählt: \(\lambda_{SEDL2}=\{-0.75; -0.75; 1.25; 0.25\}\). Analog zum obigen Fall erzeugen wir wieder ein named numerical als Lambda-Gewichtsvektor, um die korrekte Zuordnung der Gewichte zu den jeweiligen Gruppen sicherzustellen.

# named numerical als Lambda-Gewichtsvektor:
lambda.SEDL2 <- c("Ohne"=1.25, "Rauschen"=0.25, "Klassik"=-0.75, "Jazz"=-0.75)

KA.SEDL2 <- calc_contrast(dv=Score,
                          within = Bedingung,
                          lambda_within = lambda.SEDL2,
                          ID=ID,
                          data=SEDL2)
print.cofad_wi(KA.SEDL2)

Contrast Analysis for within factor design

L-Values: Mean =  5.875 ; SD =  3.154
t(7) = 5.269; p = 0.00058101
Contrasts:  Jazz = -0.75; Klassik = -0.75; Ohne = 1.25; Rauschen = 0.25
g_contrast = 1.863

Da im abhängigen Fall immer ein t-Test in der Kontrastanalyse gerechnet wird (Sedlmeier & Renkewitz, 2018), wird in der Ausgabe von cofad in diesem Fall auch direkt das Ergebnis des t-Tests angegeben. Erläuterungen zu den Effektgrößen der Kontrastanalyse sowie Rechenbeispiele für alternative Hypothesen und Lambda-Gewichte finden sich in Sedlmeier & Renkewitz (2018, S. 538 ff.).

2.3 Datensatz FURR2: Mehrfaktorielles Design

P3 <- ggplot(FURR2, aes(x=Messung, y=Score, fill=Gruppe))+
  geom_boxplot(width=0.4)+
  geom_point(position=position_dodge(width=0.4), size=3, shape=21)+
  theme_classic()+
  scale_fill_manual(values = c("grey70", "darkorange"))
plot(P3)

Den in diesem Fall synergistischen Kontrast (d. h. nur in der TR-Gruppe existiert ein Effekt) testen wir wie folgt: wir bilden den Wirkungskontrast als \(\lambda_{Wirkung} = \{1;0;-1\}\). Wir müssen diesen Kontrast zunächst für beide unabhängigen Gruppen CO und TR individuell (analog zur Kontrastanalyse für abhängige Stichproben) erzeugen. Die beiden L-Vektoren (\(L_{CO}\) und \(L_{TR}\)) vergleichen wir dann mittels t-Test (d. h. in Form einer Kontrastanalyse für unabhängige Stichproben) gegeneinander.

Den gesamten Aufwand erledigt cofad in einem Arbeitsschritt. Alles was wir benötigen sind die Lambda-Vektoren für die Wirkung in beiden Gruppen, und im Anschluss den Lambda-Vektor für den Gruppenvergleich.

Achtung: die Abhängige Variable Score reflektiert die Anzahl der Symptome, d. h. je niedriger desto besser.

lambda.Wirkung <- c("pre"=1,"mid"=0,"post"=-1)
lambda.Gruppenvergleich <- c("CO"=1, "TR"=-1)

MIXED <- calc_contrast(dv=Score, within=Messung, between = Gruppe,
                    lambda_within = lambda.Wirkung,
                    lambda_between = lambda.Gruppenvergleich,
                    ID=ID,
                    data=FURR2)

print.cofad_mx(MIXED)

Contrast Analysis for Mixed-Design:

F(1,8) = 19.962; p = 0.002
Contrasts:  CO = 1 TR = -1
r_effectsize = 0.845

Wir sehen wiederum ein statistisch signifikantes Ergebnis, dieses Mal wieder wie bei den unabhängigen Stichproben. Den t-Wert für den gerichteten Test erhalten wir durch Wurzelziehen aus dem F-Wert, und den entsprechenden p-Wert durch Halbierung des p-Werts aus dem F-Test.

2.4 Konkurrierende Hypothesen

Bei konkurrierenden Hypothesen wird im Kern lediglich ein Differenzkontrast zweier Hypothesen erzeugt, und dieser dann wie bei einer herkömmlichen Kontrastanalyse für unabhängige Stichproben getestet.

Den Differenzkontrast erzeugen wir durch z-Standardisierung der beiden Kontraste für die zu vergleichenden Hypothesen, sowie anschließender Differenzbildung. Analog zum Skript illustrieren wir die Berechnung eines solchen Vergleichs am Beispiel aus SEDL1.

# Kontrast für 0 - 100 - 20 Effekt -> lambda.SEDL1
lambda.SEDL1.1 <- lambda.SEDL1
# Kontrast für 0 - 100 - 100 Effekt
lambda.SEDL1.2 <- c("Kontrolle" = 0, "TR.maennl" = 100, "TR.weibl" = 100)


#Zentrierung und z-Standardisierung
lambda.SEDL1.1.z <- as.vector(scale(lambda.SEDL1.1, center=TRUE, scale=TRUE))
lambda.SEDL1.2.z <- as.vector(scale(lambda.SEDL1.2, center=TRUE, scale=TRUE))

# Differenzkontrast
lambda.SEDL1.delta <- lambda.SEDL1.1.z - lambda.SEDL1.2.z

# Bei Scale Prozedur gehen die Namen verloren, daher neu definieren
names(lambda.SEDL1.delta) <- c("Kontrolle", "TR.maennl", "TR.weibl")


KON.HYP <- calc_contrast(dv=Score, between = Gruppe, lambda_between = lambda.SEDL1.delta,
                         data=SEDL1)
Warning in calc_contrast(dv = Score, between = Gruppe, lambda_between =
lambda.SEDL1.delta, : lambdas are centered and rounded to 3 digits
print(KON.HYP)

Contrast Analysis for between factor design

F(1,12) = 1.299; p = 0.27660063
Contrasts:  Kontrolle = 0.399; TR.maennl = 0.557; TR.weibl = -0.955
r_effectsize = 0.265

Wir sehen in diesem Vergleich keinen statistisch signifikanten Effekt, welcher die Überlegenheit einer der beiden Hypothesen anzeigen würde. Dazu sind sich die Hypothesen zu ähnlich. Das weiterführende Beispiel findet sich im Skript: ersetzt man den zweiten Kontrast durch einen genau gegensätzlichen Wirkungskontrast (\(\lambda_{SEDL1_2} = \{0; 20; 100\}\)), so findet sich der signifikante Effekt zu Gunsten des ursprünglichen Kontrast der Überlegenheit des “jungenspezifischen” Spielzeugs.

3 Literatur

Sedlmeier, P., & Renkewitz, F. (2018). Forschungsmethoden und Statistik für Psychologen und Sozialwissenschaftler (3. Aufl.). München: Pearson.