8  Konfirmatorische Faktorenanalyse

Quelle

Schnauber, A. (2017). Medienselektion im Alltag. Springer Fachmedien Wiesbaden. https://doi.org/10.1007/978-3-658-15441-7

8.1 Pakete und Daten

Wir laden zunächst die notwendigen R-Pakete. Für die konfirmatorische Faktorenanalyse benötigen wir das das lavaan-Paket, für die Reliabilitätsbestimmung semTools. Wie immer laden wir außerdem tidyverse und report.

library(lavaan)
library(semTools)
library(tidyverse)
library(report)

Für die konfirmatorische Faktorenanalyse nutzen wir wieder den Excel-Datensatz gewohnheiten.xlsx.

d_habit <- readxl::read_excel("data/gewohnheiten.xlsx")
d_habit
# A tibble: 791 × 195
         id vf_fernseher vf_computer vf_tablet vf_radio vf_zeitung vf_smartphone
      <dbl>        <dbl>       <dbl>     <dbl>    <dbl>      <dbl>         <dbl>
1 403074747            1           1         0        1          0             1
2 403087148            1           1         1        1          0             1
3 403129944            1           1         0        1          1             2
4 403143142            1           1         0        0          0             2
5 403200247            1           1         0        1          0             1
# ℹ 786 more rows
# ℹ 188 more variables: i1_fernseher <dbl>, i1_computer <dbl>, i1_tablet <dbl>,
#   i1_smartphone <dbl>, i1_radio <dbl>, i1_zeitung <dbl>, vm_ferseher <dbl>,
#   vm_computer <dbl>, vm_tablet <dbl>, vm_smartphone <dbl>, vm_radio <dbl>,
#   vm_zeitung <dbl>, r_fernseher <dbl>, r_computer <dbl>, r_tablet <dbl>,
#   r_smartphone <dbl>, r_radio <dbl>, r_zeitung <dbl>, f_einst1 <dbl>,
#   f_einst2 <dbl>, f_einst3 <dbl>, f_einst4 <dbl>, f_srhi_r1 <dbl>, …

8.2 Überprüfung der Items

Zunächst machen wir uns wie immer mit den relevanten Variablen vertraut und nutzen dafür die report_table()-Funktion. Wir nutzen wieder die Skala für die Gewohnheitsstärke bei der Computer-Nutzung (c_srhi_X), die wir für die weiteren Schnitte ausschneiden und in einem neuen Datensatz speichern.

d_cfa <- d_habit |>
  select(c_srhi_r1:c_srhi_c2)

d_cfa |>
  report::report_table()
Variable  | n_Obs | Mean |   SD | Median |  MAD |  Min |  Max | Skewness | Kurtosis | percentage_Missing
--------------------------------------------------------------------------------------------------------
c_srhi_r1 |   791 | 4.57 | 0.85 |        | 0.00 | 1.00 | 5.00 |    -2.37 |     5.67 |               2.65
c_srhi_r2 |   791 | 4.31 | 1.04 |        | 0.00 | 1.00 | 5.00 |    -1.67 |     2.23 |               2.65
c_srhi_r3 |   791 | 4.45 | 0.92 |        | 0.00 | 1.00 | 5.00 |    -2.02 |     4.02 |               2.65
c_srhi_a1 |   791 | 2.03 | 1.31 |        | 0.00 | 1.00 | 5.00 |     1.03 |    -0.22 |               2.65
c_srhi_a2 |   791 | 2.49 | 1.38 |        | 1.48 | 1.00 | 5.00 |     0.44 |    -1.08 |               2.65
c_srhi_a3 |   791 | 1.79 | 1.19 |        | 0.00 | 1.00 | 5.00 |     1.40 |     0.79 |               2.65
c_srhi_a4 |   791 | 2.68 | 1.28 |        | 1.48 | 1.00 | 5.00 |     0.20 |    -1.01 |               2.65
c_srhi_a5 |   791 | 2.46 | 1.41 |        | 1.48 | 1.00 | 5.00 |     0.45 |    -1.15 |               2.65
c_srhi_a6 |   791 | 1.87 | 1.19 |        | 0.00 | 1.00 | 5.00 |     1.25 |     0.47 |               2.65
c_srhi_c1 |   791 | 3.52 | 1.23 |        | 1.48 | 1.00 | 5.00 |    -0.50 |    -0.66 |               2.65
c_srhi_c2 |   791 | 3.89 | 1.25 |        | 1.48 | 1.00 | 5.00 |    -0.94 |    -0.19 |               2.65

