–>

Die explorative Faktorenanalyse nutzen wir, um latente (d.h. nicht beobachtete) Faktoren zu finden, die unseren Daten vermutlich zugrundeliegen. Besonders oft wird dieses Verfahren bei der Erstellung und Validierung von Fragebögen eingesetzt, um zu überprüfen, welche latenten Faktoren mit diesem Fragebogen erfasst werden.

Pakete

Alle Berechnungen und Abbildungen können wir mit unseren Standardpaketen durchführen. Wir benötigen das tidyverse zum Data Wrangling und zur Visualisierung der Daten. haven benötigen wir für den Import von SPSS-Dateien und rstatix für statistische Analysen. Wenn man sich den Import und das Bereinigen der Daten sparen möchte (Schritte, die man dennoch üben sollte), findet man die Daten auch im Paket costatcompanion.

Zudem benötigen wir das Paket psych, mit dem wir die Faktorenanalyse durchführen werden; für Korrelogramme benötigen wir corrgram.

library(tidyverse)
library(haven)
library(rstatix)
library(costatcompanion)
library(corrgram)
library(psych)

Beispiel

Vielen Leuten macht Feiern einfach Spaß. Deshalb hat ein kluger Kopf einen Fragebogen entwckelt, der abbilden soll, wie sehr sich jemand auf Feiern freut. Der Fragebogen zur Freude an Festivitäten (FFF) umfasst 15 Fragen, die auf einer visuellen Analogskala (VAS) auf einer Skala von 0 (keine Zustimmung) bis 10 (vollste Zustimmung) eingeschätzt werden können.

Item Text
1 Wenn ich an das Wochenende denke, werde ich aufgeregt.
2 Ich mag es, mich mit anderen Menschen zu unterhalten.
3 Mich findet man ab 20:00 Uhr auf der Tanzfläche.
4 Eine spontane Feier wäre jetzt was.
5 Ich könnte die ganze Nacht durchtanzen.
6 Andere Menschen sind mir zuwider.
7 Ich freue mich auf meinen Geburtstag.
8 Ich freue mich auf die Geburtstage meiner Freunde.
9 Ich tanze gerne mit anderen Menschen zusammen.
10 Ich lerne auf Feiern gerne andere Menschen kennen.
11 Two-Step, Air-Punches und Wave sind meine Sprache.
12 Ich organisiere gerne Feiern.
13 Ich freue mich darüber, Einladungen zu Feiern zu erhalten.
14 Ich feiere gerne mit anderen Menschen.
15 Es geht mir gut, wenn ich weiß, dass keine Feier ansteht.

Wir wollen nun herausfinden, welche nicht beobachteten Fakoren hinter diesen 15 Fragen, oder auch Items, stecken könnten.

Voraussetzungen

Wir brauchen Leute, Leute, Leute! Die mit Abstand wichtigste Voraussetzung ist die Stichprobengröße, d.h. alles ab 300 ist okay, ab 1000 super – alles darunter ist wirklich schlech (Field, 2018). Zudem gibt es das Kaiser-Meyer-Olkin-Kriterium (KMO), das nahe 1 sein sollte. Eine einflussreiche Quelle scheinen hier Hutcheson & Sofroniou (1999) zu sein, die “cut-offs” bezüglich akzeptabler KMO-Werte gebildet haben. Nach ihnen sollte der KMO definitiv größer .70 sein.

Zudem gibt es den Bartlett-Test, der die Hypothese prüft, dass die Korrelationsmatrix der Items eine Einheitsmatrix ist. Eine Einheitsmatrix hat auf der Diagonalen Einsen und an allen anderen Stellen Nullen. Eine Korrelationsmatrix, die so aussehen würde, läge nahe, dass die Variablen nicht miteinander korrelieren. Die Basis für eine Faktorenanalyse sind aber Korrelationen.

Daten

Die Daten sind wie immer im Daten-Ordner des Git-Repositories (party.sav), oder im costatcompanion zu finden.

party
## # A tibble: 320 x 16
##    id    item_1 item_2 item_3 item_4 item_5 item_6 item_7 item_8 item_9 item_10
##    <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
##  1 1       6.13   6.47   7.16   7.38   7.77   2.38   6.79   5.73   7.50    4.48
##  2 2       5.24   4.42   1.39   4.84   5.42   5.89   7.04   6.97   3.29    4.62
##  3 3       4.01   5.90   4.46   4.55   4.87   1.53   4.92   5.57   3.93    5.85
##  4 4       4.99   3.40   7.63   4.81   6.35   6.31   2.60   5.89   4.88    3.90
##  5 5       6.85   4.58   5.42   5.30   6.19   4.55   6.34   4.14   6.05    4.52
##  6 6       5.16   4.48   7.32   6.24   5.88   7.29   4.80   3.59   5.84    4.36
##  7 7       5.87   6.66   4.29   4.24   6.19   4.40   3.78   4.14   6.11    4.03
##  8 8       6.69   7.12   8.37   8.10   6.51   2.85   6.84   8.31   6.29    3.77
##  9 9       5.05   2.65   6.61   5.87   6.54   5.19   5.43   6.27   4.87    3.73
## 10 10      6.54   4.56   4.41   5.32   5.50   3.55   5.66   5.07   4.38    5.97
## # ... with 310 more rows, and 5 more variables: item_11 <dbl>, item_12 <dbl>,
## #   item_13 <dbl>, item_14 <dbl>, item_15 <dbl>

