1. Vorbereitungen
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
#install.packages("lavaan", dependecies = TRUE)
#install.packages("semPlot", dependencies = TRUE)
library(lavaan)
library(semPlot)
Zu Beginn setzen wir wie immer das Arbeitsverzeichnis und laden den benötigten Datensatz GESIS.csv in R-Studio.
sem_dat <- read.csv2('GESIS_Datensatz.csv')
Im Laufe des Tutorials werden immer wieder interaktive Code-Felder erscheinen. Sie können dort beliebigen R-Code eingeben, und dann rechts oben auf “Run Code” klicken, um ihn auszuführen. Manchmal steht auch schon fertiger Code drin - das ist dann im Normalfall die Musterlösung. Sie können dann einfach auf “Run Code” klicken, oder den Code noch mal verändern (z.B. andere Parametereinstellungen probieren) und dann ausführen.
Versuchen Sie es mal!
# Press "Run Code" on the top right corner
# Also try to change the code!
1+1
2. Strukturelle Annahmen formulieren I
Theorie des Positive and Negative Affect Schedule (PANAS)
Wir wollen ein Strukturgleichungsmodell für den Positive and Negative Affect Schedule (PANAS) aufstellen. Das Strukturgleichungsmodell soll eine formale Repräsentation bestehender theoretischer Annahmen sein. Im Gegensatz zur exploratorischen Faktorenanalyse brauchen wir für das Strukturgleichungsmodell also spezifische Hypothesen über die Struktur der Daten. Diese können wir beispielsweise aus der Forschungsliteratur ableiten:
“The Positive and Negative Affect Schedule (PANAS) is a 20-item self-report measure of positive and negative affect developed by Watson, Clark, and Tellegen (1988b). NA and PA reflect dispositional dimensions, with high-NA epitomized by subjective distress and unpleasurable engagement, and low NA by the absence of these feelings. By contrast, PA represents the extent to which an individual experiences pleasurable engagement with the environment. Thus, emotions such as enthusiasm and alertness are indicative of high PA, whilst lethargy and sadness characterize low PA (Watson & Clark, 1984).” (Crawford & Henry, 2004)
“The most controversial characteristic of the PANAS is the purported independence of its subscales. It has been argued that it is counter-intuitive to regard happiness and sadness as unrelated constructs (Costa & McCrae, 1980) and indeed all measures of PA and NA developed prior to the PANAS have proven at least moderately negatively correlated.” (Crawford & Henry, 2004)
Der PANAS umfasst also 20 Items und gibt an, sowohl einen Faktor für positiven Affekt (PA) als auch einen Faktor für negativen Affekt (NA) zu erfassen. Jedes der beiden latenten Konstrukte soll auf jeweils 10 Items laden. Es handelt sich also um eine zweifaktorielles Modell mit jeweils 10 Indikatoren. In unserem Modell gehen wir zunächst davon aus (wie ursprünglich in der Theorie angenommen), dass die beiden Subkalen orthogonal (also unabhängig voneinander) sind.
Annahmen in formalisierte graphische Darstellung übertragen
In einem ersten Schritt wollen wir nun unsere theoretischen Annahmen über die Struktur unserer Daten in einem formalen Kausalmodell umsetzten. Die formalisierte Darstellung soll sowohl das Messmodell (Annahmen über die Verknüpfung von manifesten Variablen/Items und den latenten Konstrukten) als auch das Strukturmodell (Annahmen über den Zusammengang der latenten Konstrukte) umfassen. Außerdem soll zwischen latenten und manifesten, gerichteten und ungerichteten Pfaden sowie endogenen und exogenen Variablen unterschieden werden. Dazu verwenden wir die griechischen Bezeichnung der Modellparameter (Lambda (\(\lambda\))= Ladungen von Items, Gamma (\(\gamma\))= Ladungen für latente Variablen, Epsilon (\(\epsilon\)) = Fehler manifester Variablen, Zeta (\(\zeta\)) = Fehlervariablen latenter abhängiger Variablen, Xi (\(\xi\)) = latente unabhängige Variablen, Eta (\(\eta\)) = latente abhängige Variablen, X = Indikatoren von latenten Variablen).
Die Orthogonalität (also Unabhängigkeit) der beiden latenten Faktoren sieht man an der fehlenden Korrelation zwischen beiden Ellipsen. In der Darstellung wurde die “unit loading identification” angewendet, was man an dem gestrichelten Pfad auf die erste Indikatorvariable sieht.
Formalisierung in R
Im nächsten Schritt wollen wir das erstellte Modell in R übertragen. Dazu müssen wir als erstes den Datensatz betrachten, um herauszufinden wie unsere manifesten Variablen X1-X20 benannt sind. Die zugehörigen Items des PANAS finden wir in unserem Datensatz in den Spalten 32 bis 51. Wie wir sehen ist jedes der Items einem der beiden Faktoren PA oder NA zugeordnet.
head(sem_dat[,32:51])
Wir können in unserer formalisierten Darstellung also jede manifeste
Variable X1-X20, aus der Theorie abgeleitet, einem unserer latenten
Konstrukte zuordnen. Dabei werden alle negativen Items einem latenten
Konstrukt und alle positiven Items einem zweiten latenten Konstrukt
zugeordnet. Die latenten Konstrukte können beliebig benannt werden; es
lohnt sich für die Lesbarkeit des Codes möglichst aussagekräftige Namen
zu wählen. (Hinweis: NA
ist ein geschützter Begriff in R,
der für “not available”/ missing value steht. Auch wenn es nahe liegt,
die latenten Faktoren kurz und knackig PA
und
NA
zu bennen, ist letzteres nicht möglich, da
NA
prinzipiell nicht für Variablennamen vergeben werden
darf.)
Modellspezifikation in der lavaan-Syntax
Das aufgestellte Modell können wir nun auch in R spezifizieren, und
zwar in der lavaan-Syntax. Dazu speichern wir in einer neuen
Variable panas1 ein Textobjekt (String), dass die strukturellen
Informationen enthält. Latente Variablen werden mit dem Operator
=~
definiert. Kovarianzen können außerdem mit dem Operator
~~
und Regressionen mit ~
definiert werden.
Den latenten Konstrukten geben wir beliebige (möglichst sinnvolle)
Namen. Die Indikatoren müssen mit den Variablennamen aus unserem
Datensatz gekennzeichnet werden.
panas1_model <- "
Negativer_Affekt =~ NA_bekuemmert + NA_veraergert + NA_schuldig
+ NA_erschrocken + NA_feindselig + NA_gereizt + NA_beschaemt
+ NA_nervoes + NA_durcheinander + NA_aengstlich
Positiver_Affekt =~ PA_aktiv + PA_interessiert + PA_freudig
+ PA_stark + PA_angeregt + PA_stolz + PA_begeistert + PA_wach
+ PA_entschlossen + PA_aufmerksam
"
Visualisierung
Sobald die Modellstruktur in der Stringvariable spezifiziert ist,
können wir diese auch in R graphisch darstellen lassen. Dazu müssen wir
zuerst das eben spezifizierte Modell mit den cfa()
-Funktion
fitten. Mit orthogonal = TRUE
definieren wir, dass die
latenten Variablen in unserem Modell unabhängig voneinander sind, und
entsprechend keine Kovarianzen zwischen den Faktoren aufgenommen werden
sollen (außer wenn diese explizit in unsere Modellspezifizierung
auftauchen).
panas_fit1 <- cfa(model = panas1_model, data = sem_dat, orthogonal = TRUE)
Mit der Funktion semPaths() können wir das gefittete Modell nun
graphisch darstellen. Der Parameter exoCov = FALSE
ist
notwendig um die Faktoren in der Abbildung orthogonal darzustellen
(d.h., ohne Kovarianz). Dieser Parameter ist also das Gegenteil vom
Parameter orthogonal = TRUE
in der
cfa()
-Funktion.
semPaths(panas_fit1, what = "path", whatLabels = "no", style = "lisrel", layout = "tree",
exoCov = FALSE)
Übung 1: Big Five
In den Spalten 54 bis 63 des Datensatzes finden Sie Items einer Big Five Kurzskala, die Persönlichkeit in den Dimensionen Neurotizismus, Extraversion, Offenheit, Verträglichkeit und Gewissenhaftigkeit mit je zwei Items misst. Stellen Sie ein Strukturgleichungsmodell für die hier gemessenen Persönlichkeitsdimensionen auf. Gehen Sie davon aus, dass die 5 Dimensionen orthogonal sind - also unabhängig voneinander. Außerdem sollte die unit loading identification gewählt werden, indem immer der erste Indikator einer latenten Variable auf 1 fixiert wird.
head(sem_dat[, 54:63])
(a) Zeichnen Sie auf Papier das vollständige Strukturgleichungsmodell. Verwenden Sie bei der Kennzeichung der manifesten Variablen die korrekten Variablennamen aus dem Datensatz und benennen Sie die latenten Faktoren sinnvoll. Kennzeichnen Sie außerdem alle fixierten Parameter im Modell.
(b) Spezifizieren Sie die Modellstruktur in der lavaan-Syntax und speichern Sie das Ergebnis in der Variable bigfive_model.
bigfive_model <- "
Neurotizismus =~ N_entspannt + N_unsicher
Extraversion =~ E_reserviert + E_gesellig
Offenheit =~ O_kuenstlerisch + O_fantasie
Vertraeglichkeit =~ V_vertrauen + V_kritisch
Gewissenhaftigkeit =~ G_faul + G_gruendlich
"
(c) Fitten Sie das Modell bigfive mit der
cfa()-Funktion und speichern Sie das Ergebnis in der Variable
bigfive_fit. Lassen Sie sich das berechnete Modell im
Anschluss graphisch mit Hilfe der semPaths
-Funktion
ausgeben. (Hinweis: Beim Fitten des Modells erhalten wir die Warnmeldung
“Could not compute standard errors! The information matrix could not be
inverted. This may be a symptom that the model is not identified”. Diese
ignorieren wir für den Moment; wir werden uns damit in einem späteren
Abschnitt beschäftigen. Das Fitten ist hier nur notwendig, um die
graphische Darstellung anzeigen zu können.)
bigfive_fit <- cfa(model=bigfive_model, data=sem_dat, orthogonal = TRUE)
semPaths(bigfive_fit, what='path', whatLabels='no', style='lisrel', layout='tree', exoCov = FALSE)
3. Strukturelle Annahmen formulieren II
Strukturelle Annahmen formulieren
In unserem vorherigen Modell sind wir davon ausgegangen, dass die 5 Persönlichkeitsfaktoren unabhängig voneinander sind. Untersuchungen deuten jedoch darauf hin, dass es übergeordnete Strukturen zu den 5 Dimensionen gibt.
“Thus, the accumulating evidence strongly suggests the existence of higher-order dimensions in the Big Five personality domain. According to this hypothesis, the higher-order dimensions are organized across two levels. First higher-order level consists of two meta-traits (Big Two), Stability and Plasticity (or Alpha and Beta in Digman’s terms), while the second, highest-order level comprises general factor of personality (GFP or The Big One)”. (Musek, 2007)
In einem Alternativmodell gehen wir nun von einer übergeordenten zweifaktoriellen Struktur aus: Dem Faktor Stabilität auf dem die Dimensionen Neurotizismus, Vertraeglichkeit und Gewissenhaftigkeit laden sollen sowie dem Faktor Plasitizität auf dem Extraversion und Offenheit laden. Die zwei Faktoren sollen zusätzlich auf einem Generalfaktor für Persönlichkeit laden.
Annahmen in formalisierte graphische Darstellung übertragen
Die zuvor exogenen latenten Variablen Neurotizismus, Extraversion, Offenheit, Verträglichkeit und Gewissenhaftigkeit sind in unserem neuen Modell nun zu endogenen latenten Variablen geworden, deren Varianz durch die übergeordenten Faktoren erklärt wird. Sie verfügen deshalb nun über einen Fehlerterm, da deren Varianz nicht zu 100% von dem jeweiligen übergeordneten Faktor vorhergesagt werden wird. Gleiches gilt für die übergeordneten Faktoren Stabilität und Plastizität, deren Varianz durch den übergeordneten Generalfaktor (exogene Variable) erklärt wird. Jeweils der erste Indikator ist gestrichelt dargestellt (also auf 1 fixiert).
Formalisierung in lavaan-Syntax und Visualisierung
Bitte gehen Sie den Code unten durch und versuchen Sie, ihn zu verstehen. Klicken Sie dann rechts oben auf “Run Code”, um den Code auszuführen.
bigone_model <- "
Neurotizismus =~ N_entspannt + N_unsicher
Vertraeglichkeit =~ V_vertrauen + V_kritisch
Gewissenhaftigkeit =~ G_faul + G_gruendlich
Extraversion =~ E_reserviert + E_gesellig
Offenheit =~ O_kuenstlerisch + O_fantasie
Stabilitaet =~ Neurotizismus + Vertraeglichkeit + Gewissenhaftigkeit
Plastizitaet =~ Extraversion + Offenheit
Generalfaktor =~ Stabilitaet + Plastizitaet
"
bigone_fit <- cfa(model=bigone_model, data=sem_dat, orthogonal = TRUE)
semPaths(bigone_fit, what='path', whatLabels='no', style='lisrel', layout='tree2', exoCov = FALSE)
Übung 2: PANAS
Sie haben folgende Information zur Faktorstruktur des PANAS:
“The structure of PANAS, as proposed by the authors, is bi-dimensional, as PA and NA are separate and highly, but not absolutely, independent dimensions (Tellegen et al., 1999; Watson & Clark, 1997). Several studies supported this two-factor structure. […] Alternative three-factor structures with good fit indices have also been proposed and tested by Gaudreau, Sanchez, and Blondin (2006), Killgore (2000) and Mehrabian (1997). Mehrabian (1997) tested a model where PA was maintained as one factor and NA was divided into two conceptually meaningful factors: Afraid (scared, nervous, afraid, guilty, ashamed, and jittery) and Upset (distressed, irritated, hostile, and upset).” (Galinha, Pareira & Esteves, 2013)
(a) Zeichnen Sie das alternative dreifaktorielle Modell von Mehrabian (1997) auf Papier. Verwenden Sie bei der Kennzeichung der manifesten Variablen die korrekten Variablennamen aus dem Datensatz und benennen Sie die latenten Faktoren sinnvoll. Kennzeichnen Sie außerdem alle fixierten Parameter im Modell.
(b) Kennzeichnen Sie in Ihrer Abbildung Messmodell und Strukturmodell. Halten Sie für alle Elemente Ihres Models fest ob es sich um eine manifeste oder latente, endogene oder exogene Variable handelt.
Lösung: Gelbe Pfade = Messmodell, Rote Pfade = Strukturmodell, Blau = Manifeste, enodgene Variablen, Grün = Latente, endogene Variablen, Rot = Latente, exogene Variablen
(c) Erstellen Sie das gezeichnete Modell in R und lassen Sie
es sich graphisch ausgeben. Optional: Um eine übersichtliche
Darstellungsweise für Ihr Modell zu finden können Sie die Parameter
layout
(“tree”, “circle”, “spring”, “tree2”, “circle2”) und
rotation
(1, 2, 3, 4) verändern. Hinweis: Auch hier werden
wir die Warnung “some estimated lv variances are negative” erst mal
ignorieren.
panas2 <- "
# Messmodell (Sie können wie gewohnt mit # Kommentare in die Modellsyntax schreiben)
Afraid =~ NA_aengstlich + NA_nervoes + NA_erschrocken
+ NA_schuldig + NA_beschaemt + NA_bekuemmert
Upset =~ NA_veraergert + NA_feindselig + NA_gereizt
+ NA_durcheinander
Positiver_Affekt =~ PA_aktiv + PA_interessiert + PA_freudig
+ PA_stark + PA_angeregt + PA_stolz + PA_begeistert
+ PA_wach + PA_entschlossen + PA_aufmerksam
Negativer_Affekt =~ Afraid + Upset
# Struktumodell
Negativer_Affekt ~~ Positiver_Affekt
"
panas_fit2 <- cfa(panas2, sem_dat, orthogonal = FALSE)
semPaths(panas_fit2, what='path', whatLabels='no', style='lisrel', layout='tree', rotation=3)
4. Identifizierbarkeit
Zu Beginn wollen wir uns ein ganz einfaches Stukturgleichunsmodell anschauen: Die Facette Offenheit aus der bereits verwendeten Big-Five-Kurzskala. Das Strukturmodell enhält lediglich zwei manifeste Variablen - die Items O_kuenstlerisch und O_fantasie - und das latente Konstrukt Offenheit.
offenheit_model <- "Offenheit =~ O_kuenstlerisch + O_fantasie"
offenheit_fit <- cfa(offenheit_model, sem_dat)
Warning: lavaan->lav_model_vcov():
Could not compute standard errors! The information matrix could not be
inverted. This may be a symptom that the model is not identified.
# plot
semPaths(offenheit_fit, what='path', whatLabels='no', style='lisrel', layout='tree')