Die Ergebnisse der explorativen Faktoranalyse zur Gewohnheitsstärke bei der Computernutzung (Variablen c_srhi_X) haben drei Faktoren offengelegt: die fehlende Bewusstheit der Computernutzung, den Wiederholungscharakter der Computernutzung und die geringe Kontrollierbarkeit der Computernutzung. Hätten wir uns eingehend mit Gewohnheiten bei der Mediennutzung befasst, hätten wir diese drei Dimensionen auch theoretisch herleiten können vgl. Schnauber, A. (2017). Medienselektion im Alltag. Springer Fachmedien Wiesbaden. https://doi.org/10.1007/978-3-658-15441-7. Mit der konfirmatorischen Faktoranalyse (CFA) testen wir, ob die Items tatsächlich die drei Dimensionen abbilden können, d.h. im Gegensatz zur explorativen Faktorenanalyse wird nicht nur die Anzahl der Faktoren, sondern auch konkret die Zugehörigkeit der Items zu den Faktoren sowie deren Korrelationen untereinander getestet (sog. Messhypothesen).

Grundsätzlich sollten die Items, die wir für eine konfirmatorische Faktoranalyse verwenden wollen, ein metrisches Skalenniveau aufweisen (d.h. mindestens intervallskaliert) oder dichotom sein. Die verwendeten Items sind alle auf einer 5-er Skala erhoben und wenigstens quasi-metrisch.

8.3 Modellschätzung

Für die Modellschätzung (d.h. wir gehen von drei Dimensionen bei der Gewohnheitsstärke aus) nutzen wir das Paket lavaan, das wir schon aus dem Kapitel zur Pfadanalyse kennen (Messmodelle sind nichts anderes als Strukturgleichungsmodelle). Auch hier wird zunächst das Modell spezifiziert und anschließend mit den empirischen Daten geschätzt.

Wir definieren im lavaan-Modell jede latente Variable bzw. Faktor mit einem character-Objekt im folgenden Format:

latente_variable =~ variable1 + variable2 + ... + variable_n

Für unsere CFA mit 3 Faktoren heißt das:

cfa_model <- "
   repetition =~ c_srhi_r1 + c_srhi_r2 + c_srhi_r3
   automatism =~ c_srhi_a1 + c_srhi_a2 + c_srhi_a3 + c_srhi_a4 + c_srhi_a5 + c_srhi_a6
   control =~ c_srhi_c1 + c_srhi_c2
"

Im nächsten Schritt nutzen wir die Funktion cfa() mit unserer Spezifikation, das die latenten Faktoren enthält.

cfa_results <- lavaan::cfa(cfa_model, data = d_cfa)

Sobald das Modell geschätzt wurde, können wir uns mit Hilfe der Funktion summary() eine Modellzusammenfassung ansehen. Dabei fordern wir sowohl Modellgütemaße als auch vollstandardisierte Koeffizienten (z.B. für Faktorladungen) an.

summary(cfa_results, fit = TRUE, std = TRUE)
lavaan 0.6-18 ended normally after 35 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        25

                                                  Used       Total
  Number of observations                           770         791

Model Test User Model:
                                                      
  Test statistic                               301.621
  Degrees of freedom                                41
  P-value (Chi-square)                           0.000

Model Test Baseline Model:

  Test statistic                              4345.426
  Degrees of freedom                                55
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.939
  Tucker-Lewis Index (TLI)                       0.919

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)             -11352.785
  Loglikelihood unrestricted model (H1)     -11201.975
                                                      
  Akaike (AIC)                               22755.570
  Bayesian (BIC)                             22871.730
  Sample-size adjusted Bayesian (SABIC)      22792.343