In der ersten Spalte (id) sind die Probanden-IDs eingetragen, in den folgenden Spalten die Einschätzung jedes Probanden zu den obigen Aussagen des Fragebogens.

EDA

Aus den Dimensionen des Datensatzes geht hervor, dass wir eine Stichprobengröße von \(N = 320\) haben, was gut ist. Zudem ist es immer eine gute Idee, sich die Korrelationen der Variablen untereinander anzusehen – am besten in einem Korrelogramm. Zunächst werden wir aber einmal die Spalte id los, die zwar für die Dateneingabe sinnvoll und nützlich ist, in den weiteren Analysen aber nur stört.

party_raw <- party %>% 
  select(-id)

party_raw
## # A tibble: 320 x 15
##    item_1 item_2 item_3 item_4 item_5 item_6 item_7 item_8 item_9 item_10
##     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
##  1   6.13   6.47   7.16   7.38   7.77   2.38   6.79   5.73   7.50    4.48
##  2   5.24   4.42   1.39   4.84   5.42   5.89   7.04   6.97   3.29    4.62
##  3   4.01   5.90   4.46   4.55   4.87   1.53   4.92   5.57   3.93    5.85
##  4   4.99   3.40   7.63   4.81   6.35   6.31   2.60   5.89   4.88    3.90
##  5   6.85   4.58   5.42   5.30   6.19   4.55   6.34   4.14   6.05    4.52
##  6   5.16   4.48   7.32   6.24   5.88   7.29   4.80   3.59   5.84    4.36
##  7   5.87   6.66   4.29   4.24   6.19   4.40   3.78   4.14   6.11    4.03
##  8   6.69   7.12   8.37   8.10   6.51   2.85   6.84   8.31   6.29    3.77
##  9   5.05   2.65   6.61   5.87   6.54   5.19   5.43   6.27   4.87    3.73
## 10   6.54   4.56   4.41   5.32   5.50   3.55   5.66   5.07   4.38    5.97
## # ... with 310 more rows, and 5 more variables: item_11 <dbl>, item_12 <dbl>,
## #   item_13 <dbl>, item_14 <dbl>, item_15 <dbl>
party_raw %>% 
  get_summary_stats()
## # A tibble: 15 x 13
##    variable     n   min   max median    q1    q3   iqr   mad  mean    sd    se
##    <chr>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 item_1     320 0     10      4.95  3.90  6.15  2.25  1.68  4.88  1.83 0.102
##  2 item_10    320 0.517 10      4.81  3.86  6.06  2.20  1.64  4.96  1.57 0.088
##  3 item_11    320 0     10      4.86  3.97  6.07  2.10  1.46  4.94  1.75 0.098
##  4 item_12    320 0      9.07   4.92  3.59  6.06  2.46  1.79  4.84  1.69 0.095
##  5 item_13    320 0.321  8.75   4.87  3.87  6.12  2.25  1.64  4.93  1.64 0.092
##  6 item_14    320 0.187  9.89   5.00  3.92  6.33  2.41  1.75  5.02  1.72 0.096
##  7 item_15    320 0      9.44   4.94  4.02  6.05  2.04  1.51  5.06  1.48 0.083
##  8 item_2     320 0.928  8.53   5.18  3.97  6.29  2.32  1.74  5.08  1.57 0.088
##  9 item_3     320 0.686 10      4.95  3.91  6.18  2.27  1.60  5.05  1.76 0.098
## 10 item_4     320 0      8.78   4.88  3.79  6.04  2.25  1.68  4.89  1.61 0.09 
## 11 item_5     320 0.216 10      4.88  3.90  5.97  2.07  1.54  4.93  1.60 0.089
## 12 item_6     320 1.24   8.96   5.07  4.18  5.94  1.76  1.33  5.05  1.38 0.077
## 13 item_7     320 0.525  9.46   4.80  3.91  5.78  1.86  1.38  4.87  1.50 0.084
## 14 item_8     320 0.663  9.80   4.92  3.82  6.07  2.25  1.69  4.92  1.8  0.101
## 15 item_9     320 0      9.74   5.03  3.88  6.27  2.39  1.78  4.99  1.77 0.099
## # ... with 1 more variable: ci <dbl>
party_raw %>% 
  corrgram::corrgram(order = TRUE)

Uns wird hier auffallen, dass zwei Items (15 und 6) mit allen anderen negativ korrelieren. Das kann passieren, wenn die Items “falsch herum” codiert wurden. In diesem Fall können wir die Annahme bestätigen, denn dies sind die einzigen beiden Fragen, die “entgegen” der Richtung des Fragebogens sind. Alle anderen Fragen bedeuten bei größerer Zustimmung mehr Spaß beim Feiern, diese beiden jedoch nicht. Wir sollten sie also umcodieren.

