12 lavaan in R Studio
Wie in Kapitel 2 beschrieben, ist lavaanGUI ein Paket der Open-Source-Statistiksoftware R. lavaanGUI baut dabei auf dem Paket lavaan auf. Mit dem Paket lavaan ist es möglich, die gleichen Berechnungen, die man mit lavaanGUI macht, innerhalb R bzw. RStudio durchzuführen. Der Unterschied besteht darin, dass in lavaanGUI einzig die Syntax geschrieben werden muss, um die Daten zu analysieren. In lavaan hingegen müssen mehr Syntaxbefehle verwendet werden, um die Berechnungen durchzuführen. Die Ergebnisse sind aber die gleichen.
Für fortgeschrittenere Analysen von Strukturgleichungsmodellen ist lavaan in R flexibler und sollte der lavaanGUI vorgezogen werden. Aus Gründen der Übersichtlichkeit bietet die lavaanGUI nicht alle Funktionen an, die das R-Paket lavaan anbietet.
In den kommenden Abschnitten erklären wir euch, wie man auch mit RStudio und dem Paket lavaan Modelltestungen durchführt. Dies wird exemplarisch an der Testung eines \(\tau\)-parallelen Modells durchgeführt.
12.1 Schritt 1 - Einlesen der Daten
Um Daten analysieren zu können, müssen diese zuerst einmal eingelesen werden. Damit R weiß, wo die Daten auf eurem PC gespeichert sind, muss zuerst das Arbeitsverzeichnis definiert werden. Wie das genau geht, wird in Kapitel 3 ausführlich beschrieben. Im gleichen Kapitel findet ihr auch nochmal die Beschreibung wie man in RStudio Daten einliest. Für die folgende Modelltestung solltet ihr die Daten in einem Objekt speichern. Die Syntax für den ersten Schritt kann dann so aussehen:
12.2 Schritt 2 - Pakete laden
Um das Paket lavaan verwenden zu können, muss dieses zuerst installiert und geladen werden. Dafür geht man äquivalent zum Installieren und Aufrufen von lavaanGUI vor, wie in Kapitel 2 beschrieben. Die Syntax lautet folgendermaßen:
12.3 Schritt 3 - Spezifikation des Modells
Bei der Verwendung von lavaan wird die gleiche Syntax verwendet, wie auch in lavaanGUI. Allerdings muss die Syntax, um das Modell zu spezifizieren, um einige Komponenten erweitert werden.
Um in lavaan ein Modell zu testen, muss die Syntax einem Objekt zugewiesen werden. Zusätzlich muss die eigentliche Syntax in einfache Anführungszeichen geschrieben werden. Diese beginnen vor der ersten Definition der Parameter (in unserem Fall der Definition von eta) und enden nach der letzten (in unserem Fall die Definition der Fehlervarianzen der manifesten Variablen). In einem Syntaxbeispiel sieht dies folgendermaßen aus:
modell_TauPar <- 'eta =~ 1*y1 + 1*y2 + 1*y3 + 1*y4 + 1*y5 + 1*y6 + 1*y7 + 1*y8
eta ~ NA*1
eta ~~ veta*eta
y1 + y2 + y3 + y4 + y5 + y6 + y7 + y8~ 0*1
y1 ~~ veps*y1
y2 ~~ veps*y2
y3 ~~ veps*y3
y4 ~~ veps*y4
y5 ~~ veps*y5
y6 ~~ veps*y6
y7 ~~ veps*y7
y8 ~~ veps*y8'
An diesem Beispiel wird deutlich, dass das Objekt, in dem die Modellspezifikation gespeichert wird, den Namen “modell_TauPar” trägt. Dies ist ein selbst gewählter Name und kann von jedem beliebig verändert werden. Wenn man mehrere Modellspezifikationen durchführt, ist es ratsam, hier einen eindeutigen und leicht wiedererkennbaren Namen zu wählen. Dadurch kann man Verwirrungen und Verwechslungen zwischen Datensätzen und Berechnungen vermeiden. An dem Pfeil hinter dem Objektnamen wird deutlich, dass die Modellspezifikation in dem Objekt diesen Namens gespeichert wird. Wie im oberen Abschnitt beschrieben, beginnt die Modellspezifikation dann mit einem einfachen Anführungszeichen, vor der ersten Parameterdefinition und endet mit dem gleichen Anführungszeichen.
Durch diese Zeilen ist nun das Modell spezifiziert. Wichtig ist hier, dass man, wie auch wenn man lavaanGUI verwendet, bereits alle latenten und manifesten Variablen in die Spezifikation mitaufnimmt. Auch wenn man RStudio noch nicht mitgeteilt hat, auf welchen Datensatz er die Spezifikation anwenden soll. Dies passiert im nächsten Schritt.
12.4 Schritt 4 - Testung des Modells
Um das Modell testen zu können, verwenden wir einen Befehl, der im lavaan-Paket enthalten ist. Der Befehl erlaubt die Berechnung und Testung von Strukturgleichungsmodellen, wie es die Modelle der KTT sind. Strukturgleichungsmodelle werden auf englisch Structural equation models genannt, woher auch die Abkürzung des Befehls “sem” herstammt.
Daher fügen wir der bisherigen Syntax eine Befehlszeile hinzu, um das spezifizierte Modell zu testen. Wir speichern die Ergebnisse des Befehls wiederum in einem Objekt. Dieses Objekt sollte einen ebenfalls eindeutig identifizierbaren Namen tragen, dieser muss sich allerdings vom Objekt, in dem die Modellspezifikation gespeichert ist, unterscheiden. Der Befehl, mit dem die Testung des Modells spezifiziert wird, ist der oben erwähnte sem()
-Befehl. Innerhalb des Befehls müssen verschiedene Parameter definiert werden, darunter einmal, auf welche Modellspezifikation der Befehl angewandt wird, welcher Datensatz und welcher Schätzparameter verwendet werden sollen. Dies wird folgendermaßen in der Syntax definiert:
Hier werden die Ergebnisse des Befehls sem()
in dem Objekt namens “modell_taupar” gespeichert. Dieser Name unterscheidet sich eindeutig von dem Objekt, in dem die Spezifikation gespeichert ist, da, wie in Kapitel 3.4 beschrieben, R zwischen Groß- und Kleinschreibung unterscheidet. Der erste Parameter des sem()
Befehls bezieht sich auf die Spezifikation des Modells. Hier reicht es, wenn der Objektname aufgeführt wird, unter dem die Spezifikation gespeichert wurde. Danach folgt als nächster Parameter, abgetrennt vom ersten durch ein Komma, die Definition des Datensatzes. Der Teilbefehl “data =” ist dabei Teil des sem()
-Befehls und kann nicht geändert werden. Hinter dem Gleichheitszeichen wird der Name des Objekts eingetragen, in dem die Daten gespeichert wurden. In diesem Falle wurden die Daten im Objekt “Data” gespeichert. Der letzte Parameter des Befehls ist die Schätzweise. Diese wird aufgerufen durch den Teilbefehl “estimator =”. Hierfür stehen verschiedene Möglichkeiten zur Verfügung, die auch in lavaanGUI gewählt werden können. In diesem Beispiel wurde der Maximum Likelihood (“ml”) Schätzer verwendet. Weitere Optionen sind:
- General least squares (“gls”), diese können nur für einen kompletten Datensatz, ohne fehlende Daten verwendet werden
- Weighted least squares (“wls”), diese können ebenfalls nur für komplette Datensätze verwendet werden
- Diagonally weighted least squares (“dwls”)
- Unweighted least squares (“uls”)
Welcher Schätzer verwendet werden soll, muss je nach Datenlage und Anforderungen an die Berechnung entschieden werden.
Neben diesen Schätzern, gibt es auch noch verschiedene robuste Schätzer, die robuste Standardfehler und skalierte Teststatistiken berechnen. Für die Maximum Likelihood Schätzung stehen verschiedene robuste Schätzer zur Verfügung, wie “mlm”, “mlmvs” oder “mlr”. Auch hier sollte je nach Berechnungsgrundlage individuell entschieden werden, für welchen Schätzer man sich entscheidet.
Nachdem man diese Syntaxzeile ausgeführt hat, werden die Ergebnisse in Objekt “modell_taupar” gespeichert.
12.5 Schritt 5 - Ergebnisse aufrufen
Um die Ergebnisse der Modelltestung anzeigen zu lassen, wird die, in Kapitel @ref (summary) bereits beschriebene, summary()
-Funktion verwendet. Mithilfe dieser Funktion ist es möglich, sich die Ergebnisse der Modelltestung auf die gleiche Art und Weise anzeigen zu lassen, wie auch lavaanGUI sie im Untermenü lavaan Results ausgibt.
Die summary()
Funktion beinhaltete ebenfalls verschiedene Parameter. Zu allererst wird die Modelltestung genannt, auf die sich die Funktion bezieht, dies ist hier das “modell_taupar”, in dem die Modelltestung gespeichert wurde. Die folgenden Argumente, beziehen sich auf die Berechnung der Teststatistiken und Schätzer. Das Argument fit.measures = TRUE
hat zur Folge, dass, neben dem \(\chi\)^2 Test, weitere Teststatistiken angezeigt und berechnet werden. Darunter fallen alle Teststatistiken der Abschnitte “Model test baseline model”, “User model versus baseline model”, “Loglikelihood and Information Criteria”, “Root Mean Square Error of Approximation” und der “Stardaized Root Mean Square Residual”. Möchte man diese Teststatistiken ausgegeben bekommen, muss das Argument mit TRUE
in die Befehlszeile aufgenommen werden. Ist dies nicht der Fall, mit FALSE
. Das Argument standardized = TRUE
bezweckt die Ausgabe und das Anzeigen zusätzlicher standardisierter Schätzer. Hierfür werden zwei extra Spalten im Ergebnis angezeigt. Die Spalte “Std.lv” bezeichnet die Berechnung, für die nur die latente Variable standardisiert wurde. Die spalte “Std.all” bezeichnet die Berechnung, für die alle, latente und manifeste Variablen, standardisiert wurden. Möchte man die zusätzlichen, standardisierten Schätzer nicht ausgegeben bekommen, muss man das Argument als FALSE
aufnehmen. Die vollständige Syntaxzeile lautete folgendermaßen:
Das Ergebnis dieser Syntaxzeile sieht identisch aus, zu dem Ergebnis der lavaanGUI im Unterpunkt lavaan Results. Der Unterschied besteht alleine darin, dass die standardisierten Schätzer in den hinteren zwei Spalten der Modellschätzung, mit ausgegeben werden.
lavaan 0.6-3 ended normally after 23 iterations
Optimization method NLMINB
Number of free parameters 10
Number of equality constraints 7
Number of observations 176
Estimator ML
Model Fit Test Statistic 941.414
Degrees of freedom 41
P-value (Chi-square) 0.000
Model test baseline model:
Minimum Function Test Statistic 603.650
Degrees of freedom 28
P-value 0.000
User model versus baseline model:
Comparative Fit Index (CFI) 0.000
Tucker-Lewis Index (TLI) -0.068
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -2167.253
Loglikelihood unrestricted model (H1) -1696.546
Number of free parameters 3
Akaike (AIC) 4340.506
Bayesian (BIC) 4350.017
Sample-size adjusted Bayesian (BIC) 4340.517
Root Mean Square Error of Approximation:
RMSEA 0.353
90 Percent Confidence Interval 0.334 0.373
P-value RMSEA <= 0.05 0.000
Standardized Root Mean Square Residual:
SRMR 0.440
Parameter Estimates:
Information Expected
Information saturated (h1) model Structured
Standard Errors Standard
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
eta =~
y1 1.000 0.536 0.454
y2 1.000 0.536 0.454
y3 1.000 0.536 0.454
y4 1.000 0.536 0.454
y5 1.000 0.536 0.454
y6 1.000 0.536 0.454
y7 1.000 0.536 0.454
y8 1.000 0.536 0.454
Intercepts:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
eta 3.712 0.049 75.516 0.000 6.927 6.927
.y1 0.000 0.000 0.000
.y2 0.000 0.000 0.000
.y3 0.000 0.000 0.000
.y4 0.000 0.000 0.000
.y5 0.000 0.000 0.000
.y6 0.000 0.000 0.000
.y7 0.000 0.000 0.000
.y8 0.000 0.000 0.000
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
eta (veta) 0.287 0.046 6.287 0.000 1.000 1.000
.y1 (veps) 1.105 0.045 24.819 0.000 1.105 0.794
.y2 (veps) 1.105 0.045 24.819 0.000 1.105 0.794
.y3 (veps) 1.105 0.045 24.819 0.000 1.105 0.794
.y4 (veps) 1.105 0.045 24.819 0.000 1.105 0.794
.y5 (veps) 1.105 0.045 24.819 0.000 1.105 0.794
.y6 (veps) 1.105 0.045 24.819 0.000 1.105 0.794
.y7 (veps) 1.105 0.045 24.819 0.000 1.105 0.794
.y8 (veps) 1.105 0.045 24.819 0.000 1.105 0.794