Root Mean Square Error of Approximation:

  RMSEA                                          0.091
  90 Percent confidence interval - lower         0.081
  90 Percent confidence interval - upper         0.101
  P-value H_0: RMSEA <= 0.050                    0.000
  P-value H_0: RMSEA >= 0.080                    0.970

Standardized Root Mean Square Residual:

  SRMR                                           0.069

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
  repetition =~                                                         
    c_srhi_r1         1.000                               0.624    0.731
    c_srhi_r2         1.427    0.070   20.282    0.000    0.890    0.856
    c_srhi_r3         1.106    0.058   18.917    0.000    0.690    0.749
  automatism =~                                                         
    c_srhi_a1         1.000                               1.046    0.798
    c_srhi_a2         0.881    0.045   19.447    0.000    0.922    0.669
    c_srhi_a3         0.984    0.037   26.720    0.000    1.029    0.863
    c_srhi_a4         0.622    0.044   14.208    0.000    0.651    0.509
    c_srhi_a5         0.948    0.046   20.657    0.000    0.991    0.703
    c_srhi_a6         0.992    0.037   27.002    0.000    1.037    0.871
  control =~                                                            
    c_srhi_c1         1.000                               1.091    0.885
    c_srhi_c2         0.943    0.046   20.362    0.000    1.028    0.820

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  repetition ~~                                                         
    automatism        0.028    0.027    1.037    0.300    0.043    0.043
    control           0.440    0.037   11.775    0.000    0.647    0.647
  automatism ~~                                                         
    control           0.320    0.049    6.501    0.000    0.281    0.281

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .c_srhi_r1         0.340    0.022   15.304    0.000    0.340    0.466
   .c_srhi_r2         0.289    0.030    9.625    0.000    0.289    0.267
   .c_srhi_r3         0.372    0.025   14.722    0.000    0.372    0.439
   .c_srhi_a1         0.624    0.039   16.081    0.000    0.624    0.363
   .c_srhi_a2         1.047    0.058   18.014    0.000    1.047    0.552
   .c_srhi_a3         0.362    0.027   13.620    0.000    0.362    0.255
   .c_srhi_a4         1.208    0.064   18.933    0.000    1.208    0.740
   .c_srhi_a5         1.003    0.057   17.674    0.000    1.003    0.505
   .c_srhi_a6         0.342    0.026   13.185    0.000    0.342    0.241
   .c_srhi_c1         0.330    0.050    6.551    0.000    0.330    0.217
   .c_srhi_c2         0.514    0.050   10.339    0.000    0.514    0.327
    repetition        0.389    0.036   10.904    0.000    1.000    1.000
    automatism        1.093    0.085   12.938    0.000    1.000    1.000
    control           1.190    0.089   13.321    0.000    1.000    1.000

Die Ausgabe besteht aus drei Teilen:

  • Die Kopfzeile: Informationen über Lavaan, die Optimierungsmethode, die Anzahl der freien Parameter und die Anzahl der in der Analyse verwendeten Beobachtungen (in diesem Fall n = 770)
  • Informationen zum Modellfit: Enthält verschiedene Anpassungsindizes zur Bewertung der Modellanpassung
  • Parameter-Schätzunger: Der letzte Abschnitt enthält alle Parameter, die geschätzt wurden (einschließlich der Faktorladungen, Varianzen, Schwellenwerte…)

Zunächst schauen wir, ob das Modell konvergiert ist, dann auf die Fit-Indizes .