party_recoded <- party_raw %>% 
  mutate(
    across(c(item_6, item_15), ~ 10 - .)
  )

party_recoded %>% 
  corrgram(panel = panel.fill, order = TRUE)

Und schon sind alle Items miteinander positiv korreliert. Anhand der bereits sichtbaren Clusterung können wir davon ausgehen, dass mindestens ein latenter Faktor vorhanden ist.

Bartlett-Test

Den Bartlett-Test kann man folgendermaßen ausführen. Das Ergebnis ist signifikant, \(\chi^2(105) = 1547.5, p < .001\), und bedeutet, dass unsere Korrelationsmatrix keine Einheitsmatrix ist. Also alles super!

psych::cortest.bartlett(party_recoded)
## $chisq
## [1] 1547.493
## 
## $p.value
## [1] 5.143183e-255
## 
## $df
## [1] 105

KMO

Auch der KMO ist sehr einfach auszuführen. Unser KMO ist .88, also alles super. Unsere Daten eignen sich also für eine EFA.

KMO(party_recoded)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = party_recoded)
## Overall MSA =  0.88
## MSA for each item = 
##  item_1  item_2  item_3  item_4  item_5  item_6  item_7  item_8  item_9 item_10 
##    0.90    0.88    0.85    0.92    0.83    0.80    0.89    0.90    0.87    0.84 
## item_11 item_12 item_13 item_14 item_15 
##    0.85    0.92    0.90    0.88    0.91

Anzahl der zu extrahierenden Faktoren

Scree-Plot

Die Situation bei der EFA ist etwas misslich: Wir wollen latente Faktoren “entdecken”, müssen dem Verfahren aber vorher sagen, wie viele Faktoren wir eigentlich extrahieren/finden wollen. Deshalb kommt der Bestimmung der Anzahl der zu extrahierenden Faktoren eine besondere Bedeutung zu.

scree(party_recoded, factors = FALSE)

Im Scree-Plot suchen wir nach dem “Knick” in der Linie der Eigenwerte. Nach diesem “Knick” sollen die restlichen Eigenwerte nur noch wie “Geröll” (engl. scree) aussehen, also flach ablaufen. Dabei gibt es jedoch unterschiedliche Auffassungen darüber, ob man den letzten Punkt vor dem Knick noch mit aufnimmt, oder nicht. In diesem Beispiel ist das Ergebnis recht klar, wir würden drei Faktoren extrahieren. Beachten sollte man jedoch, dass der Scree-Test ein rein subjektives Verfahren und somit kein wirklicher “Test” ist.

Parallelanalyse

In SPSS wäre man ohne weiteres Zutun nun aufgeschmissen, in R gibt es zum Glück die Parallelanalyse (Horn, 1965), mit der sich die Anzahl der zu extrahierenden Faktoren objektiv bestimmen lässt. Dazu werden anhand der Dimensionen des Datensatzes zufällige Daten generiert und die dem entsprechenden Eigenwerte in den Scree-Plot eingezeichnet. Extrahieren würden wir so viele Faktoren, deren Eigenwert über denen der zufälligen Simulationen liegt.

fa.parallel(party_recoded, fa = "pc")

Wir würden also auch anhand des Ergebnisses des Scree-Tests drei Faktoren extrahieren.

Rotation

Um die Faktoren möglichst gut auseinanderhalten zu können, ist es eine gute Idee, die Koordinatenachsen im \(n\)-Dimensionalen Raum zu rotieren (\(n\) ist dabei die Anzahl der Faktoren). Dabei kann man zwischen orthogonalen und obliquen Rotationen unterscheiden. Bei orthogonalen Rotationen postuliert man, dass die Faktoren nicht miteinander korrlieren, bei obliquen Rotationen geht man von einer Korrelation der Faktoren aus (wie es in der Psychologie üblich ist).

Gute orthogonale Rotation sind Varimax und Quartimax; gute oblique sind Oblimin und Promax.

Durchführung

In meiner Benutzung des Begriffs “Faktorenalayse” habe ich bisher etwas geschummelt. Streng genommen machen wir nämlich keine Faktorenanalyse, sondern eine Hauptkomponentenanalyse. Bei einer Faktorenanalyse versuchen wir – ganz vereinfacht gesagt – latente Faktoren durch die Items zu erklären. Bei der Hauptkomponentenanalyse gehen wir jedoch davon aus, das der Zusammenhang genau anders herum ist: Wie denken uns, dass es irgendwo diese latenten Faktoren gibt und diese dann die Antworten der Probanden auf den Items beeinflussen. Wir schätzen die Faktoren zwar anhand der Items, aber wir unterstellen den Zusammenhang von den latenten Faktoren auf die Items.

Die Hauptkomponentenanalyse führen wir mit der Funktion principal() aus. Als Argument nfactors geben wir die Anzahl der zu extrahierenden Faktoren ans, als rotate die Rotationsmethode.

party_efa <- principal(party_recoded, nfactors = 3, rotate = "oblimin")