Beim Fitten des Modells erhalten wir die Warnmeldung, dass das Modell nicht vollständig geschätzt werden konnte sowie den Hinweis, dass das Modell möglichweise nicht identifiziert ist.
Wir haben in unserem Modell nur zwei manifeste Variablen, daraus ergeben sich drei bekannte Parameter: Die Varianzen der beiden manifesten Variablen und deren Kovarianz. Wir können auch die Formel aus der Vorlesung nutzen:
(2 * (2 + 1) ) / 2
## [1] 3
Wir haben allerdings vier zu schätzende Parameter: Die zwei Fehlervarianzen der manifesten Variablen, eine nicht fixierte Ladung, sowie die Varianz der latenten exogenen Variable Offenheit.
Indem wir die Differenz aus bekannten und unbekannten Parameter nehmen, erhalten wir die Freiheitsgrade unseres Modelltests. Die Freiheitsgrade sind in diesem Fall < 0 (3 bekannte Parameter - 4 unbekannte Parameter). Das Modell ist damit unteridentifiziert und kann nicht geschätzt werden.
Übung 3: Anzahl Parameter und Freiheitsgrade ermitteln
Es soll ein dreifaktorielles Persönlichkeitsmodell überprüft werden, das nur aus den drei Dimensionen Neurotizimus, Extraversion und Offenheit besteht. Die drei Dimensionen sollen auf einen übergeordneten Generalfaktor für Persönlichkeit laden. Zusätzlich werden zwei Methodenfaktoren aufgenommen, von denen angenommen wird, dass die neben den drei Persönlichkeitsdimensionen, Varianz in den manifesten Variablen erklären können. Auf Methodenfaktor1 laden alle negativ gepolten Items. Auf Methodenfaktor2 laden alle Items die zwei inhalte Aspekte abfragen. Das graphische Modell sieht so aus:
Identifizierbarkeit des PANAS
Im vorherigen Abschnitt haben wir uns bereits das zweifaktorielle, orthogonale Modell für den PANAS angeschaut. Wir können nun auch für dieses Modell die Freiheitsgrade berechnen:
panas3_model <- "
Negativer_Affekt =~ NA_bekuemmert + NA_veraergert + NA_schuldig
+ NA_erschrocken + NA_feindselig + NA_gereizt + NA_beschaemt
+ NA_nervoes + NA_durcheinander + NA_aengstlich
Positiver_Affekt =~ PA_aktiv + PA_interessiert + PA_freudig
+ PA_stark + PA_angeregt + PA_stolz + PA_begeistert + PA_wach
+ PA_entschlossen + PA_aufmerksam
"
panas_fit3 <- cfa(model=panas3_model, data=sem_dat, orthogonal = TRUE)
semPaths(panas_fit3, what='path', whatLabels='no', style='lisrel', layout='tree', exoCov = FALSE)
Bekannte Parameter
## [1] 210
Unbekannte Parameter
20 Fehlervarianzen der manifesten Variablen, 18 nicht fixierte Ladungen, zwei Varianzen der exogenenen latenten Variablen. Es gibt also 40 unbekannte Parameter.
Freiheitgrade
Das Modell hat also 170 Freiheitsgrade, ist damit überidentifiziert, und kann von lavaan geschätzt werden.
Metrik der latenten Variablen
Als nächstes werden wir mit dem summary()
-Befehl zum
ersten Mal einen Blick in den Output des Modells werfen. Der Parameter
fit.measures = FALSE
bedeutet, dass keine Fitindizes
gezeigt werden sollen (die schauen wir uns später an), mit
standardized = TRUE
wird im Output zusätzlich die
standardisierte Lösung angezeigt.
## lavaan 0.6-18 ended normally after 36 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 40
##
## Used Total
## Number of observations 916 1222
##
## Model Test User Model:
##
## Test statistic 1190.121
## Degrees of freedom 170
## P-value (Chi-square) 0.000
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt =~
## NA_bekuemmert 1.000 0.561 0.572
## NA_veraergert 1.006 0.071 14.240 0.000 0.565 0.605
## NA_schuldig 0.674 0.049 13.631 0.000 0.379 0.568
## NA_erschrocken 0.861 0.058 14.850 0.000 0.484 0.643
## NA_feindselig 0.650 0.048 13.538 0.000 0.365 0.563
## NA_gereizt 1.062 0.072 14.840 0.000 0.596 0.642
## NA_beschaemt 0.690 0.050 13.775 0.000 0.387 0.577
## NA_nervoes 1.183 0.077 15.274 0.000 0.664 0.671
## NA_durcheinndr 1.092 0.073 14.913 0.000 0.613 0.647
## NA_aengstlich 1.072 0.070 15.409 0.000 0.602 0.680
## Positiver_Affekt =~
## PA_aktiv 1.000 0.517 0.584
## PA_interessirt 0.949 0.066 14.470 0.000 0.491 0.604
## PA_freudig 1.091 0.078 13.984 0.000 0.564 0.577
## PA_stark 1.249 0.082 15.287 0.000 0.646 0.653
## PA_angeregt 0.901 0.075 12.068 0.000 0.466 0.477
## PA_stolz 1.002 0.080 12.484 0.000 0.518 0.497
## PA_begeistert 1.239 0.080 15.519 0.000 0.641 0.668
## PA_wach 1.056 0.075 14.074 0.000 0.546 0.582
## PA_entschlossn 1.323 0.080 16.526 0.000 0.684 0.736
## PA_aufmerksam 1.101 0.070 15.777 0.000 0.569 0.685
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt ~~
## Positivr_Affkt 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .NA_bekuemmert 0.649 0.033 19.744 0.000 0.649 0.673
## .NA_veraergert 0.553 0.028 19.436 0.000 0.553 0.635
## .NA_schuldig 0.300 0.015 19.774 0.000 0.300 0.677
## .NA_erschrocken 0.332 0.017 18.996 0.000 0.332 0.587
## .NA_feindselig 0.287 0.014 19.818 0.000 0.287 0.683
## .NA_gereizt 0.506 0.027 19.005 0.000 0.506 0.588
## .NA_beschaemt 0.301 0.015 19.701 0.000 0.301 0.667
## .NA_nervoes 0.539 0.029 18.602 0.000 0.539 0.550
## .NA_durcheinndr 0.523 0.028 18.943 0.000 0.523 0.582
## .NA_aengstlich 0.421 0.023 18.456 0.000 0.421 0.537
## .PA_aktiv 0.517 0.026 19.646 0.000 0.517 0.659
## .PA_interessirt 0.419 0.022 19.449 0.000 0.419 0.635
## .PA_freudig 0.639 0.032 19.711 0.000 0.639 0.668
## .PA_stark 0.561 0.030 18.868 0.000 0.561 0.573
## .PA_angeregt 0.738 0.036 20.405 0.000 0.738 0.773
## .PA_stolz 0.816 0.040 20.287 0.000 0.816 0.753
## .PA_begeistert 0.510 0.027 18.658 0.000 0.510 0.554
## .PA_wach 0.584 0.030 19.666 0.000 0.584 0.662
## .PA_entschlossn 0.395 0.023 17.357 0.000 0.395 0.458
## .PA_aufmerksam 0.367 0.020 18.394 0.000 0.367 0.531
## Negativr_Affkt 0.315 0.036 8.843 0.000 1.000 1.000
## Positivr_Affkt 0.267 0.029 9.069 0.000 1.000 1.000
Im Output finden wir die geschätzen Ladungen der latenten Variable
(Sektion “Latent Variables”), die Kovarianzen (Sektion “Covariances”)
sowie die (Fehler)Varianzen von manifesten und latenten Variablen
(Sektion “Variances”). Wenn ein Punkt vor dem Variablennamen steht (wie
z.B. bei .NA_bekuemmert
) ist mit dieser Varianzschätzung
die Varianz des Fehlerterms dieser Variable gemeint.
Variablennamen ohne Punkt (wie z.B. Negativr_Affkt
) meinen
die Varianz dieser latenten Variable selbst. Lange Variablennamen werden
im Output übrigens automatisch abgekürzt, damit es besser auf den
Bildschirm passt. Also nicht wundern, wenn die Namen nicht exakt mit
denen in der Modellsyntax übereinstimmen.
Unter Degrees of Freedom können wir ablesen, dass unsere Berechnung der Freiheitsgrade (df = 170) korrekt war.
Wie wir sehen ist immer die erste Ladung jeder latenten Variable auf
1 fixiert. Dies dient nicht nur der Identifizierbarkeit des Modells,
sondern gibt der latenten Variable auch eine Metrik. Die erste Ladung
jeder latenten Variable ist somit die Einheit in der alle anderen
Ladungen ausgegeben werden. Für die latenten Variable Negativer
Affekt ist die Ladung von NA_bekuemmert die festgelegte
Maßeinheit. Die Ladung von NA_verärgert ist also 1.006 mal so
hoch wie der Ladung NA_bekuemmert und die Ladung von
NA_schuldig ist dagegen nur 0.674 mal so hoch wie Ladung von
NA_bekuemmert.
Wenn nichts anderes angegeben ist, fixiert lavaan automatisch die Ladung vom jeweils ersten spezifizierten Indikator. Wir können eine andere Ladung in unserem Modell fixieren, indem wir eine andere manifeste Variable an erste Stelle in unserer Modellspezifikation schreiben.
Eine andere Möglichkeit ist es, die entsprechende manifeste Variable
mit 1 zu gewichten, indem wir 1*
vor den Indikator
schreiben. Dann müssen wir außerdem die erste Ladung, die sonst
standardmäßig auf 1 fixiert wird, mit NA
gewichten (not
available - nicht “negativer Affekt!”). Wenn wir statt
NA_bekuemmert die Ladung von NA_schuldig auf 1
fixieren, erhalten wir nun eine andere Metrik.
panas4_model <- "
Negativer_Affekt =~ NA*NA_bekuemmert + NA_veraergert + 1*NA_schuldig
+ NA_erschrocken + NA_feindselig + NA_gereizt + NA_beschaemt
+ NA_nervoes + NA_durcheinander + NA_aengstlich
Positiver_Affekt =~ PA_aktiv + PA_interessiert + PA_freudig
+ PA_stark + PA_angeregt + PA_stolz + PA_begeistert + PA_wach
+ PA_entschlossen + PA_aufmerksam
"
panas_fit4 <- cfa(panas4_model, sem_dat, orthogonal = TRUE)
summary(panas_fit4, fit.measures = FALSE, standardized = TRUE)
## lavaan 0.6-18 ended normally after 39 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 40
##
## Used Total
## Number of observations 916 1222
##
## Model Test User Model:
##
## Test statistic 1190.121
## Degrees of freedom 170
## P-value (Chi-square) 0.000
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt =~
## NA_bekuemmert 1.483 0.109 13.631 0.000 0.561 0.572
## NA_veraergert 1.491 0.105 14.173 0.000 0.565 0.605
## NA_schuldig 1.000 0.379 0.568
## NA_erschrocken 1.277 0.086 14.775 0.000 0.484 0.643
## NA_feindselig 0.964 0.071 13.480 0.000 0.365 0.563
## NA_gereizt 1.575 0.107 14.764 0.000 0.596 0.642
## NA_beschaemt 1.023 0.075 13.715 0.000 0.387 0.577
## NA_nervoes 1.755 0.116 15.192 0.000 0.664 0.671
## NA_durcheinndr 1.620 0.109 14.836 0.000 0.613 0.647
## NA_aengstlich 1.590 0.104 15.325 0.000 0.602 0.680
## Positiver_Affekt =~
## PA_aktiv 1.000 0.517 0.584
## PA_interessirt 0.949 0.066 14.470 0.000 0.491 0.604
## PA_freudig 1.091 0.078 13.984 0.000 0.564 0.577
## PA_stark 1.249 0.082 15.287 0.000 0.646 0.653
## PA_angeregt 0.901 0.075 12.068 0.000 0.466 0.477
## PA_stolz 1.002 0.080 12.484 0.000 0.518 0.497
## PA_begeistert 1.239 0.080 15.519 0.000 0.641 0.668
## PA_wach 1.056 0.075 14.074 0.000 0.546 0.582
## PA_entschlossn 1.323 0.080 16.526 0.000 0.684 0.736
## PA_aufmerksam 1.101 0.070 15.777 0.000 0.569 0.685
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt ~~
## Positivr_Affkt 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .NA_bekuemmert 0.649 0.033 19.744 0.000 0.649 0.673
## .NA_veraergert 0.553 0.028 19.436 0.000 0.553 0.635
## .NA_schuldig 0.300 0.015 19.774 0.000 0.300 0.677
## .NA_erschrocken 0.332 0.017 18.996 0.000 0.332 0.587
## .NA_feindselig 0.287 0.014 19.818 0.000 0.287 0.683
## .NA_gereizt 0.506 0.027 19.005 0.000 0.506 0.588
## .NA_beschaemt 0.301 0.015 19.701 0.000 0.301 0.667
## .NA_nervoes 0.539 0.029 18.602 0.000 0.539 0.550
## .NA_durcheinndr 0.523 0.028 18.943 0.000 0.523 0.582
## .NA_aengstlich 0.421 0.023 18.456 0.000 0.421 0.537
## .PA_aktiv 0.517 0.026 19.646 0.000 0.517 0.659
## .PA_interessirt 0.419 0.022 19.449 0.000 0.419 0.635
## .PA_freudig 0.639 0.032 19.711 0.000 0.639 0.668
## .PA_stark 0.561 0.030 18.868 0.000 0.561 0.573
## .PA_angeregt 0.738 0.036 20.405 0.000 0.738 0.773
## .PA_stolz 0.816 0.040 20.287 0.000 0.816 0.753
## .PA_begeistert 0.510 0.027 18.658 0.000 0.510 0.554
## .PA_wach 0.584 0.030 19.666 0.000 0.584 0.662
## .PA_entschlossn 0.395 0.023 17.357 0.000 0.395 0.458
## .PA_aufmerksam 0.367 0.020 18.394 0.000 0.367 0.531
## Negativr_Affkt 0.143 0.016 8.779 0.000 1.000 1.000
## Positivr_Affkt 0.267 0.029 9.069 0.000 1.000 1.000
Eine neue Metrik ändert nichts am gesamten Modellfit (siehe nächster Abschnitt), wie man am “Model Test User Model” erkennen kann (selber \(\chi^2\)-Wert, selber p-Wert). Beide Modelle sind algebraisch äquivalent, haben durch die andere Metrik aber eine andere Interpretation.
5. Modellfit überprüfen
Mithilfe von Fitindizes können wir nun überprüfen, ob unsere
spezifizierte Struktur zu den Daten passt bzw. ob die modellimplizierte
und die empirische Kovarianzmatrix signifikant voneinander abweichen.
Dazu fitten wir unser Modell und lassen uns das Ergebnis mit Fitindizes
(fit.measures = TRUE
) und standardisierten Modellparametern
(standardized = TRUE
) ausgeben.
Wir testen hier das weniger strikte PANAS-Modell, das eine
Korrelation der latenten Faktoren zulässt
(orthogonal = FALSE
):
panas5_model <- "
Negativer_Affekt =~ NA_bekuemmert + NA_veraergert + NA_schuldig
+ NA_erschrocken + NA_feindselig + NA_gereizt + NA_beschaemt
+ NA_nervoes + NA_durcheinander + NA_aengstlich
Positiver_Affekt =~ PA_aktiv + PA_interessiert + PA_freudig
+ PA_stark + PA_angeregt + PA_stolz + PA_begeistert + PA_wach
+ PA_entschlossen + PA_aufmerksam
Negativer_Affekt ~~ Positiver_Affekt
"
panas_fit5 <- cfa(model=panas5_model, data=sem_dat, orthogonal = FALSE)
summary(panas_fit5, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-18 ended normally after 37 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 41
##
## Used Total
## Number of observations 916 1222
##
## Model Test User Model:
##
## Test statistic 1150.442
## Degrees of freedom 169
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 6376.125
## Degrees of freedom 190
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.841
## Tucker-Lewis Index (TLI) 0.822
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -21020.505
## Loglikelihood unrestricted model (H1) -20445.284
##
## Akaike (AIC) 42123.010
## Bayesian (BIC) 42320.630
## Sample-size adjusted Bayesian (SABIC) 42190.420
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.080
## 90 Percent confidence interval - lower 0.075
## 90 Percent confidence interval - upper 0.084
## P-value H_0: RMSEA <= 0.050 0.000
## P-value H_0: RMSEA >= 0.080 0.449
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.063
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt =~
## NA_bekuemmert 1.000 0.565 0.576
## NA_veraergert 0.994 0.070 14.273 0.000 0.562 0.601
## NA_schuldig 0.669 0.049 13.692 0.000 0.378 0.568
## NA_erschrocken 0.852 0.057 14.899 0.000 0.481 0.640
## NA_feindselig 0.644 0.047 13.593 0.000 0.364 0.562
## NA_gereizt 1.050 0.071 14.890 0.000 0.593 0.639
## NA_beschaemt 0.681 0.049 13.785 0.000 0.385 0.573
## NA_nervoes 1.177 0.076 15.391 0.000 0.665 0.672
## NA_durcheinndr 1.092 0.072 15.067 0.000 0.617 0.651
## NA_aengstlich 1.072 0.069 15.575 0.000 0.606 0.684
## Positiver_Affekt =~
## PA_aktiv 1.000 0.521 0.588
## PA_interessirt 0.941 0.065 14.543 0.000 0.490 0.603
## PA_freudig 1.080 0.077 14.034 0.000 0.562 0.575
## PA_stark 1.238 0.081 15.363 0.000 0.644 0.652
## PA_angeregt 0.884 0.074 12.000 0.000 0.460 0.471
## PA_stolz 0.986 0.079 12.448 0.000 0.513 0.493
## PA_begeistert 1.229 0.079 15.606 0.000 0.640 0.667
## PA_wach 1.056 0.074 14.226 0.000 0.550 0.585
## PA_entschlossn 1.318 0.079 16.691 0.000 0.686 0.739
## PA_aufmerksam 1.096 0.069 15.908 0.000 0.570 0.686
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt ~~
## Positivr_Affkt -0.070 0.012 -5.653 0.000 -0.239 -0.239
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .NA_bekuemmert 0.645 0.033 19.728 0.000 0.645 0.669
## .NA_veraergert 0.557 0.029 19.484 0.000 0.557 0.638
## .NA_schuldig 0.301 0.015 19.794 0.000 0.301 0.678
## .NA_erschrocken 0.334 0.018 19.053 0.000 0.334 0.590
## .NA_feindselig 0.287 0.014 19.840 0.000 0.287 0.684
## .NA_gereizt 0.509 0.027 19.061 0.000 0.509 0.591
## .NA_beschaemt 0.303 0.015 19.750 0.000 0.303 0.672
## .NA_nervoes 0.538 0.029 18.613 0.000 0.538 0.549
## .NA_durcheinndr 0.518 0.027 18.915 0.000 0.518 0.577
## .NA_aengstlich 0.416 0.023 18.415 0.000 0.416 0.532
## .PA_aktiv 0.514 0.026 19.628 0.000 0.514 0.655
## .PA_interessirt 0.419 0.022 19.476 0.000 0.419 0.636
## .PA_freudig 0.641 0.032 19.742 0.000 0.641 0.670
## .PA_stark 0.563 0.030 18.914 0.000 0.563 0.575
## .PA_angeregt 0.743 0.036 20.445 0.000 0.743 0.778
## .PA_stolz 0.821 0.040 20.325 0.000 0.821 0.757
## .PA_begeistert 0.511 0.027 18.704 0.000 0.511 0.556
## .PA_wach 0.580 0.029 19.647 0.000 0.580 0.657
## .PA_entschlossn 0.391 0.023 17.334 0.000 0.391 0.454
## .PA_aufmerksam 0.366 0.020 18.404 0.000 0.366 0.530
## Negativr_Affkt 0.319 0.036 8.918 0.000 1.000 1.000
## Positivr_Affkt 0.271 0.030 9.149 0.000 1.000 1.000
Im ersten Teil des Outputs können wir nun folgende Informationen ablesen:
Exakter Modellfit (siehe “Model Test User Model”)
Der Chi-Quadrat-Test ist signifikant (p < 0.05). Wir müssen also die H0 ablehnen, da modellimplizierte und empirische Kovarianzmatrix signifikant voneinander abweichen. Dabei sollte beachtet werden, dass bei einer großen Stichprobe wie im vorliegenden Fall (n = 916) bereits kleinere Abweichungen zu einem signifikanten Modelltest führen können.
Relativer Modellfit im Vergleich zu Nullmodell (in dem alle Variablen unkorreliert sind)
Der Comparative-Fit-Index (CFI) liegt mit einem Wert von 0.841 unter den Empfehlung von > .95.
Absoluter Modellfit
RMSEA liegt mit 0.080 für einer Stichprobe mit n > 250 über dem empfohlenen Wert von <= .06. Nur der SRMR liegt mit 0.063 unter dem empfohlenen Cut-off-Wert von <= .11.
Insgesamt müssten wir das Modell also ablehen, da sowohl Chi-Quadrat-Test, CFI als auch RMSEA für einen schlechten Modellfit sprechen.
Lokaler Modellfit
Wir können außerdem den lokalen Fit des Modells betrachten, denn auch wenn das Modell als global passend bewertet würde, kann das Modell an einzelnen Stellen nicht korrekt spezifiziert sein (z.B. manifeste Variablen laden nicht signifikant auf latente Konstrukte, spezifizierte Kovarianzen sind nicht signifikant). Bei einer schlechten Modellpassung können wir außerdem ablesen, ob einige der Items eventuell unpassend oder fehlspezifiziert sind.
In vorliegenen Fall werden alle spezifizierten Ladungen auch signifikant. Die manifesten Variablen sind also tatsächlich Indikatoren für die latenten Konstrukte.
Standardisierte Werte
Mit dem Argument standardized = TRUE
in der
summary()
-Funktion werden uns außerdem standardisierte
Ladungen und Varianzen ausgegeben (siehe Spalte
Std.all
).
Um die Angaben der standardisierten Lösung besser zu veranschaulichen, schauen wir uns die Definitions- und Strukturgleichung für eine einzelne manifeste Variable in einem Modell wie unserem getesteten an. Nachdem wir für beide latenten Variablen ein eindimensionales Modell haben, sehen für jede manifeste Variable \(X_j\) (\(j\) = 1 … 20) die Gleichungen ähnlich aus:
\[ \begin{aligned} &\text{Definitionsgleichung: } &X_{ji} &= \lambda_j * \xi_i + \epsilon_{ji} \\ &\text{Strukturgleichung: } &Var(X_j) &= \lambda_j^2 * Var(\xi) + Var(\epsilon_j) \end{aligned} \] Im standardisierten Fall werden die Varianzen aller manifester und latenter Variablen - aber nicht der Fehlervariablen - auf 1 skaliert. Damit vereinfachen sich die Strukturgleichungen erheblich: \[ \begin{aligned} &\text{Standardisierte Varianzen: }\\ && Var(X_j)_{std} &= 1 \\ && Var(\xi)_{std} &= 1 \\ &\text{Strukturgleichung:}&\\ &&Var(X_j)_{std} &= \lambda_{j, std}^2 * Var(\xi)_{std} + Var(\epsilon_j)_{std} \\ &\text{Eingesetzt:}&\\ &&1&= \lambda_{j, std}^2 + Var(\epsilon_j)_{std} \end{aligned} \]
Wir sehen also, dass sich die Varianz einer endogenen Variable aus zwei Teilen zusammensetzt. Der systematische Teil geht auf den Einfluss einer Variablen zurück, im Beispiel auf \(\xi\). Wie stark der systematische Anteil der Varianz der endogenen Variablen ist, können wir mit der quadrierten standardisierten Ladung berechnen. Der unsystematische Teil geht auf den Einfluss des Fehlers zurück. Die Varianz dieses Teils wird mit der standardisierten Fehlervarianz berechnet. Wir sehen auch, dass ich den systematischen aus dem unsystematischen Teil berechnen kann, wenn ich - wie im standardisierten Fall - weiß, dass sich beide zu genau 1 addieren.
Ladungen
Mithilfe der standardisierten Werte können die Ladungen untereinander verglichen werden. Wenn wir also wie oben beschrieben den systematischen Varianzanteil abschätzen wollen, können wir durch Quadrieren der standardisierten Ladung also ablesen, dass 32.2 % der Varianz des Items NA_schuldig durch die latente Variable Negativer Affekt aufgeklärt wird.
0.568^2
## [1] 0.322624
Varianzen
Im Abschnitt Variances finden wir nun auch die standisierten Fehlervarianzen (die mit einem Punkt vor dem Variablennamen) und Varianzen der latenten exogenen Variablen. Die standardisierte Fehlervarianz von NA_schuldig können wir nun als Schätzung des unsystematischen Anteils zum oben berechneten systematischen Teils addieren und erhalten - wie erwartet - als Summe 1.
0.678 + 0.322
## [1] 1
Den systematischen Varianzanteil der latenten Variable (der nicht auf den Fehler zurückgeht) können wir also auch einfach durch das Subtrahieren der Fehlervarianz von 1 erhalten.
1 - 0.678
## [1] 0.322
Verletzung der Annahme normalverteilter Daten
Bei der Verletzung der Annahme der Normalverteilung fallen die
geschätzen \(\chi^2\)-Werte überhöht
aus, was dazu führen kann, dass ein passendes Modell abgelehnt wird. In
diesem Fall können wir die Bollen-Stine Bootstrap-Methode anwenden
(test='Bollen.Stine'
) um einen korrigierten p-Wert für den
Modellfit zu erhalten. Unser neuer korrigierter p-Wert ist jedoch auch
signifikant, d.h. dass der schlechte Fit des Modells nicht auf die
schiefe Verteilung der Daten zurückzuführen ist. Für die Bewertung des
lokalen Modellfits können wir uns außerdem die Standardfehler mit der
Bootstrap-Methoden schätzen lassen (se = "bootstrap"
).
panas_fit5_bootstrap <- cfa(panas5_model, sem_dat, orthogonal = FALSE, test='Bollen.Stine',
bootstrap=1000, se = "bootstrap")
summary(panas_fit5_bootstrap, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-12 ended normally after 37 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 41
##
## Used Total
## Number of observations 916 1222
##
## Model Test User Model:
##
## Test statistic 1150.442
## Degrees of freedom 169
## P-value (Chi-square) 0.000
##
## Test statistic 1150.442
## Degrees of freedom 169
## P-value (Bollen-Stine bootstrap) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 6376.125
## Degrees of freedom 190
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.841
## Tucker-Lewis Index (TLI) 0.822
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -21020.505
## Loglikelihood unrestricted model (H1) -20445.284
##
## Akaike (AIC) 42123.010
## Bayesian (BIC) 42320.630
## Sample-size adjusted Bayesian (BIC) 42190.420
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.080
## 90 Percent confidence interval - lower 0.075
## 90 Percent confidence interval - upper 0.084
## P-value RMSEA <= 0.05 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.063
##
## Parameter Estimates:
##
## Standard errors Bootstrap
## Number of requested bootstrap draws 1000
## Number of successful bootstrap draws 1000
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt =~
## NA_bekuemmert 1.000 0.565 0.576
## NA_veraergert 0.994 0.087 11.392 0.000 0.562 0.601
## NA_schuldig 0.669 0.078 8.582 0.000 0.378 0.568
## NA_erschrocken 0.852 0.078 10.893 0.000 0.481 0.640
## NA_feindselig 0.644 0.070 9.195 0.000 0.364 0.562
## NA_gereizt 1.050 0.086 12.266 0.000 0.593 0.639
## NA_beschaemt 0.681 0.076 8.952 0.000 0.385 0.573
## NA_nervoes 1.177 0.096 12.203 0.000 0.665 0.672
## NA_durcheinndr 1.092 0.087 12.567 0.000 0.617 0.651
## NA_aengstlich 1.072 0.082 13.050 0.000 0.606 0.684
## Positiver_Affekt =~
## PA_aktiv 1.000 0.521 0.588
## PA_interessirt 0.941 0.069 13.684 0.000 0.490 0.603
## PA_freudig 1.080 0.077 14.046 0.000 0.562 0.575
## PA_stark 1.238 0.081 15.366 0.000 0.644 0.652
## PA_angeregt 0.884 0.076 11.614 0.000 0.460 0.471
## PA_stolz 0.986 0.079 12.431 0.000 0.513 0.493
## PA_begeistert 1.229 0.080 15.312 0.000 0.640 0.667
## PA_wach 1.056 0.079 13.314 0.000 0.550 0.585
## PA_entschlossn 1.318 0.077 17.200 0.000 0.686 0.739
## PA_aufmerksam 1.096 0.069 15.858 0.000 0.570 0.686
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt ~~
## Positivr_Affkt -0.070 0.015 -4.652 0.000 -0.239 -0.239
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .NA_bekuemmert 0.645 0.040 16.082 0.000 0.645 0.669
## .NA_veraergert 0.557 0.037 14.975 0.000 0.557 0.638
## .NA_schuldig 0.301 0.024 12.464 0.000 0.301 0.678
## .NA_erschrocken 0.334 0.028 11.820 0.000 0.334 0.590
## .NA_feindselig 0.287 0.027 10.789 0.000 0.287 0.684
## .NA_gereizt 0.509 0.034 15.099 0.000 0.509 0.591
## .NA_beschaemt 0.303 0.031 9.925 0.000 0.303 0.672
## .NA_nervoes 0.538 0.037 14.421 0.000 0.538 0.549
## .NA_durcheinndr 0.518 0.038 13.579 0.000 0.518 0.577
## .NA_aengstlich 0.416 0.027 15.170 0.000 0.416 0.532
## .PA_aktiv 0.514 0.029 17.985 0.000 0.514 0.655
## .PA_interessirt 0.419 0.024 17.332 0.000 0.419 0.636
## .PA_freudig 0.641 0.035 18.193 0.000 0.641 0.670
## .PA_stark 0.563 0.036 15.745 0.000 0.563 0.575
## .PA_angeregt 0.743 0.040 18.559 0.000 0.743 0.778
## .PA_stolz 0.821 0.044 18.614 0.000 0.821 0.757
## .PA_begeistert 0.511 0.030 16.836 0.000 0.511 0.556
## .PA_wach 0.580 0.036 16.133 0.000 0.580 0.657
## .PA_entschlossn 0.391 0.028 14.186 0.000 0.391 0.454
## .PA_aufmerksam 0.366 0.025 14.433 0.000 0.366 0.530
## Negativr_Affkt 0.319 0.043 7.475 0.000 1.000 1.000
## Positivr_Affkt 0.271 0.031 8.838 0.000 1.000 1.000
Übung 4: Modellfit und aufgeklärte Varianz
Fitten Sie ein alternatives PANAS-Modell namens
panas6_model
, in dem die negativen Items auf zwei latenten
Faktoren Upset (NA_durcheinander, NA_veraergert, NA_feindselig,
NA_gereizt) und Afraid (NA_schuldig, NA_erschrocken,
NA_beschaemt, NA_nervoes, NA_bekuemmert, NA_aengstlich) laden. Lassen
Sie alle latenten Konstrukte jeweils miteinander korrelieren.
Achtung: Im Code-Fenster steht die Syntax vom
alten Modell panas5_model
. Das können Sie
als Vorlage nehmen, um daraus das alternative Modell, wie oben
beschrieben, zu erstellen. Als Hilfe können Sie auf “Solution” klicken,
dahinter verbirgt sich die Musterlösung.
# TODO: Das ist noch das alte Modell "panas5_model"
panas6_model <- "
Negativer_Affekt =~ NA_bekuemmert + NA_veraergert + NA_schuldig
+ NA_erschrocken + NA_feindselig + NA_gereizt + NA_beschaemt
+ NA_nervoes + NA_durcheinander + NA_aengstlich
Positiver_Affekt =~ PA_aktiv + PA_interessiert + PA_freudig
+ PA_stark + PA_angeregt + PA_stolz + PA_begeistert + PA_wach
+ PA_entschlossen + PA_aufmerksam
Negativer_Affekt ~~ Positiver_Affekt
"
panas_fit6 <- cfa(panas6_model, sem_dat, orthogonal = FALSE)
summary(panas_fit6, standardized = TRUE, fit.measures = TRUE)
panas6_model <- "
Neg_Upset =~ NA_durcheinander + NA_veraergert + NA_feindselig
+ NA_gereizt
Neg_Afraid =~ NA_schuldig + NA_erschrocken + NA_beschaemt
+ NA_nervoes + NA_bekuemmert + NA_aengstlich
Positiver_Affekt =~ PA_aktiv + PA_interessiert + PA_freudig
+ PA_stark + PA_angeregt + PA_stolz + PA_begeistert
+ PA_wach + PA_entschlossen + PA_aufmerksam
Neg_Upset ~~ Neg_Afraid
Neg_Upset ~~ Positiver_Affekt
Neg_Afraid ~~ Positiver_Affekt
"
panas_fit6 <- cfa(panas6_model, sem_dat, orthogonal = FALSE)
summary(panas_fit6, standardized = TRUE, fit.measures = TRUE)
Für die Beantwortung der folgenden Fragen stellen Sie sicher, dass Sie das korrekte Modell gefittet haben, so wie es in der Musterlösung definiert wurde.
Wenn Sie die Ergebnisse der Modellfits betrachten …
6. Modellvergleich
Nicht geschachtelte Modelle
Als nächsten wollen wir die zwei Modelle panas5_model
und panas6_model
miteinander vergleichen und die Frage
beantworten, welches der beiden Modelle besser zu unseren Daten passt.
In diesem Fall liegen keine geschachtelten Modelle vor, also können wir
die Modelle anhand ihrer AIC-Werte vergleichen.
Modell1: 42123.010
Modell2: 42115.458
Da das Modell2 (relativ zu Modell1) einen geringeren AIC-Wert aufweist (\(\Delta AIC = 7.552\)), können wir schließen, dass dieses Modell besser auf unsere Daten passt. Da die Differenz in den AIC-Werten > 6 ist, würden wir klar das Modell2 bevorzugen. Die absolute Höhe der AICs ist irrelevant - es geht lediglich um die Differenz zwischen zwei Modellen!
Geschachtelte Modelle
Als nächstes wollen wir unser zweifaktorielles, orthogonales
PANAS-Modell mit einem reduzierterem Modell vergleichen, indem wir alle
Ladungen der manifesten Variablen auf denselben Wert fixieren
(panas7_model
). Dieses Modell würde den Annahmen eines
tau-äquivalenten Messmodells entsprechen, in dem alle manifesten
Variablen gleich stark auf dem latenten Konstrukt laden.
In der Syntax setzen wir das Gewicht a
vor alle Items
eines Faktors. D.h., das ist ein freier Parameter (mit dem Namen “a”)
der auch frei geschätzt wird - aber eben mit dem gleichen Gewicht für
alle Items. Analog setzen wir die Gewichte aller Items des anderen
Faktors auf eine andere Variable b
.
panas7_model <- "
Negativer_Affekt =~ a*NA_bekuemmert + a*NA_veraergert + a*NA_schuldig
+ a*NA_erschrocken + a*NA_feindselig + a*NA_gereizt + a*NA_beschaemt
+ a*NA_nervoes + a*NA_durcheinander + a*NA_aengstlich
Positiver_Affekt =~ b*PA_aktiv + b*PA_interessiert + b*PA_freudig
+ b*PA_stark + b*PA_angeregt + b*PA_stolz + b*PA_begeistert + b*PA_wach
+ b*PA_entschlossen + b*PA_aufmerksam
"
panas_fit7 <- cfa(model=panas7_model, data=sem_dat, orthogonal = TRUE)
summary(panas_fit7, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-18 ended normally after 28 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 22
##
## Used Total
## Number of observations 916 1222
##
## Model Test User Model:
##
## Test statistic 1443.509
## Degrees of freedom 188
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 6376.125
## Degrees of freedom 190
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.797
## Tucker-Lewis Index (TLI) 0.795
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -21167.038
## Loglikelihood unrestricted model (H1) -20445.284
##
## Akaike (AIC) 42378.076
## Bayesian (BIC) 42484.117
## Sample-size adjusted Bayesian (SABIC) 42414.248
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.085
## 90 Percent confidence interval - lower 0.081
## 90 Percent confidence interval - upper 0.090
## P-value H_0: RMSEA <= 0.050 0.000
## P-value H_0: RMSEA >= 0.080 0.985
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.107
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt =~
## NA_bekmmrt (a) 1.000 0.488 0.509
## NA_verrgrt (a) 1.000 0.488 0.542
## NA_schuldg (a) 1.000 0.488 0.679
## NA_rschrck (a) 1.000 0.488 0.655
## NA_fendslg (a) 1.000 0.488 0.681
## NA_gereizt (a) 1.000 0.488 0.551
## NA_beschmt (a) 1.000 0.488 0.679
## NA_nervoes (a) 1.000 0.488 0.527
## NA_drchnnd (a) 1.000 0.488 0.542
## NA_ngstlch (a) 1.000 0.488 0.581
## Positiver_Affekt =~
## PA_aktiv (b) 1.000 0.568 0.623
## PA_ntrssrt (b) 1.000 0.568 0.667
## PA_freudig (b) 1.000 0.568 0.578
## PA_stark (b) 1.000 0.568 0.597
## PA_angergt (b) 1.000 0.568 0.554
## PA_stolz (b) 1.000 0.568 0.531
## PA_begstrt (b) 1.000 0.568 0.615
## PA_wach (b) 1.000 0.568 0.598
## PA_ntschls (b) 1.000 0.568 0.652
## PA_afmrksm (b) 1.000 0.568 0.683
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## Negativer_Affekt ~~
## Positivr_Affkt 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .NA_bekuemmert 0.683 0.034 20.305 0.000 0.683 0.741
## .NA_veraergert 0.575 0.029 20.098 0.000 0.575 0.707
## .NA_schuldig 0.278 0.015 18.701 0.000 0.278 0.539
## .NA_erschrocken 0.317 0.017 19.033 0.000 0.317 0.571
## .NA_feindselig 0.275 0.015 18.672 0.000 0.275 0.536
## .NA_gereizt 0.548 0.027 20.035 0.000 0.548 0.697
## .NA_beschaemt 0.278 0.015 18.701 0.000 0.278 0.538
## .NA_nervoes 0.621 0.031 20.195 0.000 0.621 0.722
## .NA_durcheinndr 0.573 0.029 20.094 0.000 0.573 0.706
## .NA_aengstlich 0.467 0.024 19.797 0.000 0.467 0.662
## .PA_aktiv 0.507 0.026 19.480 0.000 0.507 0.612
## .PA_interessirt 0.401 0.021 18.968 0.000 0.401 0.554
## .PA_freudig 0.641 0.032 19.881 0.000 0.641 0.665
## .PA_stark 0.582 0.029 19.726 0.000 0.582 0.643
## .PA_angeregt 0.729 0.036 20.065 0.000 0.729 0.693
## .PA_stolz 0.822 0.041 20.217 0.000 0.822 0.718
## .PA_begeistert 0.530 0.027 19.561 0.000 0.530 0.622
## .PA_wach 0.580 0.029 19.722 0.000 0.580 0.643
## .PA_entschlossn 0.435 0.023 19.160 0.000 0.435 0.575
## .PA_aufmerksam 0.368 0.020 18.746 0.000 0.368 0.533
## Negativr_Affkt 0.239 0.013 18.248 0.000 1.000 1.000
## Positivr_Affkt 0.322 0.018 18.369 0.000 1.000 1.000
Fitindizes
Chi-Quadrat-Test: Signifikant -> Spricht gegen den Modellfit!
CFI: 0.797 < .95 -> Spricht gegen den Modellfit!
RMSEA: 0.085 >0.06 -> Spricht gegen den Modellfit!
SRMR: 0.107 < .11 -> Spricht für den Modellfit!
Unsere zwei Modelle panas_fit5 und panas_fit7 sind geschachtelt, d.h.
wir können unser komplexeres Modell panas_fit5 durch Parameterfixierung
in unser einfacheres Modell panas_fit7 transformieren. Mit der
anova()
-Funktion können wir die geschachtelten Modelle
miteinander vergleichen und erhalten dafür einen Signifikanztest:
anova(panas_fit5, panas_fit7)
Das einfachere Modell (d.h., das mit weniger freien Parametern und entsprechend mehr Df) bildet die Daten immer schlechter ab als ein komplexeres Modell. Die Frage ist nur: Ist das einfache Modell signifikant schlechter als das komplexe Modell? Im vorliegenden Fall ist der \(\chi^2\)-Test signifikant (p < 0.05). Unser ursprüngliches (komplexeres) Modell (panas_fit5) ist also signifkant besser als das Modell mit den fixierten Ladungen (panas_fit7). Neben den Signfikanzwert können wir außerdem wieder die AIC-Werte interpretieren. Diese liegen für unser erstes Modell panas_fit5 deutlich unter den Werte des neuen Modells (panas_fit7), \(\Delta AIC = 255\). Der Modellvergleich per AIC kommt also zum gleichen Schluss.
Übung 5: Modellvergleich
Wir wollen nun panas_fit6 und panas_fit7 miteinander vergleichen. Zur Erinnerung sind hier noch mal die grafischen Repräsentationen:
Führen Sie nun einen Modellvergleich von panas_fit6 und panas_fit7 durch:
anova(panas_fit6, panas_fit7)