Eine signifikante Teststatistik (ein signifikanter Chi-Quadrat-Wert) weist auf eine Diskrepanz zwischen dem vorgeschlagenen Modell und den beobachteten Daten hin (Nullhypothese: die modellimplizierte Kovarianzmatrix entspricht der empirischen Kovarianzmatrix). Der signifikante Chi-Quadrat-Wert zeigt, dass das Modell nicht perfekt zu den Daten passt, was aber bei größeren Stichproben häufig vorkommt, da dort auch kleinere Abweichungen signifikant sind. Daher betrachten wir auch immer eine Reihe von alternativen Fit-Indizes.

  • CFI (Comparative Fit Index) und TLI (Tucker-Lewis-Index) messen die Verbesserung der Modellanpassung im Vergleich zu einem Basismodell, in dem nichts korreliert. Sie sollten bei guten Modellen >= 0.95 sein.

  • RMSEA (Root mean Square Error of Approximation) bewertet die Modellpassung zwischen dem Modell und den beobachteten Daten unter Berücksichtigung des Approximationsfehlers, sollte <= 0.05 und nicht signifikant sein.

  • SRMR (Standardized Root Mean Square Residual): misst die standardisierte Diskrepanz zwischen beobachteten und modellimplzierten Korrelationen zwischen den gemessenen Variablen. Ein kleinerer SRMR-Wert zeigt eine bessere Anpassung an, sollte <= 0.08, besser <= .05 sein.

Im Beispiel ist der Chi-Quadrat-Test signifikant \(\chi^2\)(41) = 301.6, p < .05, CFI und TLI liegen unter 0.95, RMSEA über 0.05, d.h. diese Anpassungsindizes weisen auf einen moderaten bis schlechten Modelfit hin, auch wenn der SRMR befriedigend ist.

Betrachten wir anschließend die standardisierten Faktorladungen, können wir sehen, dass die meisten Items recht hoch auf “ihren” Faktor laden (>= .7). Das bedeutet, dass die latente Variable mindestens 50% der Varianz in den Items erklären kann (\(R^2\) = .7^2 = .49) Kurz, es gibt noch Verbesserungsbedarf, aber die Skala scheint die angenommene dreidimensionale Faktorstruktur zu haben. Die Faktoren Kontrolle und Wiederholung korrelieren sehr stark (r = .648), Wiederholung und Automatismus hingegen fast gar nicht, wie wir im Abschnitt Covariances des Outputs sehen können.

8.4 Modellverbesserung

Was kann die Ursache für fehlende Modellgüte sein?

  • Einige Items gehören zu einem anderen oder auch zu gar keinem der spezifizierten Faktoren, sie sind schlicht keine validen Indikatoren des Konstrukts.
  • Einige Items gehören zu mehr als einem spezifizierten Faktor, d.h. es gibt nicht-modellierte Doppelladungen, deren Nicht-Berücksichtigung den Modellfit verschlechtern.
  • Die Variablen sind nicht (annähernd) normalverteilt, so dass man mit einem anderen Schätzverfahren arbeiten sollte.
  • Die Messhypothesen sind schlicht falsch, d.h. die unterstellte Faktorstruktur stimmt insgesamt nicht

8.4.1 Faktorladungen

Bei den Faktorladungen sehen wir, dass wieder das Item c_srhi_a4 deutlich geringer lädt als die anderen (wie bei der explorativen Faktoranalyse auch). Wir könnten daher versuchen, durch das Weglassen von c_srhi_a4 den Modellfit zu verbessern. Beim Löschen von Items muss allerdings auch der Validitätsaspekt berücksichtigt werden. Eine Skala mit vielen fast identisch formulierten Items wird eine hohe Reliabilität und Items hohe Ladungen haben, allerdings auch nur einen (zu) schmalen Aspekt des theoretischen Konstrukts abdecken, daher muss man überlegen, ob das zu löschende Item aus dieser Perspektive verzichtbar ist.

cfa_model2 <- "
   repetition =~ c_srhi_r1 + c_srhi_r2 + c_srhi_r3
   automatism =~ c_srhi_a1 + c_srhi_a2 + c_srhi_a3 + c_srhi_a5 + c_srhi_a6
   control =~ c_srhi_c1 + c_srhi_c2
"

cfa_results2 <- lavaan::cfa(cfa_model2, data = d_cfa)
summary(cfa_results2, fit = T, std = T)
lavaan 0.6-18 ended normally after 35 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        23

                                                  Used       Total
  Number of observations                           770         791