Wir erhalten so einen ganz “messy” Output, in dem uns einiges mitgeteilt wird: Da ist zunächst die Strukturmatrix, in der pro Item die standardisierten Ladungen auf jeden Faktor angegeben sind (sowie die Kommunalitäten in h2, Uniqueness in u2, und die Komplexität in com). Die Faktorladungen nutzen wir, um herauszufinden, auf welchem Faktor ein Item “lädt”; je höher die Ladung, desto mehr “lädt” das Item auf dem Faktor, desto mehr gehört es zu dem Faktor.

Anschließend erhalten wir Angaben zu den extrahierten Faktoren an sich, unter anderem die erklärten Varianzen. Danach gibt es die Korrelation der latenten Faktoren untereinander und noch einige Angaben zur Modellgüte.

Uns interessieren zu Beginn vor allem die Faktorladungen, welche wir uns so ausgeben lassen können.

loadings(party_efa)
## 
## Loadings:
##         TC1    TC2    TC3   
## item_1   0.786              
## item_2                 0.702
## item_3          0.790       
## item_4   0.690  0.123       
## item_5          0.788       
## item_6                 0.746
## item_7   0.691 -0.111       
## item_8   0.604         0.403
## item_9          0.634  0.309
## item_10                0.777
## item_11         0.754       
## item_12  0.694        -0.138
## item_13  0.785              
## item_14         0.390  0.543
## item_15  0.672  0.107       
## 
##                  TC1   TC2   TC3
## SS loadings    3.513 2.428 2.239
## Proportion Var 0.234 0.162 0.149
## Cumulative Var 0.234 0.396 0.545

Wir erhalten also die Strukturmatrix von oben, aber schon mit einigen Änderungen. Hier wurden bereits kleine Faktorladungen entfernt. Dieses Verhalten können wir weiter beeinflussen. Üblicherweise werden Faktorladungen bis (je nach Autor) 0.30, bzw. 0.40 nicht beachtet. Außerdem können wir uns die Ausgabe auch sortieren lassen, damit passende Items untereinanderstehen.

print.psych(party_efa, cut = 0.40, sort = TRUE)
## Principal Components Analysis
## Call: principal(r = party_recoded, nfactors = 3, rotate = "oblimin")
## Standardized loadings (pattern matrix) based upon correlation matrix
##         item   TC1   TC2   TC3   h2   u2 com
## item_1     1  0.79             0.63 0.37 1.0
## item_13   13  0.79             0.60 0.40 1.0
## item_12   12  0.69             0.49 0.51 1.1
## item_7     7  0.69             0.45 0.55 1.1
## item_4     4  0.69             0.53 0.47 1.1
## item_15   15  0.67             0.50 0.50 1.1
## item_8     8  0.60        0.40 0.65 0.35 1.8
## item_3     3        0.79       0.66 0.34 1.0
## item_5     5        0.79       0.58 0.42 1.0
## item_11   11        0.75       0.60 0.40 1.0
## item_9     9        0.63       0.62 0.38 1.5
## item_10   10              0.78 0.60 0.40 1.0
## item_6     6              0.75 0.54 0.46 1.0
## item_2     2              0.70 0.53 0.47 1.0
## item_14   14              0.54 0.51 0.49 1.8
## 
##                        TC1  TC2  TC3
## SS loadings           3.62 2.53 2.33
## Proportion Var        0.24 0.17 0.16
## Cumulative Var        0.24 0.41 0.57
## Proportion Explained  0.43 0.30 0.27
## Cumulative Proportion 0.43 0.73 1.00
## 
##  With component correlations of 
##      TC1  TC2  TC3
## TC1 1.00 0.33 0.30
## TC2 0.33 1.00 0.22
## TC3 0.30 0.22 1.00
## 
## Mean item complexity =  1.2
## Test of the hypothesis that 3 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.06 
##  with the empirical chi square  269.11  with prob <  2.7e-27 
## 
## Fit based upon off diagonal values = 0.96

Ein Bild sagt mehr als tausen Worte, deshalb kann man diese Strukturmatrix auch zeichnen.

Die Items, die grün dargestellt sind, sind jene mit standardisierten Faktorladungen über .40. Wir haben nun also pro Komponente (oder Faktor) jene Items isoliert, die auf diesem Faktor am meisten laden. Nun müssen wir uns die Beschreibung der Items von oben holen und diese den Faktoren zuordnen.

Item Text
Faktor 1
1 Wenn ich an das Wochenende denke, werde ich aufgeregt.
4 Eine spontane Feier wäre jetzt was.
7 Ich freue mich auf meinen Geburtstag.
12 Ich organisiere gerne Feiern.
13 Ich freue mich darüber, Einladungen zu Feiern zu erhalten.
15 Es geht mir gut, wenn ich weiß, dass keine Feier ansteht.
Faktor 2
3 Mich findet man ab 20:00 Uhr auf der Tanzfläche.
5 Ich könnte die ganze Nacht durchtanzen.
9 Ich tanze gerne mit anderen Menschen zusammen.
11 Two-Step, Air-Punches und Wave sind meine Sprache.
Faktor 3
2 Ich mag es, mich mit anderen Menschen zu unterhalten.
6 Andere Menschen sind mir zuwider.
8 Ich freue mich auf die Geburtstage meiner Freunde.
10 Ich lerne auf Feiern gerne andere Menschen kennen.
14 Ich feiere gerne mit anderen Menschen.

