Strukturgleichungsmodelle in R mit lavaan
Workshop der Giessen R Users Group
Geschäftsleitung: Dr. Guido Möser
Wissenschaftlicher Beirat: Prof. Dr. Peter Schmidt, Vertretungsprofessor Dr. Gero Schwenk
Stand: 23. Februar 2011
Strukturgleichungsmodellierung in R (1)
• Strukturgleichungsmodellierung in R sind aktuell (Stand Februar 2011) mit drei Paketen möglich:– sem (Structural Equation Modeling) von John Fox -
http://cran.r-project.org/web/packages/sem/index.html• Literatur: Fox, J. (2006). Structural Equation Modeling With the sem Package in R.
Structural Equation Modeling, 13, 465 – 486.• Paketbeschreibung: http://cran.r-project.org/web/packages/sem/sem.pdf
– OpenMx (Advanced Structural Equation Modeling), entwickelt an der Universität Virginia, Department of Psychology
• Projektseite: http://openmx.psyc.virginia.edu/• Handbuch: http://openmx.psyc.virginia.edu/documentation• Paketbeschreibung: http://openmx.psyc.virginia.edu/documentation• Hinweis: aktuell noch nicht auf dem CRAN, Installation in R mittels:
source('http://openmx.psyc.virginia.edu/getOpenMx.R')• Mächtig, aber anspruchsvoll in der Programmierung
Strukturgleichungsmodellierung in R (2)
– lavaan (latent variable analysis) von Yves Rosseel - http://lavaan.ugent.be/• Projektseite: http://lavaan.ugent.be/• Paketbeschreibung: http://cran.r-project.org/web/packages/lavaan/lavaan.pdf• Handbuch / Dokumentation:
http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf• Vorteile: Syntax eng an R und Mplus® angelehnt• Zahlreiche Schätzer vorhanden:
– ML – maximum likelihood– GLS – generalized least squares – WLS – weighted least squares (aka ADF)– MLM – maximum likelihood estimation with robust standard errors and a
Santorra-Bentler scaled chi-square test statistic– MLF – maximum likelihood estimation with standard errors based on first-
order-derivatives– MLR – maximum likelihhod estimation with robust ‚Huber-White‘ standard
errors, and a scaled Yuan-Bentler statistic• Fehlende Werte (bei MCAR / MAR): FIML-Prozedur vorhanden
Vorteile von lavaan im Überblick
• Kostenlose Verfügbarkeit• Einfache Nutzung• Viele Schätzer vorhanden, die in sem() und OpenMx noch nicht zur
Verfügung stehen, teilweise in kommerziellen Paketen auch nicht vorhanden sind (MLM, MLF, MLR)
• Adäquater Umgang mit fehlenden Werten (FIML)• Gruppenvergleiche• Meanstructures-Option: Zugriff auf Mittelwerte/Intercepts im Modell• Ausgabe der üblichen Parameter nach dem Modellfit (Fit Measures /
Modification Indices (MI) + Expected Parameter Changes (EPC)
Zukünftig sind noch weitere Features geplant (z.B. WLSMV Approach, IRT Modelle, Multilevel etc.)
Quelle: http://lavaan.ugent.be/?q=node/6
Möglichkeiten von lavaan
• Konfirmatorische Faktorenanalyse (CFA)– Funktion cfa()
• Strukturgleichungsmodellierung– Funktion sem()
• Latente Wachstumskurven– Funktion growth()
• Item Response Modelle – Aktuell noch nicht entwickelt
• Latente Klassen und Mixture Modelle– Aktuell noch nicht entwickelt
• Multilevel Modelle– Aktuell noch nicht entwickelt
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 2ff.
Syntax am Beispiel der Webseite
library(lavaan)
model <- ' # latent variable definitions ind60 =~ x1 + x2 + x3 dem60 =~ y1 + y2 + y3 + y4 dem65 =~ y5 + y6 + y7 + y8 # regressions dem60 ~ ind60 dem65 ~ ind60 + dem60 # residual covariances y1 ~~ y5 y2 ~~ y4 + y6 y3 ~~ y7 y4 ~~ y8 y6 ~~ y8'fit <- sem(model, data=PoliticalDemocracy)summary(fit)Quelle: http://lavaan.ugent.be/?q=node/6
Syntax - Übersicht
• In lavaan wird ein Modell als einfaches Set von Regressionsformeln umgesetzt– Regressiondmodelle / Manifeste Variablen / Strukturmodelle
y ~ x1 + x2 + f
– Messmodelle (Latent Variablen)f1 =~ y1 + y2 + y3
– Varianzen und Kovarianzen
y1 ~~ y1y1 ~~y2
– Interceptsy1 ~ 1
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 2ff.
Syntax – Formula Types
Formula Type Operator Mnemonic
latent variable definition
=~ is measured by
regression ~ is regressed on
(residual) (co)variance
~~ is correlated with
Intercept ~ 1 intercept
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 2ff.
Modellübergabe in R
• Zwei Optionen– Modell kann in R direkt in ein Objekt geschrieben werden, z.B. myModel– Modell kann in eine Textdatei geschrieben und mit dem Befehl readLines eingelesen
werden
• Option 2: readLines()
> myModel <- readLines("/mydir/myModel.lav")
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 3ff.
Option 1: Direkt in ein Objekt> myModel <- ' #regressions
y1 + y2 ~ f1 + f2 + x1
# latent variable def‘sf1 =~ y1 + y2 + y3
# variances and cov‘sy1 ~~ y1y1 ~~ y2
# interceptsy1 ~ 1 '
Beispiel Konfirmatorische Faktorenanalyse (CFA)
• Beispiel von Holzinger & Swineford (1939)– Dokumentation in lavaan: > ?
HolzingerSwineford1939– Ability Test Scores von Schülern der 7. und
8. Klasse (Details in Dokumentation)
• lavaan Modell-Syntax (Messmodelle:)visual =~ x1 + x2 + x3textual =~ x4 + x5 + x6speed =~ x7 + x8 + x9
• Hinweis:– Die Kovarianzen zwischen den latenten
Konstrukten (visual, textual und speed) müssen nicht explizit freigesetzt werden, dies geschieht per default (äquivalent zu Mplus®)!
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 3ff.
Drei Schritte, um ein Modell in lavaan zu schätzen
Schritt 1
•Modellspezifizierung mittels Modell-Syntax
Schritt 2
•Fit des Modells (cfa(), sem(), growth())
Schritt 3
•Ergebnisinspektion (summary())
Beispiel Konfirmatorische Faktorenanalyse (CFA)
• Schritt 1: Modellspezifikation mittels Modell-Syntax> # 1. Modellspezifikation> HS.model <- ' visual =~ x1 + x2 + x3+ textual =~ x4 + x5 + x6+ speed =~ x7 + x8 + x9 '
• Schritt 2: Fit des Modells> # 2. Fit des Modells> fit <- cfa(HS.model, data=HolzingerSwineford1939)
• Schritt 3: Ergebnisinspektion> # 3. Ergebnisinspektion> summary(fit, fit.measures=TRUE, standardized = TRUE)
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 3ff.
Ergebnisse – Schritt 3 – Auswahl (1)
Quelle: R Output des Beispielmodells
Ergebnisse – Schritt 3 – Auswahl (2)
Quelle: R Output des Beispielmodells
Ergebnisse – Schritt 3 – Auswahl (3)
Quelle: R Output des Beispielmodells
Beispiel Strukturgleichungsmodell – sem()
• Datensatz PoliticalDemocracy in lavaan> ?PoliticalDemocracy
lavaan Syntax# latent variable definitionsind60 =~ x1 + x2 + x3dem60 =~ y1 + y2 + y3 + y4dem65 =~ y5 + y6 + y7 + y8# regressionsdem60 ~ ind60dem65 ~ ind60 + dem60# residual covariancesy1 ~~ y5y2 ~~ y4 + y6y3 ~~ y7y4 ~~ y8y6 ~~ y8
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 3ff.
Fixing Parameters
• Per default wird die erste Faktorladung auf 1 gesetzt.
• Die anderen drei Faktorladungen werden frei geschätzt
• Sollen auch die drei verbleibenden Faktorladungen auf 1 gesetzt werden, so geschieht dies wie folgt:
> f =~ y1 + 1*y2 + 1*y3 + 1*y4
• Faktorladungen können mittels NA freigesetzt werden
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 9ff.
Orthogonalität zwischen den Faktoren
• Per Default werden die Kovarianzen / Korrelationen zwischen den latenten Konstrukten frei geschätzt.
• Möchte man Orthogonalität zwischen den Faktoren (überprüfen), so kann dies durch den speziellen Befehl orthogonal=TRUE erreicht werden
> fit.HS.ortho <- cfa(HS.model, data = HolzingerSwineford1939, orthogonal = TRUE)
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 9ff.
Varianzen aller latenter Konstrukte gleichsetzen
• Sollen die Varianzen aller latenter Konstrukte gleichgesetzt werden (in der Grafik alle mit a bezeichnet), so geschieht dies mit dem speziellen Befehl std.lev = TRUE
> fit.HS.ortho <- cfa(HS.model, data = HolzingerSwineford1939, std.lv = TRUE)
• In diesem Fall werden die per default auf 1 fixierten Faktorenladungen frei geschätzt!
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 9ff.
Startwerte festlegen
• Startwerte sind per default auf 1 gesetzt.• Diese können geändert werden, indem in
Klammern die Startwerte vor die manifesten Konstrukte gesetzt werden:
visual =~ x1 + start(0.8)*x2 + start(1.2)*x3textual =~ x4 + start(0.5)*x5 + start(1.0)*x6speed =~ x7 + start(0.7)*x8 + start(1.8)*x9
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 9ff.
Equality Constraints
• Das Gleichsetzen von Parametern (Equality Constraints) erfolgt durch folgenden Befehl:
visual =~ x1 + x2 + equal("visual=~x2")*x3 textual =~ x4 + x5 + x6speed =~ x7 + x8 + x9
• Hier im Beispiel rechts sind die entsprechenden Parameter mit a gekennzeichnet
Quelle: http://users.ugent.be/~yrosseel/lavaan/lavaanIntroduction.pdf, Seite 9ff.
Vielen Dank für Eure Aufmerksamkeit!
Eindrücke vom 1. Workshop SEM mit lavaan