Strukturgleichungsmodelle mit R lavaan
2. Normalverteilung und robuste Verfahren (Satorra-Bentler, Bootstrapping)

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

Auf dieser Seite wird die Normalverteilungsprüfung und der Einsatz robuster Verfahren bei Strukturgleichungsmodellen mit lavaan erklärt.

Video



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


Wir benötigen zunächst einmal lavaan, die folgende Prüfung basiert auf dem in lavaan eingebauten Datensatz PoliticalDemocracy.

library(lavaan)

head(PoliticalDemocracy)

1. Normalverteilungsprüfung

Für die Prüfung der multivariaten Normalverteilung verwenden wir das MVN Package aus R.

library(MVN)

Wir wählen die Variablen aus unserem Datensatz, die wir auf multivariate Normalverteilung prüfen möchten - also die Indikatorvariablen für unsere latenten Konstrukte.

#Auswahl Variablen
daten_mv_test <- subset(PoliticalDemocracy, select = y1:x3)

Beim Test wird sowohl ein Test auf multivariate Normalverteilung durchgeführt als auch univariate Tests.

#Test auf multivariate Normalverteilung
mvn(daten_mv_test, mvnTest="mardia")

Für die univariaten NV-Tests kann man beispielsweise auf den Test nach Shapiro-Wilk (SW) umstellen.

mvn(daten_mv_test, mvnTest="mardia", univariateTest = "SW")

Grafik Test multivariate Normalverteilung

Hier im Beispiel sehen wir, dass keine multivariate Normalverteilung vorliegt (3 Result "No"). Weiter unten bei den unvariaten Tests können wir auch erkennen, bei welchen Indikatorvariablen dieses Problem entsteht (y1 - y8).

2. Robuste Schätzung nach Satorra-Bentler

Eines der bekanntesten robusten Schätzverfahren bei (möglicher) Verletzung der Normalverteilung ist der Test nach Satorra-Bentler. Zunächst müssen wir das Modell spezifizieren.

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
'

Und als Schätzer wird jetzt "MLM" ausgewählt.

model_fit_r <- sem(data = PoliticalDemocracy, model = strukturmodell,
estimator="MLM")

Wenn wir jetzt die Fit-Indizes aufrufen, erhalten wir zusätzlich robuste Fit-Indizes. Und außerdem sind die Tests der geschätzten Parameter mit robusten Standardfehlern durchgeführt, also auch korrekt bei Nichteinhaltung der Normalverteilungsannahme.

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

Grafik Model Fit robuste Schätzung

Wir interpretieren jetzt die Ergebnisse der zweiten Spalte, "Robust". Hier ist der robuste Chi-Quadrat-Test des Modells (Model Test User Model) nicht signifikant, p = .055. Einige der robusten Indizes (CFI, RMSEA) sind in der Spalte "Robust" mehrfach aufgeführt. Hier sollten Sie jeweils den unteren Index interpretieren, also den "Robust Comparative Fit-Index" und den "Robust RMSEA".

Grafik robuste Modellschätzung SEM

Hier sieht man an der Angabe "Robust.sem", dass robuste Standardfehler verwendet worden sind. Die Ergebnisse können also auch bei einer Verletzung der Normalverteilungsannahme interpretiert werden.

3. Robuste Schätzung mit Bootstrapping

Neben der robusten Schätzung nach Satorra-Bentler kommt auch Bootstrapping als robustes Verfahren in Frage. Der Bollen-Stine-Test ist ein gebootstrappter Chi-Quadrat-Test. Die gebootstrappten Standardfehler führen dazu, dass man die Tests der Parameterschätzungen auch interpretieren darf, wenn die multivariate Normalverteilung nicht gegeben ist.

model_fit_b <- sem(data = PoliticalDemocracy, model = strukturmodell,
test="bollen.stine", se="bootstrap", bootstrap = 5000)

# Ergebnis mit Bootstrapping
summary(model_fit_b, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)

Gebootstrappte Konfidenzintervalle können wir über die parameterEstimates()-Funktion anfordern:

parameterEstimates(model_fit_b, boot.ci.type ="bca.simple", level=.95,
output="pretty", header=TRUE)

Grafik Bootstrap Konfidenzintervalle SEM

Ein Parameter ist hier signifikant von 0 verschieden, wenn sein gebootstrapptes Konfidenzintervall nicht die Null umschließt (wenn also beide Grenzen des Konfidenzintervalls, ci.lower und ci.upper, negativ oder beide Grenzen positiv sind).