Nun müssen wir selbst tätig werden, indem wir versuchen zu interpretieren, was die Items pro Faktor “gemeinsam” haben. Für den Faktor 1 könnte man sich etwas denken wie “Vorfreude auf eine Feier”. Faktor 2 wäre vielleicht etwas wie “Tanzen” und Faktor 3 z.B. “Geselligkeit”.

Interne Konsistenz

Um nun zu überprüfen, ob die gefundenen “Skalen” intern konsistenz sind, können wir Cronbachs \(\alpha\) berechnen, das uns angibt, ob alle Items eines Faktors untereinander etwas ähnliches messen.

Dafür erstellen wir uns für jeden Faktor einen Datensatz, der nur die dazugehörigen Variablen enthält.

anticipation <- party_recoded %>% 
  select(item_1, item_4, item_7, item_12, item_13, item_15)

dancing <- party_recoded %>% 
  select(item_3, item_5, item_9, item_11)

social <- party_recoded %>% 
  select(item_2, item_6, item_8, item_10, item_14)

Für diese einzelnen Datensätze können wir nun Cronbachs \(\alpha\) mit der passenden Funktion alpha() berechnen. Praktischerweise werden auch direkt Konfidenzintervalle für \(\alpha\) angegeben.

alpha(anticipation)
## 
## Reliability analysis   
## Call: alpha(x = anticipation)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
##       0.82      0.82     0.8      0.44 4.6 0.015  4.9 1.2     0.43
## 
##  lower alpha upper     95% confidence boundaries
## 0.79 0.82 0.85 
## 
##  Reliability if an item is dropped:
##         raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
## item_1       0.78      0.78    0.74      0.41 3.5    0.020 0.0010  0.41
## item_4       0.80      0.80    0.76      0.44 3.9    0.018 0.0030  0.43
## item_7       0.81      0.81    0.77      0.46 4.2    0.017 0.0028  0.45
## item_12      0.80      0.80    0.77      0.45 4.0    0.017 0.0033  0.43
## item_13      0.79      0.79    0.75      0.43 3.7    0.019 0.0023  0.42
## item_15      0.80      0.80    0.76      0.44 4.0    0.017 0.0043  0.45
## 
##  Item statistics 
##           n raw.r std.r r.cor r.drop mean  sd
## item_1  320  0.80  0.79  0.74   0.67  4.9 1.8
## item_4  320  0.73  0.73  0.65   0.59  4.9 1.6
## item_7  320  0.67  0.68  0.58   0.53  4.9 1.5
## item_12 320  0.71  0.71  0.61   0.56  4.8 1.7
## item_13 320  0.76  0.75  0.69   0.63  4.9 1.6
## item_15 320  0.70  0.71  0.63   0.57  4.9 1.5
alpha(dancing)
## 
## Reliability analysis   
## Call: alpha(x = dancing)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N  ase mean  sd median_r
##       0.78      0.78    0.73      0.46 3.5 0.02    5 1.3     0.46
## 
##  lower alpha upper     95% confidence boundaries
## 0.74 0.78 0.82 
## 
##  Reliability if an item is dropped:
##         raw_alpha std.alpha G6(smc) average_r S/N alpha se   var.r med.r
## item_3       0.69      0.69    0.60      0.43 2.2    0.030 0.00048  0.42
## item_5       0.74      0.74    0.65      0.48 2.8    0.026 0.00330  0.50
## item_9       0.73      0.73    0.64      0.47 2.7    0.026 0.00045  0.48
## item_11      0.73      0.73    0.65      0.47 2.7    0.026 0.00343  0.48
## 
##  Item statistics 
##           n raw.r std.r r.cor r.drop mean  sd
## item_3  320  0.81  0.81  0.72   0.64  5.0 1.8
## item_5  320  0.74  0.76  0.63   0.55  4.9 1.6
## item_9  320  0.77  0.76  0.64   0.56  5.0 1.8
## item_11 320  0.77  0.76  0.64   0.56  4.9 1.7
alpha(social)
## 
## Reliability analysis   
## Call: alpha(x = social)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N   ase mean  sd median_r
##       0.74      0.74     0.7      0.37 2.9 0.023    5 1.1     0.36
## 
##  lower alpha upper     95% confidence boundaries
## 0.69 0.74 0.78 
## 
##  Reliability if an item is dropped:
##         raw_alpha std.alpha G6(smc) average_r S/N alpha se   var.r med.r
## item_2       0.69      0.70    0.64      0.37 2.3    0.028 0.00176  0.36
## item_6       0.69      0.70    0.63      0.36 2.3    0.028 0.00110  0.36
## item_8       0.70      0.70    0.64      0.37 2.4    0.027 0.00201  0.35
## item_10      0.68      0.68    0.62      0.35 2.1    0.029 0.00051  0.34
## item_14      0.71      0.72    0.66      0.39 2.5    0.026 0.00112  0.38
## 
##  Item statistics 
##           n raw.r std.r r.cor r.drop mean  sd
## item_2  320  0.70  0.71  0.59   0.51  5.1 1.6
## item_6  320  0.68  0.71  0.60   0.52  5.0 1.4
## item_8  320  0.72  0.70  0.58   0.50  4.9 1.8
## item_10 320  0.73  0.73  0.64   0.55  5.0 1.6
## item_14 320  0.68  0.67  0.53   0.46  5.0 1.7