Model Test User Model:
                                                      
  Test statistic                               243.463
  Degrees of freedom                                32
  P-value (Chi-square)                           0.000

Model Test Baseline Model:

  Test statistic                              4082.531
  Degrees of freedom                                45
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.948
  Tucker-Lewis Index (TLI)                       0.926

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)             -10174.154
  Loglikelihood unrestricted model (H1)     -10052.422
                                                      
  Akaike (AIC)                               20394.308
  Bayesian (BIC)                             20501.174
  Sample-size adjusted Bayesian (SABIC)      20428.139

Root Mean Square Error of Approximation:

  RMSEA                                          0.093
  90 Percent confidence interval - lower         0.082
  90 Percent confidence interval - upper         0.104
  P-value H_0: RMSEA <= 0.050                    0.000
  P-value H_0: RMSEA >= 0.080                    0.974

Standardized Root Mean Square Residual:

  SRMR                                           0.071

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
  repetition =~                                                         
    c_srhi_r1         1.000                               0.624    0.731
    c_srhi_r2         1.425    0.070   20.300    0.000    0.889    0.855
    c_srhi_r3         1.106    0.058   18.935    0.000    0.690    0.750
  automatism =~                                                         
    c_srhi_a1         1.000                               1.037    0.791
    c_srhi_a2         0.869    0.046   18.809    0.000    0.902    0.655
    c_srhi_a3         1.004    0.038   26.699    0.000    1.041    0.873
    c_srhi_a5         0.943    0.047   20.165    0.000    0.978    0.694
    c_srhi_a6         1.008    0.038   26.849    0.000    1.045    0.878
  control =~                                                            
    c_srhi_c1         1.000                               1.091    0.885
    c_srhi_c2         0.942    0.046   20.361    0.000    1.027    0.820

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  repetition ~~                                                         
    automatism        0.018    0.027    0.688    0.491    0.028    0.028
    control           0.440    0.037   11.780    0.000    0.647    0.647
  automatism ~~                                                         
    control           0.310    0.049    6.355    0.000    0.274    0.274

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .c_srhi_r1         0.339    0.022   15.293    0.000    0.339    0.465
   .c_srhi_r2         0.290    0.030    9.676    0.000    0.290    0.268
   .c_srhi_r3         0.371    0.025   14.717    0.000    0.371    0.438
   .c_srhi_a1         0.642    0.040   16.206    0.000    0.642    0.374
   .c_srhi_a2         1.084    0.060   18.127    0.000    1.084    0.571
   .c_srhi_a3         0.338    0.026   12.899    0.000    0.338    0.238
   .c_srhi_a5         1.029    0.058   17.760    0.000    1.029    0.518
   .c_srhi_a6         0.326    0.026   12.612    0.000    0.326    0.230
   .c_srhi_c1         0.329    0.050    6.523    0.000    0.329    0.216
   .c_srhi_c2         0.515    0.050   10.365    0.000    0.515    0.328
    repetition        0.389    0.036   10.916    0.000    1.000    1.000
    automatism        1.075    0.084   12.773    0.000    1.000    1.000
    control           1.191    0.089   13.330    0.000    1.000    1.000

Der Chi-Quadrat-Test ist zwar immer noch signifikant, CFI und TLI haben sich verbessert, RMSEA liegt unter 0.05 und SRMR liegt unter 0.08, passt also. Wir könnten also noch weiter versuchen, unser Modell zu verbessern.

8.4.2 Modification Indices

Hierfür könnten wir uns die sog. Modification Indices (MI) des Modells ansehen, die wir mit der entsprechenden Funktion modificationindices() erhalten. Jeder MI gibt die Verbesserung des Modells (=Reduktion des Chi-Quadrat-Werts) wieder, wenn wir den vorgeschlagenen Parameter (Ladung, Korrelation, etc.) zum Modell hinzufügen würden. Die Spalte mi im Output-Tibble enthält den eigentlichen Modification Index, d.h. wir können absteigend danach sortieren und uns nur die 5 größten MI ausgeben lassen, die also das Modell am meisten verbessern würden.

