Skip to Tutorial Content

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.

Die Ladungen der gestrichelten Pfade sind auf 1 fixiert.

(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)

SEM Tutorial