Aus der Praxis

Nichols & Nicki (2004) wollten einen Fragebogen zur Internet-Sucht entwickeln. Die Daten ihrer Arbeit sind auf der begleitenden Website von Field (2018) verfügbar und befinden sich als nichols_nicki_2004.sav im Daten-Ordner des Git-Repositories.

In ihrer Analyse der Daten entfernten sie die Items 13, 22, 23, 32 und 34, deswegen werden wir sie hier ebenfalls nicht betrachten. Außerdem sollen die Faktoren nicht korreliert sein, weshalb wir die Varimax-Rotation verwenden.

EDA

nichols_nicki <- read_spss("data/nichols_nicki_2004.sav") %>% 
  janitor::clean_names() %>% 
  mutate(gender = as_factor(gender))

nichols_nicki_raw <- nichols_nicki %>% 
  select(num_range("ias", 1:36), -ias13, -ias22, -ias23, -ias32, -ias34)

nichols_nicki_raw %>% 
  get_summary_stats()
## # A tibble: 31 x 13
##    variable     n   min   max median    q1    q3   iqr   mad  mean    sd    se
##    <chr>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 ias1       207     1     5      1     1     2     1  0     1.49 0.824 0.057
##  2 ias10      207     1     4      1     1     2     1  0     1.36 0.695 0.048
##  3 ias11      207     1     4      1     1     2     1  0     1.48 0.756 0.053
##  4 ias12      207     1     5      1     1     2     1  0     1.71 0.861 0.06 
##  5 ias14      207     1     4      1     1     1     0  0     1.33 0.645 0.045
##  6 ias15      207     1     3      1     1     1     0  0     1.23 0.516 0.036
##  7 ias16      207     1     5      1     1     1     0  0     1.3  0.695 0.048
##  8 ias17      207     1     5      1     1     1     0  0     1.31 0.678 0.047
##  9 ias18      207     1     5      1     1     1     0  0     1.33 0.683 0.047
## 10 ias19      207     1     4      2     1     3     2  1.48  2.03 0.947 0.066
## # ... with 21 more rows, and 1 more variable: ci <dbl>

Bartlett-Test

Der Bartlett-Test ist signifikant, weshalb alles super ist, \(\chi^2(465) = 4239.0, p < .001\).

psych::cortest.bartlett(nichols_nicki_raw)
## $chisq
## [1] 4238.976
## 
## $p.value
## [1] 0
## 
## $df
## [1] 465

KMO

Der KMO = .94 ist auch wunderbar.

KMO(nichols_nicki_raw)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = nichols_nicki_raw)
## Overall MSA =  0.94
## MSA for each item = 
##  ias1  ias2  ias3  ias4  ias5  ias6  ias7  ias8  ias9 ias10 ias11 ias12 ias14 
##  0.95  0.90  0.94  0.92  0.95  0.92  0.92  0.95  0.96  0.94  0.95  0.96  0.94 
## ias15 ias16 ias17 ias18 ias19 ias20 ias21 ias24 ias25 ias26 ias27 ias28 ias29 
##  0.92  0.94  0.96  0.96  0.97  0.96  0.96  0.95  0.95  0.94  0.93  0.92  0.94 
## ias30 ias31 ias33 ias35 ias36 
##  0.95  0.89  0.93  0.92  0.95

Anzahl der zu extrahierenden Faktoren

Scree-Test

scree(nichols_nicki_raw, factors = FALSE)

Gingen wir nach dem Scree-Plot könnte man entweder an einen oder an drei Faktoren denken.

Parallelanalyse

fa.parallel(nichols_nicki_raw, fa = "pc")

Die Parallelanalyse legt uns einen Faktor nahe.

Durchführung

nichols_efa <- principal(nichols_nicki_raw, nfactors = 1, rotate = "varimax")