lavaan::modificationindices(cfa_results2) |>
  arrange(desc(mi)) |>
  head(5)
         lhs op       rhs     mi   epc sepc.lv sepc.all sepc.nox
1 repetition =~ c_srhi_a5 68.817 0.554   0.345    0.245    0.245
2  c_srhi_a2 ~~ c_srhi_a5 63.061 0.336   0.336    0.318    0.318
3  c_srhi_a3 ~~ c_srhi_a6 52.869 0.209   0.209    0.631    0.631
4    control =~ c_srhi_a5 50.159 0.282   0.307    0.218    0.218
5 repetition =~ c_srhi_a2 24.293 0.334   0.209    0.151    0.151

Wir sehen in den ersten beiden Zeilen das Item c_srhi_a5: In Zeile 1 wird eine Doppelladung repetition =~ c_srhi_a5 vorgeschlagen, d.h. das Item spiegelt nicht nur den Automatismus-, sondern z.T. auch den Wiederholungsaspekt wider. In Zeile 2 wird vorgeschlagen, doch die Items a2 und a5 korrelieren zu lassen ~~, was ein Indikator dafür ist, dass beide Items außer dem Automatisierungsaspekt noch eine Gemeinsamkeit haben. Beide MI-Vorschläge würden die gewünschte Einfachstruktur (jedes Item gehört zu genau einem Faktor) der Skala verändern, weshalb wir vielleicht c_srhi_a5 auch entfernen sollten, zumal das Item auch noch auf die Kontrolldimension laden würde, siehe Zeile 4.

8.5 Reliablität

Zum Schluss können wir uns noch die Realiabilität der fertigen Skala ansehen. Neben Cronbachs Alpha werden noch weitere Reliabilitätskoeffizienten ausgegeben (Bollen’s ω (omega), Bentler’s ω (omega2) und McDonald’s ω (omega3)), die auf dem geschätzten CFA-Modell basieren und weniger (falsche) Annahmen über die Faktorstruktur haben als Alpha. Bei einem guten Modell unterscheiden sich die Werte nicht sehr stark, enthält das Modell Items mit niedrigen Faktorladungen, die aber trotzdem klar zu einem Faktor gehörten, weichen die Omega-Werte erheblich von Alpha ab. Alle Werte liegen zwischen 0 und 1, wobei Werte, die näher bei 1 liegen, für eine gute Reliabilität stehen (vgl. das dazugehörige Kapitel in der BA-Statistik). Die letzte Zeile avevar bezeichnet die Average Variance Extracted, also die durchschnittlichen quadrierten Faktorladungen, die äquivalent zum o.g. \(R^2\) sind, d.h. wieviel Varianz in den Items durch die latente Variable erklärt werden kann. Auch hier sind höhere Werte besser, was bei allen drei Subskalen der Fall ist.

semTools::reliability(cfa_results2)
       repetition automatism   control
alpha   0.8208750  0.8831898 0.8410305
omega   0.8291862  0.8798391 0.8417930
omega2  0.8291862  0.8798391 0.8417930
omega3  0.8273931  0.8702994 0.8417930
avevar  0.6235352  0.5949607 0.7269868
Weiterführende Materialien

Das Codebuch für den Datensatz gewohnheiten.xlsx finden Sie hier: Bachelor Kursmaterialien

8.6 Glossar

Funktion Definition
lavaan::cfa Konfirmatorische Faktorenanalyse
lavaan::modificationindices Verbesserungsfähigkeit des Modells berechnen
semTools::reliability Reliabilitätskennwerte berechnen

8.7 Hausaufgabe

Sie möchten prüfen, ob die Items zur Gewohnheitsstärke auch bei der Smartphonenutzung die drei Dimensionen abbilden. Die Items sind in den elf Variablen s_srhi_X enthalten. Definieren und schätzen Sie das Modell. Passt das Modell zu den Daten? Wie kann man ggf. das Modell verbessern?