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.
model.ta1 <- 'TA  =~ ta1 + ta2 + ta3 + ta4'

#Für das spezifizierte Model werden nun die Parameter geschätzt
fit.ta1 <- cfa(model.ta1, data=daten_latente_konstrukte, meanstructure = TRUE)

#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.
lavaan::summary(fit.ta1, fit.measures=TRUE, standardized = TRUE)
## lavaan 0.6-7 ended normally after 20 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of free 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
model.ta1.cov12 <- 'TA  =~ ta1 + ta2 + ta3 + ta4

  # 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
fit.ta1.cov12 <- cfa(model.ta1.cov12, data=daten_latente_konstrukte, meanstructure = TRUE)

#Ausgabe der Ergebnisse
lavaan::summary(fit.ta1.cov12, fit.measures=TRUE, standardized = TRUE)
## lavaan 0.6-7 ended normally after 22 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of free 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
model.ta1.cov34 <- 'TA  =~ ta1 + ta2 + ta3 + ta4

  #  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
fit.ta1.cov34 <- cfa(model.ta1.cov34, data=daten_latente_konstrukte, meanstructure = TRUE)

#Ausgabe der Ergebnisse
lavaan::summary(fit.ta1.cov34, fit.measures=TRUE, standardized = TRUE)
## lavaan 0.6-7 ended normally after 20 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of free 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
model.ta2 <- 'TA  =~ ta1 + ta2 + ta3'

fit.ta2 <- cfa(model.ta2, data=daten_latente_konstrukte, meanstructure = TRUE)

lavaan::summary(fit.ta2, fit.measures=TRUE, standardized = TRUE)
## lavaan 0.6-7 ended normally after 16 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of free 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?

  1. Hier lohnt auch noch mal der Blick in die bi-variaten Korrelationen der Indikatoren.↩︎

  2. Das gilt natürlich nicht immer und unumwunden. Bei der Skalenkonstruktion ist es meist unproblematisch sich frühzeitig von solchen problematischen Indikatoren zu trennen. Bei pre-registrierten Studien und Replikationsstudien hingegen, wäre ich persönlich zurückhaltender die Messung nachträglich entsprechend anzupassen. Hier kann es sinnvoll sein, die ursprünglich nicht im Modell vorgesehene Kovarianz zu modellieren und somit sichtbar zu machen, wo in den erhobenen Daten genau sich Kovarianz zeigt.↩︎