print.psych(nichols_efa, cut = .3, sort = TRUE)
## Principal Components Analysis
## Call: principal(r = nichols_nicki_raw, nfactors = 1, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
##        V  PC1   h2   u2 com
## ias36 31 0.80 0.64 0.36   1
## ias20 19 0.79 0.62 0.38   1
## ias26 23 0.77 0.60 0.40   1
## ias29 26 0.76 0.57 0.43   1
## ias19 18 0.75 0.56 0.44   1
## ias21 20 0.74 0.55 0.45   1
## ias8   8 0.74 0.55 0.45   1
## ias28 25 0.74 0.54 0.46   1
## ias10 10 0.73 0.53 0.47   1
## ias9   9 0.72 0.52 0.48   1
## ias24 21 0.72 0.52 0.48   1
## ias12 12 0.72 0.52 0.48   1
## ias18 17 0.71 0.51 0.49   1
## ias33 29 0.71 0.51 0.49   1
## ias1   1 0.70 0.49 0.51   1
## ias7   7 0.70 0.49 0.51   1
## ias5   5 0.69 0.48 0.52   1
## ias15 14 0.68 0.47 0.53   1
## ias3   3 0.68 0.46 0.54   1
## ias6   6 0.67 0.45 0.55   1
## ias11 11 0.67 0.45 0.55   1
## ias14 13 0.67 0.44 0.56   1
## ias25 22 0.66 0.44 0.56   1
## ias17 16 0.65 0.43 0.57   1
## ias30 27 0.64 0.41 0.59   1
## ias35 30 0.56 0.31 0.69   1
## ias4   4 0.56 0.31 0.69   1
## ias16 15 0.55 0.30 0.70   1
## ias27 24 0.53 0.28 0.72   1
## ias31 28 0.50 0.25 0.75   1
## ias2   2 0.48 0.23 0.77   1
## 
##                  PC1
## SS loadings    14.43
## Proportion Var  0.47
## 
## Mean item complexity =  1
## Test of the hypothesis that 1 component is sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.07 
##  with the empirical chi square  912.89  with prob <  3e-36 
## 
## Fit based upon off diagonal values = 0.98

In diesem Beispiel sind also alle Items für den Faktor relevant. Nichols & Nicki (2004) schlossen daraus, dass alle Items einen generellen Faktor in Bezug auf die Internet-Sucht abbilden.

Interne Konsistenz

Auch Cronbachs \(\alpha\) sieht sehr gut aus.

