7.3 Modellspezifikation mit R
In diesem Abschnitt findet sich der am Beispiel des Konstrukts Technikakzeptanz und der vier Indikatoren.
Identifikation des Modells
Zunächst muss geprüft werden, ob ein Modell mit einem latenten Konstrukt und vier Indikatorvariablen identifiziert werden kann.
Zum einen muss sichergestellt sein, “ob genügend Informationen aus den empirischen Daten zur Verfügung stehen, um die Modellparameter eindeutig schätzen zu können” (Weiber and Mühlhaus 2014, S. 60). Mit vier Indikatoren ist das Modell dabei überidentifiziert (Weiber and Mühlhaus 2014, S. 60), da eine positive Anzahl an Freiheitsgraden gegeben ist.
Zum anderen muss eine Metrik für die latenten Variablen festgelegt werden. “Da die latenten Variablen und die Fehlervariablen nicht beobachtbare Größen darstellen, ist zunächst auch die Skala unklar, auf der sich die Ausprägungen dieser Variablen bewegen. Im Rahmen der Modellidentifikation ist es deshalb erforderlich, diesen Variablen eine Skala zuzuweisen, damit die Ausprägungen dieser Variablen interpretierbar werden” (Weiber and Mühlhaus 2014, S.62).
Im nachfolgenden Beispiel wird die Skalierung der latenten Variablen mittels Festlegung eines Referenzindikators durchgeführt. Für zwei Alternativen zu diesem Vorgehen, 1) Festlegung der Varianz des latenten Faktors oder 2) Effects Coding nach Little, Slegers, and Card (2006), findet sich der entsprechende Code in den Kommentaren im nachfolgenden Codeblock.
#Zunächst stellen wir sicher, dass das Paket *lavaan* auch tatsächlich aufgerufen ist.
library(lavaan)
#Modellspezifikation Technikakzeptanz
#Es wird ein erstes Model mit einem latenten Faktor und allen vier Variablen spezifiziert.
<- 'TA =~ ta1 + ta2 + ta3 + ta4'
model.ta1
#Für das spezifizierte Model werden nun die Parameter geschätzt
<- cfa(model.ta1, data=daten_latente_konstrukte, meanstructure = TRUE)
fit.ta1
#Sollte eine andere Skalierung der latenten Variable(n) erfolgen, als die Auswahl eines Referenzindikators bestehen folgende Möglichkeiten:
#1. Die Festlegung der Varianz der latenten Variable(n)
#Durch den Befehl 'std.lv = TRUE' wird die Varianz (aller latenten Variablen im Modell!) auf den Wert 1 gesetzt.
#fit.ta1 <- cfa(model.ta1, data=daten_latente_konstrukte, meanstructure = TRUE, std.lv = TRUE)
#2. Effects Coding nach Little, Slegers, & Card (2006)
#fit.ta1 <- cfa(model.ta1, data=daten_latente_konstrukte, meanstructure = TRUE, effect.coding = T)
#Anschließend lassen wird uns die Ergebnisse der Modellschätzung anzeigen.
#Hier ist zu beachten, dass nur die Ergebnisse für das Modell mit festgelegtem Referenzindikator angegeben werden.
::summary(fit.ta1, fit.measures=TRUE, standardized = TRUE) lavaan
## lavaan 0.6-12 ended normally after 20 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 12
##
## Number of observations 455
##
## Model Test User Model:
##
## Test statistic 20.628
## Degrees of freedom 2
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 785.050
## Degrees of freedom 6
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.976
## Tucker-Lewis Index (TLI) 0.928
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -2429.394
## Loglikelihood unrestricted model (H1) -2419.080
##
## Akaike (AIC) 4882.789
## Bayesian (BIC) 4932.232
## Sample-size adjusted Bayesian (BIC) 4894.148
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.143
## 90 Percent confidence interval - lower 0.091
## 90 Percent confidence interval - upper 0.202
## P-value RMSEA <= 0.05 0.002
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.026
##
## 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
## TA =~
## ta1 1.000 0.795 0.723
## ta2 1.205 0.074 16.331 0.000 0.958 0.872
## ta3 1.142 0.075 15.239 0.000 0.908 0.777
## ta4 1.003 0.074 13.470 0.000 0.798 0.681
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 3.607 0.052 69.936 0.000 3.607 3.279
## .ta2 3.149 0.052 61.112 0.000 3.149 2.865
## .ta3 2.477 0.055 45.206 0.000 2.477 2.119
## .ta4 2.488 0.055 45.328 0.000 2.488 2.125
## TA 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 0.578 0.047 12.395 0.000 0.578 0.478
## .ta2 0.290 0.039 7.438 0.000 0.290 0.240
## .ta3 0.542 0.048 11.201 0.000 0.542 0.397
## .ta4 0.734 0.057 12.993 0.000 0.734 0.536
## TA 0.632 0.075 8.393 0.000 1.000 1.000
Prüfung der Anpassungsgüte
Wie sich den angezeigten Ergebnisse entnehmen lässt, ist die Anpassungsgüte des Modells unzureichend oder zumindest verbesserungswürdig. Das lässt sich zum einen am signifikanten Chi-Quadrat-Differenztest ablesen und zum anderen zusätzlich auch an den inkrementellen Fitmaßen wie etwa dem CFI oder dem TLI, auch wenn deren Werte über den empfohlenen Schwellenwert von 0.9 liegen (Weiber and Mühlhaus 2014, S. 215).
Der Wert des RMSEA offenbart ebenfalls eine unzureichende Passung. Allerdings sollte beim vorliegenden Modell mit sehr wenigen Freiheitsgraden (hier df = 2) mit Hinweis auf Kenny, Kaniskan, and McCoach (2014) von der Interpretation dieses Wertes abgesehen werden.
Prüfung der Notwendigkeit einer Re-Spezifikation auf Grundlage der Modifikationsindizes
Der Blick in die Modifikationsindizes offenbart, wo sich in den Daten nicht durch das Modell vorhergesagte Varianz zeigt. Sprich: Welche Pfade müssten im Modell eigentlich frei geschätzt werden dürfen und sollten nicht (auf Null) restringiert sein?
#Berechnung der Modifikationsindizes
modindices(fit.ta1, sort. = T)
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 15 ta1 ~~ ta2 21.1 0.207 0.207 0.51 0.51
## 20 ta3 ~~ ta4 21.1 0.197 0.197 0.31 0.31
## 17 ta1 ~~ ta4 8.0 -0.111 -0.111 -0.17 -0.17
## 18 ta2 ~~ ta3 8.0 -0.153 -0.153 -0.38 -0.38
## 19 ta2 ~~ ta4 3.5 -0.084 -0.084 -0.18 -0.18
## 16 ta1 ~~ ta3 3.5 -0.079 -0.079 -0.14 -0.14
Es zeigt sich, dass sich in den Daten Kovarianz zwischen Variablen ta1 und ta2 sowie Kovarianz zwischen den Variablen ta3 und ta4 zeigt, welche jedoch im geschätzten Modell nicht abgebildet wird.
Die Güte des eingangs spezifizierten Modells kann also als unzureichend bewertet werden. Die Modifikationsindizes offenbaren, wo in den Daten sich Kovarianz zwischen den Variablen befindet, die vom Modell nicht berücksichtigt wird. Das bedeutet, eine Respezifikation des Modells könnte diesen fehlenden Parameter inkludieren, um die Zusammenhänge in den Daten besser zu verdeutlichen.
Nachfolgend werden zwei mögliche Respezifikationen durchgeführt. D. h., wir berechnen nun einmal ein Modell, in dem der Parameter der Kovarianz zwischen Indikator 1 und Indikator 2 frei geschätzt wird. Hierfür wird, siehe Kommentar im folgenden Modell eine Kovarianz der Fehlerterme freigegeben und geschätzt.
#Respezifikation mit Kovarianz ta1 und ta2
<- 'TA =~ ta1 + ta2 + ta3 + ta4
model.ta1.cov12
# Hinzufügung: Kovarianz der Variablen ta1 und ta2
# Genauer gesagt, der Fehlerterme von ta1 und ta2
#Allerdings wird hier von uns eine Kovarianz der Variablen spezifiziert.
#Die Kovarianz der Fehlerterme wird dann von lavaan berechnet.
ta1 ~~ ta2'
#Die Parameterschätzung für dieses Modell wird durchgeführt
<- cfa(model.ta1.cov12, data=daten_latente_konstrukte, meanstructure = TRUE)
fit.ta1.cov12
#Ausgabe der Ergebnisse
::summary(fit.ta1.cov12, fit.measures=TRUE, standardized = TRUE) lavaan
## lavaan 0.6-12 ended normally after 22 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 13
##
## Number of observations 455
##
## Model Test User Model:
##
## Test statistic 0.865
## Degrees of freedom 1
## P-value (Chi-square) 0.352
##
## Model Test Baseline Model:
##
## Test statistic 785.050
## Degrees of freedom 6
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) 1.001
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -2419.513
## Loglikelihood unrestricted model (H1) -2419.080
##
## Akaike (AIC) 4865.025
## Bayesian (BIC) 4918.589
## Sample-size adjusted Bayesian (BIC) 4877.331
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.121
## P-value RMSEA <= 0.05 0.577
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.005
##
## 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
## TA =~
## ta1 1.000 0.699 0.636
## ta2 1.257 0.081 15.592 0.000 0.879 0.800
## ta3 1.391 0.115 12.095 0.000 0.973 0.832
## ta4 1.203 0.103 11.655 0.000 0.841 0.718
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 ~~
## .ta2 0.185 0.043 4.303 0.000 0.185 0.330
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 3.607 0.052 69.936 0.000 3.607 3.279
## .ta2 3.149 0.052 61.112 0.000 3.149 2.865
## .ta3 2.477 0.055 45.206 0.000 2.477 2.119
## .ta4 2.488 0.055 45.328 0.000 2.488 2.125
## TA 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 0.721 0.059 12.214 0.000 0.721 0.596
## .ta2 0.436 0.049 8.910 0.000 0.436 0.361
## .ta3 0.420 0.055 7.668 0.000 0.420 0.307
## .ta4 0.664 0.056 11.773 0.000 0.664 0.484
## TA 0.489 0.073 6.682 0.000 1.000 1.000
Es zeigt sich, dass durch die frei geschätzte Kovarianz der Fehlerterme von Variable 1 und 2 die Anpassungsgüte des geschätzten Modells nun zufriedenstellend ist.
Wir berechnen nun einfach zum Vergleich noch mal ein Modell, in dem, wie ebenso von den Modifikationsindizes gezeigt, die Fehlerterme der Variablen 3 und 4 miteinander kovariieren.
#Respezifikation mit Kovarianz ta3 und ta4
<- 'TA =~ ta1 + ta2 + ta3 + ta4
model.ta1.cov34
# Kovarianz der Variablen ta3 und ta4
#Genauer gesagt: der Fehlerterme von ta3 und ta4
ta3 ~~ ta4'
#Die Parameterschätzung für dieses Modell wird durchgeführt
<- cfa(model.ta1.cov34, data=daten_latente_konstrukte, meanstructure = TRUE)
fit.ta1.cov34
#Ausgabe der Ergebnisse
::summary(fit.ta1.cov34, fit.measures=TRUE, standardized = TRUE) lavaan
## lavaan 0.6-12 ended normally after 20 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 13
##
## Number of observations 455
##
## Model Test User Model:
##
## Test statistic 0.865
## Degrees of freedom 1
## P-value (Chi-square) 0.352
##
## Model Test Baseline Model:
##
## Test statistic 785.050
## Degrees of freedom 6
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) 1.001
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -2419.513
## Loglikelihood unrestricted model (H1) -2419.080
##
## Akaike (AIC) 4865.025
## Bayesian (BIC) 4918.589
## Sample-size adjusted Bayesian (BIC) 4877.331
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.121
## P-value RMSEA <= 0.05 0.577
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.005
##
## 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
## TA =~
## ta1 1.000 0.797 0.725
## ta2 1.257 0.081 15.592 0.000 1.003 0.912
## ta3 1.069 0.073 14.598 0.000 0.853 0.730
## ta4 0.924 0.074 12.557 0.000 0.737 0.630
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta3 ~~
## .ta4 0.189 0.046 4.133 0.000 0.189 0.260
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 3.607 0.052 69.936 0.000 3.607 3.279
## .ta2 3.149 0.052 61.112 0.000 3.149 2.865
## .ta3 2.477 0.055 45.206 0.000 2.477 2.119
## .ta4 2.488 0.055 45.328 0.000 2.488 2.125
## TA 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 0.574 0.048 11.992 0.000 0.574 0.475
## .ta2 0.203 0.048 4.250 0.000 0.203 0.168
## .ta3 0.639 0.055 11.589 0.000 0.639 0.468
## .ta4 0.827 0.063 13.114 0.000 0.827 0.604
## TA 0.636 0.076 8.328 0.000 1.000 1.000
Auch hier zeigt sich, dass durch die Freisetzung des Parameters das Modell nun eine zufriedenstellende Anpassungsgüte zeigt.
Es stellt sich nun die Frage: Was machen wir nun auf Grundlage dieser Ergebnisse? Modellieren wir einfach eine Kovarianz zwischen den Variablen 1 und 2? Oder besser doch 3 und 4? Der Modellvergleich zeigt, dass eigentlich keine dieser konkurrierenden Lösungen als besser erachtet werden kann.
Und was wenn man einfach beiden Paramter frei schätzen lässt, sprich: beide Kovarianzen modelliert? Eine Schätzung eines respezifizierten Modells, in dem sowohl die Fehlerterme der Variablen 1 und 2 sowie 3 und 4 kovariieren ist nicht sinnvoll, da dieses Modell vollständig indentifiziert ist und keine Freiheitsgrade besitzt.
Ist es dann evtl. sinnvoll sich einfach für eine der beiden erstgenannten Lösungen zu entscheiden?
7.3.1 Kovarianz von Fehlertermen
Kovarianz zwischen Fehlertermen in Messmodellen werden für gewöhnlich nicht empfohlen (siehe hierzu Hermida 2015), da dies bedeutet, dass es über den zugrundeliegenden Faktor hinaus noch weitere gemeinsame Einflüsse auf die Messung einiger Indikatoren gibt, die eben nicht vom latenten Faktor erklärt werden, sondern über diesen hinausgehen. Zusätzliche Einflüsse können vielfältig sein und sollten gründlich reflektiert werden. Ein Grund könnte beispielsweise sein, dass es eine sprachliche Ähnlichkeit zwischen zwei Items gibt (Bspw. Synonyme: “XYZ ist reliabel.” und ““XYZ ist verlässlich.”), die dazu führt, dass die Befragten eine identische Antwort geben. Das bedeutet dann jedoch auch, dass die Messung beider Indikatoren überflüssig ist.10 Es wird ja bei identischen Items gerade keine neue Information aus der Beantwortung gewonnen. Im Umkehrschluss heißt das dann auch, dass man sich eines der beiden Items sparen kann.
Man könnte jedoch bei Ablehnung absoluter Übereinstimmung zweier Variablen auch einfach die miteinander kovariierenden Fehlerterme modellieren. Da man jedoch den latenten Faktor so sauber wie möglich erheben und abbilden möchte, ist ein unmodelierter zusätzlicher latenter Faktor (und im Grunde verbirgt sich hinter gemeinsamer Kovarianz zweier Variablen nichts anderes) im zu schätzenden Modell störend und es wird gerade nicht empfohlen korrelierte Fehlerterme in der Modellierung mitzuführen (Hermida 2015). Denn man will ja gerade nur die theoretisierten Konstrukte und deren Modellzusammenhänge prüfen. Ein Faktor der systematisch und eben nicht zufällig zu Varianz im Modell führt ist ebenso erklärungswürdig. Eine Theoretisierung und Erklärung dieses Faktors führt jedoch vom eigentlichen Entdeckungszusammenhang weg und bedeutet zusätzliche Arbeit. Daher ist es an vielen Stellen im Forschungsprozess sinnvoll sein problematische Variablen aus der Erhebung und Analyse auszuschließen.11
Es könnte sich nun also auch ein Modell empfehlen, bei dem der latente Faktor lediglich auf drei Variablen lädt, man mithin eine Variable aus dem Messmodell entfernt. Das probieren wir nachfolgend einmal und spezifizieren ein Modell ohne Variable 4.
#Zweites Model mit nur noch drei Variablen
<- 'TA =~ ta1 + ta2 + ta3'
model.ta2
<- cfa(model.ta2, data=daten_latente_konstrukte, meanstructure = TRUE)
fit.ta2
::summary(fit.ta2, fit.measures=TRUE, standardized = TRUE) lavaan
## lavaan 0.6-12 ended normally after 16 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 9
##
## Number of observations 455
##
## Model Test User Model:
##
## Test statistic 0.000
## Degrees of freedom 0
##
## Model Test Baseline Model:
##
## Test statistic 539.294
## Degrees of freedom 3
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) 1.000
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1824.600
## Loglikelihood unrestricted model (H1) -1824.600
##
## Akaike (AIC) 3667.201
## Bayesian (BIC) 3704.283
## Sample-size adjusted Bayesian (BIC) 3675.720
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent confidence interval - lower 0.000
## 90 Percent confidence interval - upper 0.000
## P-value RMSEA <= 0.05 NA
##
## Standardized Root Mean Square Residual:
##
## SRMR 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
## TA =~
## ta1 1.000 0.805 0.732
## ta2 1.233 0.082 14.984 0.000 0.993 0.903
## ta3 1.065 0.073 14.682 0.000 0.858 0.734
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 3.607 0.052 69.936 0.000 3.607 3.279
## .ta2 3.149 0.052 61.112 0.000 3.149 2.865
## .ta3 2.477 0.055 45.206 0.000 2.477 2.119
## TA 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .ta1 0.562 0.049 11.391 0.000 0.562 0.464
## .ta2 0.223 0.051 4.344 0.000 0.223 0.184
## .ta3 0.630 0.056 11.331 0.000 0.630 0.461
## TA 0.648 0.078 8.307 0.000 1.000 1.000
Wir sehen nun, dass das Modell vollständig identifiziert ist und uns daher keine Fit-Maße angezeigt werden, bzw. diese einfach auf 1 gesetzt wurden. Die Faktorladungen der einzelnen Items sind entweder als sehr gut zu bewerten (ta2) oder gerade noch ausreichend (ta1 und ta3). Wie Sie in der Dokumentation zur Technikbereitschaft im ZIS sehen, ist die Ladung für ta2 somit ein bisschen besser als üblich, für ta1 und ta3 etwas schlechter.
Übungsfrage
- Welche Gründe könnte es haben, dass sich im Vergleich zur Dokumentation im vorliegenden Sample leicht unterschiedliche Kennwerte der Parameterschätzer und der Modellgüte finden?