Strukturgleichungsmodelle mit R lavaan
1. Einführung

Arndt Regorz, Dipl. Kfm. & MSc. Psychologie, 29.03.2022

Dieses ist eine Begleitseite zum Video-Tutorial über Strukturgleichungsmodelle mit lavaan.



(Hinweis: Mit Anklicken des Videos wird ein Angebot des Anbieters YouTube genutzt.)


R-Code aus dem Video-Tutorial

Hier ist der gesamte Code aus dem Video-Tutorial.

Das Tutorial beruht auf dem sogenannten Two-Step-Approach. Dabei wird im Step 1 das Messmodell für die latenten Variablen überprüft und erst im Step 2 dann auch das Strukturmodell. Der Step 1 des Two-Step-Approach ist im Grunde eine konfirmatorische Faktorenanalyse (CFA), bei der geprüft wird, ob das vermutete Messmodell der latenten Variablen mit den Daten übereinstimmt. Erst wenn das der Fall ist, wird in Step 2 auch das Strukturmodell mit in die Analyse einbezogen. So können getrennt evtl. Fitprobleme in Messmodell und Strukturmodell identifiziert und ggf. bereinigt werden.

library(lavaan)

head(PoliticalDemocracy)

# Step 1: Überprüfung des Messmodells

messmodell <- '
# Faktorladungen
Industrialisierung1960 =~ x1 + x2 + x3
Demokratie1960 =~ y1 + y2 + y3 + y4
Demokratie1965 =~ y5 + y6 + y7 + y8

#Kovarianzen
y1 ~~ y5
y2 ~~ y6
y3 ~~ y7
y4 ~~ y8
'

model_fit1 <- sem(data = PoliticalDemocracy, model = messmodell)

summary(model_fit1, fit.measures = TRUE, standardized = TRUE)

mi <- modindices(model_fit1)
mi[mi$mi > 10,]

# Einschub aus didaktischen Gründen: Wenn uns der Fit noch nicht reichen würde...

mi[mi$mi > 5,]

messmodell2 <- '
# Faktorladungen
Industrialisierung1960 =~ x1 + x2 + x3
Demokratie1960 =~ y1 + y2 + y3 + y4
Demokratie1965 =~ y5 + y6 + y7 + y8

#Kovarianzen
y1 ~~ y5
y2 ~~ y6
y3 ~~ y7
y4 ~~ y8
y6 ~~ y8
'

model_fit1a <- sem(data = PoliticalDemocracy, model = messmodell2)

summary(model_fit1a, fit.measures = TRUE, standardized = TRUE)

lavTestLRT(model_fit1, model_fit1a)

# Ende Einschub aus didaktischen Gründen

# Step 2: Überprüfung des Strukturmodells

strukturmodell <- '
# Faktorladungen
Industrialisierung1960 =~ x1 + x2 + x3
Demokratie1960 =~ y1 + y2 + y3 + y4
Demokratie1965 =~ y5 + y6 + y7 + y8

# Strukturmodell/Regression
Demokratie1960 ~ Industrialisierung1960
Demokratie1965 ~ Demokratie1960 + Industrialisierung1960

#Kovarianzen
y1 ~~ y5
y2 ~~ y6
y3 ~~ y7
y4 ~~ y8
'

model_fit2 <- sem(data = PoliticalDemocracy, model = strukturmodell)

summary(model_fit2, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)

mi <- modindices(model_fit2)
mi[mi$mi > 10,]

# Visualisierung mit tidySEM
library(tidySEM)

pfad_layout <- get_layout("x1", "","", "", "y1",
"x2","Industrialisierung1960", "","", "y2",
"x3", "", "", "Demokratie1960", "y3",
"", "", "", "", "y4",
"","", "","","y5",
"","", "","Demokratie1965","y6",
"","", "","","y7",
"","", "","","y8",
rows = 8)

graph_sem(model = model_fit2, layout = pfad_layout)

# Visualisierung ohne die Messmodelle, nur latente Variablen
pfad_layout2 <- get_layout("Industrialisierung1960", "Demokratie1960",
"","Demokratie1965",
rows = 2)

graph_sem(model = model_fit2, layout = pfad_layout2)