alpha(nichols_nicki_raw)
## 
## Reliability analysis   
## Call: alpha(x = nichols_nicki_raw)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd median_r
##       0.96      0.96    0.97      0.44  24 0.0042  1.6 0.53     0.44
## 
##  lower alpha upper     95% confidence boundaries
## 0.95 0.96 0.96 
## 
##  Reliability if an item is dropped:
##       raw_alpha std.alpha G6(smc) average_r S/N alpha se  var.r med.r
## ias1       0.95      0.96    0.97      0.44  24   0.0044 0.0112  0.44
## ias2       0.96      0.96    0.97      0.45  25   0.0042 0.0099  0.45
## ias3       0.95      0.96    0.97      0.44  24   0.0044 0.0110  0.45
## ias4       0.96      0.96    0.97      0.45  24   0.0043 0.0105  0.45
## ias5       0.95      0.96    0.97      0.44  24   0.0044 0.0111  0.44
## ias6       0.96      0.96    0.97      0.44  24   0.0044 0.0108  0.45
## ias7       0.95      0.96    0.97      0.44  24   0.0044 0.0108  0.44
## ias8       0.95      0.96    0.97      0.44  23   0.0045 0.0109  0.44
## ias9       0.95      0.96    0.97      0.44  23   0.0044 0.0108  0.44
## ias10      0.95      0.96    0.97      0.44  23   0.0044 0.0105  0.44
## ias11      0.95      0.96    0.97      0.44  24   0.0044 0.0110  0.45
## ias12      0.95      0.96    0.97      0.44  23   0.0044 0.0107  0.44
## ias14      0.95      0.96    0.97      0.44  24   0.0044 0.0112  0.45
## ias15      0.96      0.96    0.97      0.44  24   0.0044 0.0108  0.45
## ias16      0.96      0.96    0.97      0.45  24   0.0043 0.0106  0.45
## ias17      0.96      0.96    0.97      0.44  24   0.0044 0.0106  0.45
## ias18      0.95      0.96    0.97      0.44  24   0.0044 0.0106  0.44
## ias19      0.95      0.96    0.97      0.44  23   0.0045 0.0109  0.44
## ias20      0.95      0.96    0.97      0.44  23   0.0044 0.0104  0.44
## ias21      0.95      0.96    0.97      0.44  23   0.0044 0.0105  0.44
## ias24      0.95      0.96    0.97      0.44  23   0.0045 0.0110  0.44
## ias25      0.95      0.96    0.97      0.44  24   0.0044 0.0110  0.45
## ias26      0.95      0.96    0.97      0.44  23   0.0044 0.0103  0.44
## ias27      0.96      0.96    0.97      0.45  24   0.0042 0.0105  0.45
## ias28      0.95      0.96    0.97      0.44  23   0.0044 0.0103  0.44
## ias29      0.95      0.96    0.97      0.44  23   0.0044 0.0106  0.44
## ias30      0.95      0.96    0.97      0.44  24   0.0044 0.0111  0.45
## ias31      0.96      0.96    0.97      0.45  24   0.0042 0.0100  0.45
## ias33      0.95      0.96    0.97      0.44  24   0.0044 0.0109  0.44
## ias35      0.96      0.96    0.97      0.45  24   0.0043 0.0105  0.45
## ias36      0.95      0.96    0.97      0.44  23   0.0044 0.0102  0.44
## 
##  Item statistics 
##         n raw.r std.r r.cor r.drop mean   sd
## ias1  207  0.70  0.70  0.70   0.67  1.5 0.82
## ias2  207  0.51  0.49  0.47   0.46  1.6 0.93
## ias3  207  0.71  0.69  0.68   0.68  2.7 1.07
## ias4  207  0.59  0.57  0.55   0.55  2.0 1.07
## ias5  207  0.70  0.70  0.69   0.68  1.5 0.85
## ias6  207  0.65  0.67  0.66   0.63  1.2 0.57
## ias7  207  0.70  0.70  0.69   0.67  1.4 0.80
## ias8  207  0.76  0.74  0.73   0.73  2.1 1.13
## ias9  207  0.72  0.72  0.71   0.69  1.7 0.96
## ias10 207  0.71  0.72  0.71   0.69  1.4 0.70
## ias11 207  0.66  0.67  0.66   0.63  1.5 0.76
## ias12 207  0.72  0.71  0.71   0.69  1.7 0.86
## ias14 207  0.66  0.67  0.66   0.64  1.3 0.64
## ias15 207  0.66  0.68  0.68   0.64  1.2 0.52
## ias16 207  0.55  0.56  0.54   0.52  1.3 0.69
## ias17 207  0.63  0.65  0.64   0.61  1.3 0.68
## ias18 207  0.69  0.71  0.70   0.67  1.3 0.68
## ias19 207  0.76  0.75  0.74   0.73  2.0 0.95
## ias20 207  0.76  0.78  0.78   0.75  1.3 0.64
## ias21 207  0.74  0.73  0.73   0.71  1.6 0.96
## ias24 207  0.74  0.72  0.72   0.71  1.9 0.96
## ias25 207  0.66  0.66  0.65   0.63  1.4 0.69
## ias26 207  0.74  0.77  0.77   0.73  1.2 0.57
## ias27 207  0.55  0.54  0.52   0.51  1.9 0.98
## ias28 207  0.70  0.73  0.73   0.68  1.2 0.56
## ias29 207  0.73  0.75  0.75   0.72  1.2 0.57
## ias30 207  0.65  0.65  0.63   0.62  1.5 0.80
## ias31 207  0.54  0.51  0.49   0.49  2.3 1.03
## ias33 207  0.71  0.71  0.71   0.69  1.4 0.75
## ias35 207  0.57  0.57  0.55   0.53  1.5 0.84
## ias36 207  0.78  0.79  0.79   0.76  1.3 0.58
## 
## Non missing response frequency for each item
##          1    2    3    4    5 miss
## ias1  0.68 0.20 0.08 0.03 0.00    0
## ias2  0.64 0.19 0.12 0.03 0.01    0
## ias3  0.16 0.26 0.33 0.21 0.03    0
## ias4  0.42 0.28 0.22 0.06 0.03    0
## ias5  0.68 0.16 0.12 0.04 0.00    0
## ias6  0.85 0.09 0.06 0.00 0.00    0
## ias7  0.73 0.17 0.05 0.03 0.01    0
## ias8  0.42 0.25 0.17 0.15 0.01    0
## ias9  0.62 0.16 0.17 0.05 0.00    0
## ias10 0.74 0.18 0.05 0.02 0.00    0
## ias11 0.66 0.22 0.10 0.02 0.00    0
## ias12 0.50 0.33 0.12 0.04 0.00    0
## ias14 0.76 0.16 0.07 0.01 0.00    0
## ias15 0.81 0.14 0.04 0.00 0.00    0
## ias16 0.81 0.11 0.08 0.00 0.01    0
## ias17 0.78 0.14 0.06 0.01 0.00    0
## ias18 0.76 0.17 0.05 0.01 0.00    0
## ias19 0.36 0.32 0.25 0.07 0.00    0
## ias20 0.76 0.18 0.05 0.00 0.00    0
## ias21 0.67 0.15 0.12 0.04 0.01    0
## ias24 0.44 0.29 0.21 0.06 0.00    0
## ias25 0.71 0.19 0.08 0.01 0.00    0
## ias26 0.81 0.14 0.04 0.01 0.00    0
## ias27 0.43 0.30 0.19 0.05 0.01    0
## ias28 0.83 0.12 0.05 0.00 0.00    0
## ias29 0.83 0.12 0.04 0.00 0.00    0
## ias30 0.65 0.21 0.11 0.03 0.00    0
## ias31 0.28 0.31 0.28 0.11 0.01    0
## ias33 0.77 0.14 0.06 0.01 0.01    0
## ias35 0.70 0.14 0.14 0.03 0.00    0
## ias36 0.80 0.14 0.06 0.00 0.00    0

Literatur

Field, A. P. (2018). Discovering Statistics using IBM SPSS Statistics (5th ed.). SAGE.

Horn, J. L. (1965). A Rationale and Test for the Number of Factors in Factor Analysis. Psychometrika, 30, 179–185. https://doi.org/10.1007/BF02289447

Hutcheson, G., & Sofroniou, N. (1999). The multivariate social scientist: Introductory statistics using generalized linear models. Sage Publications. https://doi.org/10.4135/9780857028075

Nichols, L. A., & Nicki, R. (2004). Development of a psychometrically sound internet addiction scale: a preliminary step. Psychology of Addictive Behaviors, 18(4), 381–384. https://doi.org/10.1037/0893-164X.18.4.381