Datei > Neue Datei > R Markdown...
eine neue R Markdown Datei erstellen. Den Text unter dem Setup Chunk (ab Zeile 11) können Sie löschen. Unter diesem Link können Sie auch unsere Vorlage-Datei herunterladen (Rechtsklick > Speichern unter…).Da es sich um eine praktische Übung handelt, können wir Ihnen nicht alle neuen Befehle einzeln vorstellen. Stattdessen finden Sie hier Verweise auf sinnvolle Ressourcen, in denen Sie für die Bearbeitung unserer Aufgaben nachschlagen können.
Ressource | Beschreibung |
---|---|
Field, Kapitel 17 | Buchkapitel, das Schritt für Schritt erklärt, worum es geht, und wie man Principal Components Analysen in R durchführt. Große Empfehlung! |
Es gibt ein neues Paket namens conflicted
, das Ihnen automatisch eine Fehlermeldung anzeigt, wenn Sie eine Funktion benutzen, die von zwei oder mehr Paketen verwendet wird. So werden Sie schnell auf potentiell nervtötende Flüchtigkeitsfehler aufmerksam gemacht. Alles, was Sie dafür tun müssen, ist das Paket zu installieren (install.packages("conflicted")
) und zu Beginn Ihrer R-Skripte zu laden (library(conflicted)
).
Achtung Wir haben Indizien dafür, dass ein laufendes conflicted
die Stabilität von R unter Umständen stören kann. Wenn Sie den Verdacht haben, schalten Sie das Paket bitte vorsichtshalber aus. detach(conflicted, unload=TRUE)
. Es gibt Alternativen, z. B. conflicts(detail=TRUE)
, vgl. https://md.psych.bio.uni-goettingen.de/mv/unit/block_intro/block_intro_virt.html#command_masking
Beispiel
library(conflicted)
library(dplyr)
filter(mtcars, am & cyl == 8)
psych
) und setzen Sie ein sinnvolles Arbeitsverzeichnis.raq.dat
über den Link https://pzezula.pages.gwdg.de/data/raq.dat herunter.raq_data
in R ein. Jede Zeile enthält die Antworten einer Versuchsperson.Der Datesatz enthält die Ergebnisse eines fiktiven Fragebogens (R Anxiety Questionnaire, RAQ) zur Angst vor Statistik (Field, S. 873). Hier sehen Sie die einzelnen Fragen.
Dieser Übungszettel behandelt die explorative Faktorenanalyse (EFA) und die Hauptkomponentenanalyse (Principal Components Analysis, PCA).
Beide Verfahren dienen grob gesagt dazu, Variablen zu Gruppen zusammenzufassen. Dadurch kann man z.B. mit Multikollinearität (ein Problem von Regressionen, wenn mehrere Prädiktoren sehr hoch miteinander korrelieren) umgehen (PCA), oder nicht direkt beobachtbare (latente) Konstrukte erschließen (EFA). Mit der konfirmatorischen Faktoranalyse (Confirmatory Factor Analysis, CFA) können zusätzlich Theorien, die z.B. auf Grundlage von EFA aufgestellt wurden, überprüft werden.
Wir behandeln hier nur die ersten beiden Verfahren, also Principal Components Analysis (PCA) und Exploratory Factor Analysis (EFA). Beide sind sich sehr ähnlich, tatsächlich kann die PCA als Sonderfall der EFA aufgefasst werden.
Tabelle: Übersicht über Faktoranalyse-Verfahren
Verfahren | Bedeutung | Anwendung |
---|---|---|
Principal Components Analysis (PCA) | Variablen, die die gleiche Information beinhalten, werden zusammengefasst. | Bspw. zur Vermeidung von Multikollinearität in Regressionen. |
Explorative Factor Analysis (EFA) | Variablen, die auf das selbe zugrundeliegende Merkmal, z.B. einer Person, zurückzuführen sind, werden zusammengefasst. | Bspw. Konstruktion von Fragebögen. |
Confirmatory Factor Analysis (CFA) | Variablen, die auf das selbe zugrundeliegende Merkmal, z.B. einer Person, zurückzuführen sind, werden zusammengefasst. | Bspw. Test von Theorien über Faktoren |
Wie bei anderen Analysen auch müssen wir zunächst prüfen, ob die Daten überhaupt geeignet dafür sind, eine Faktoranalyse durchzuführen. Das heißt vor allem, dass wir überprüfen, ob es ausreichend Beziehungen zwischen den Daten gibt, die aber auch nicht zu stark sein dürfen. Wenn zwei Variablen praktisch identisch sind (Korrelation .90 oder höher), dann bereitet das der Analyse Probleme.
Wir inspizieren die Daten zunächst per Augemaß, führen dann einen Test durch und schauen uns zwei Indices an, die uns Informationen über die Angemessenheit einer Faktorenanalyse liefern.
Erklärungen dazu (nähere Information finden Sie in Field (2012)):
Kriterium | Bedeutung | Anwendung |
---|---|---|
Korrelationsmatrix | Gibt es augenscheinlich angemessene Zusammenhänge zwischen den betrachteten Variablen? | Hinweise auf Probleme gibt es, wenn 1) Kaum Korrelation von .30 oder größer vorliegen, 2) (Viele) Korrelationen über .90 vorliegen, 3) Einzelne oder mehrere Variablen überhaupt nur sehr geringe Korrelationen mit allen anderen Variablen aufweisen. |
Bartlett’s Test | Handelt es sich bei der Korrelationsmatrix um eine Einheitsmatrix? | Wenn der Test signifikant wird, handelt es sich nicht um eine Einheitsmatrix. Das ist gut für die Faktorenanalyse. Ein nicht-signifikanter Test wäre ein Hinweis auf ein Problem. |
Kaiser-Meyer-Olkin Maß (KMO) | Gibt es Muster in der Korrelationsmatrix, die durch Faktorenanalyse aufgedeckt werden können? | Kann Werte von 0-1 annehmen, je näher an 1, desto besser. Es gibt ein Gesamtmaß und Maße für jede einzelne Variable. Beide sollten betrachtet werden. |
Determinante der Korrelationsmatrix | Sind die Beziehungen der Variablen in der Matrix stark (0) oder schwach (1)? | Die Determinante sollte klein, aber nicht kleiner als 0.00001 sein, damit eine Faktorenanalyse durchgeführt werden kann. |
cor()
, um eine Korrelationsmatrix auf Grundlage des Datensatzen raq_data
zu erstellen. Tipp: Mit der Funktion round()
können Sie die Ergebnisse abrunden, so dass sie leichter lesbar sind.cortest.bartlett()
aus dem Paket psych
auf den Datensatz oder auf die Korrelationsmatrix an (beides liefert identischer Ergebnisse, wenn der Datensatz ausschließlich dieselben Variablen enthält wie die Matrix). Gibt es einen Hinweis auf Probleme für die Faktorenanalyse? Hinweis dazu:
n =
angeben, wie groß die Stichprobe ist.KMO()
aus dem Paket psych
auf den Datensatz oder auf die Korrelationsmatrix an (beides liefert identischer Ergebnisse, wenn der Datensatz ausschließlich dieselben Variablen enthält wie die Matrix). Gibt es einen Hinweis auf Probleme für die Faktorenanalyse?det()
auf die Korrelationsmatrix an. Gibt es einen Hinweis auf Probleme für die Faktorenanalyse?Bei explorativem Vorgehen wissen wir vor der Analyse nicht, wie viele Faktoren vorliegen. Wir nutzen zur Identifikation einen sogenannten Scree-Plot und die Eigenvalues, Werte aus einer ersten Analyse.
Wir arbeiten hier zunächst nur mit der PCA. Das Vorgehen für die EFA ist beinahe identisch. Bei Unterschieden weisen wir darauf hin. In einer späteren Aufgabe thematisieren wir Unterschiede in den Ergebnissen.
Der allgemeine Befehl für eine PCA in R stammt aus dem Paket psych
und lautet: principal(r = , nfactors = , rotate = )
. Dabei steht r
für die Korrelationsmatrix, bzw. die zugrundeliegenden Rohdaten, nfactors
für die Anzahl von Faktoren, die wir identifiezieren möchten, und rotate
für die Art der “Rotation”. Die Rotation wird in einer späteren Aufgabe thematisiert.
Der Befehl für die explorative Faktorenanalyse ist genau gleich aufgebaut und lautet: fa(r = , nfactors = , rotate = )
.
Tabelle 3.1: Wichtige Komponenten des Outputs einer PCA / EFA.
Komponente | Wo im Output? | Bedeutung |
---|---|---|
Faktorladungen (factor loadings) | Große Tabelle, oben im Output | Korrelation der jeweiligen Variable mit dem jeweiligen Faktor. |
h2 | Am rechten Rand der Tabelle mit den Faktorladungen | Communality: Maß für den Anteil der Varianz der jeweiligen Variable, der durch die Faktoren des Modells erklärt werden kann. |
u2 | Neben h2 | Uniqueness: Anteil einzigartiger Varianz der jeweiligen Variable. Berechnung als 1 - h2 |
Eigenvalues (SS loadings) |
Tabelle unter den Faktorladungen, erste Zeile |
Summe der quadrierten Faktorladungen pro Faktor. Werden dargestellt als Anteil erklärter Varianz. Bei 23 Variablen wie in unserem Fall entspricht ein eigenvalue von 7.29 (PC1) der Erklärung von 7.29 / 23 = 0.32, also 32% der Varianz in den Daten. Das ist auch in der zweiten Zeile der Tabelle abzulesen. |
Tabelle 3.2: Kriterien zur Bestimmung der Anzahl sinnvoller Faktoren.
Kriterium | Welche Faktoren erhalten? |
---|---|
Kaiser | Faktoren mit Eigenvalue über 1 Wahrscheinlich ein gutes Kriterium, wenn weniger als 30 Variablen untersucht werden und die communalities nach der Faktor-Extraktion alle über 0.7 liegen. Wenn die Stichprobengröße über 250 liegt, sind auch communalities von 0.6 akzeptabel. Bei größeren Stichproben können wiederum noch kleinere communalities akzeptabel sein. |
Jollife | Faktoren mit Eigenvalue über 0.7 Jollife war der Meinung, dass Kaisers Kriterium zu konservativ sei. |
Scree Plot | Zeigt die Wichtigkeit aller Faktoren der ersten Analyse. Als Cut-Off wird der point of inflexion gewählt: Der Punkt, an dem sich die Steigung der Linie stark verändert, in der Regel von fast vertikal auf fast horizontal. Alle Faktoren links von diesem Punkt werden erhalten, die Faktoren rechts nichts. |
raq_data
durch und speichern Sie diese unter dem Namen pc1
. In der ersten Analyse möchten wir für nfactors
die Gesamtzahl unserer untersuchten Variablen eingeben, in diesem Fall also 23. Für die Rotation wählen Sie zunächst bitte rotate = "none"
.
plot(pc1$values, type = "b")
. Verstehen Sie den Code?nfactors = 4
, da wir vier Faktoren extrahieren möchten. Betrachten Sie die communalities. Ist die Extraktion von vier Faktoren nach Kaisers Kriterium gerechtfertigt?
psych
stellt mit dem Befehl fa.parallel(<data>, fa = <"method">)
eine unkomplizierte Methode zur Durchführung zur Verfügung. Setzen Sie für <data>
den Datensatz ein, und für <"method">
die gewünschte Methode. In der PCA ist das pc
, in den Faktorenanalyse fa
(Sie können auch both
eingeben). Führen Sie eine Parallel-Analyse für den vorliegenden Datensatz durch. Was ist Ihre Schlussfolgerung? (Näheres zur Interpretation finden Sie hier: http://md.psych.bio.uni-goettingen.de/mv/unit/fa/fa.html#parallelanalyse)Faktorrotation ist ein wichtiger Schritt in der Faktorenanalyse, der es uns erlaubt, Faktoren deutlicher voneinander abzugrenzen. Das funktioniert durch eine Art “Drehung” (siehe Abbildung) des Koordinatensystem der Faktoren. Es gibt zwei Arten von Rotation:
Rotation | Bedeutung |
---|---|
Orthogonal | Faktoren werden rotiert, aber bleiben unabhängig voneinander (Korrelation = 0). |
Oblique | Faktoren werden rotiert und dürfen miteinander korrelieren. |
Genaueres können Sie in Field (2012), Kapitel 17.3.9 finden.
rotate = "varimax"
für die Rotation ein. Dadurch wird eine orthogonale Rotation durchgeführt. Speichern Sie die Analyse unter dem Namen pc3
print.psych()
anzeigen. Wenn Sie dabei cut = 0.3
und sort = TRUE
als Argumente angeben, werden nur Faktorladungen ab 0.3 angezeigt, und die Variablen werden nach der Höhe ihrer Faktorladungen sortiert.rotate = "oblimin"
an und speichern Sie die Analyse unter dem Namen pc4
.
print.psych()
anzeigen.pc3
pc4
zu Faktoren zusammengefasst wurden.
$scores
) und hängen Sie sie mit sinnvollen Variablennamen an den Rohdatensatz an. Geben Sie dem Objekt einen neuen Namen! Achtung: Die Scores sind nur dann im Output-Objekt enthalten, wenn Sie den Rohdatensatz für die Analyse verwendet haben, nicht wenn Sie die Korrelationsmatrix verwendet haben.
Der wichtigste theoretische Unterschied wurde oben bereits kurz erwähnt. Wir möchten durch diese Aufgabe nun noch einen praktischen Unterschied in den Fokus stellen.
fa()
aus dem Paket psych()
durch. Verwenden Sie die gleichen Argumente, wie bei pc2
, also ohne Rotation. Die Funktionen sind gleich aufgebaut. Speichern Sie das Ergebnis unter dem Namen fa1
.fa2
.pc5
.head()
, um sich die Faktor Scores für die ersten sechs VP anzeigen zu lassen.
fa1
und fa2
pc2
und pc5
Lassen Sie die Datei mit Strg
+ Shift
+ K
(Windows) oder Cmd
+ Shift
+ K
(Mac) rendern. Sie sollten nun im “Viewer” unten rechts eine “schön aufpolierte” Version ihrer Datei sehen. Falls das klappt: Herzlichen Glückwunsch! Ihr Code kann vollständig ohne Fehlermeldung gerendert werden. Falls nicht: Nur mut, das wird schon noch! Gehen Sie auf Fehlersuche! Ansonsten schaffen wir es ja in der Übung vielleicht gemeinsam.
Anmerkung: Diese Übungszettel basieren zum Teil auf Aufgaben aus dem Lehrbuch Dicovering Statistics Using R (Field, Miles & Field, 2012). Sie wurden für den Zweck dieser Übung modifiziert, und der verwendete R-Code wurde aktualisiert.
Field, A., Miles, J., & Field, Z. (2012). Discovering Statistics Using R. London: SAGE Publications Ltd.
Please try to solve this sheet in an .Rmd file. You can create one from scratch using File > New file > R Markdown...
. You can delete the text beneath Setup Chunk (starting from line 11). Alternatively, you can download our template file unter this link (right click > save as…).
You’ll find a lot of the important information on the website of this course
Please don’t hesitate to search the web for help with this sheet. In fact, being able to effectively search the web for problem solutions is a very useful skill, even R pros work this way all the time! The best starting point for this is the R section on the programming site Stackoverflow
On the R Studio website, you’ll find highly helpful cheat sheets for many of R topics. The base R cheat sheet might be a good starting point.
Since this is a hands-on seminar, we won’t be able to present each and every new command to you explicitly. Instead, you’ll find here references to helpful ressources that you can use for completing this sheets.
Ressource | Description |
---|---|
Field, chapter 17 | Book chapter explaining step by step the why and how of principal component analysis in R. |
Highly recommended!
There is a package named conflicted
that automatically shows error messages when you use a function, that exists in two or more packages. So your attention is drawn to errors of that type. The only thing, you have to do, is to install this package (install.packages("conflicted")
) and load it in your script (require(conflicted)
).
Example
library(conflicted)
library(dplyr)
filter(mtcars, am & cyl == 8)
psych
and set an adequate working directory.raq.dat
from the link https://pzezula.pages.gwdg.de/data/raq.dat and call the data object raq_data
.The data show answers to a fictive questionnaire, the "R Anxiety Questionnaire (RAQ) with items for fear of statistics (Field, p. 873). The items are:
This exercise sheet is about explorative factor analysis (EFA) and principal component analysis (PCA).
Generally spoken, both are ways to aggregate variables to groups. This helps us to treat mulicollinearity in multiple regression, when predictors correlate too high. It is also useful to refer to latent constructs (f. e. traits) on base of indicator variables. Moreover, we can use confirmatory factor analyses (CFA) to test theories that were set up on base of f. e. an EFA.
Here we only use the first two types, that is Principal Components Analysis (PCA) and Exploratory Factor Analysis (EFA). Both are quite similar, indeed, we can look at PCA to be a special case of EFA.
Table: Overview on Types of Factor Analysis
Analysis | Meaning | Application |
---|---|---|
Principal Components Analysis (PCA) | Variables, that share information, are aggregated | f. e. to deal with multicollinearity in regression analysis |
Explorative Factor Analysis (EFA) | Variables, that base on the same hidden characteristic, are aggregated | f. e. construction of questionnaires |
Confirmatory Factor Analysis (CFA) | Variables, that base on the same characteristic of f. e. a person, are aggregated. | f. e. tests of theories of factor structures. |
As with other analyses we have to check first, whether our data are suitable for factor analysis. This means, whether we have sufficient but not too strong relations between the variables. The analysis won’t work, if two variables are practically identical (cor > .90).
Primarily we inspect the data manually, then we make a test and look at two indices, that give us informations whether the data are suitable for factor analysis.
Some explanations (see Field (2012) for more information):
Criterium | Meaning | Application |
---|---|---|
correlation matrix | Are there suitable correlations between our variables? | We have problems, if 1) we almost don’t have correlations above 0.30. 2) We have (a lot of) correlations above .90. 3) Some of our variables have only very low correlations with all the others. |
Bartlett’s Test | Is our correlation matrix a singular matrix? | If the test is significant, we don’t have singularity. This is, what factor analyses need. A non significant test would indicate problems. |
Kaiser-Meyer Olkin measure (KMO) | Is there something systematic, that can be detected by applying a factor analysis. There is an overall index and an index for every variable. We should look at both. | |
Determinant of the correlation matrix | Are the relations in our correlation matrix strong (0) or weak (1)? | The determinant should be small, but not smaller than 0.00001, then a factor analysis is possible. |
cor()
to get a correlation matrix of raq_data
. Tip: You can use round()
to round numbers and make it more readable.cortest.bartlett()
of package psych
on our data. Run it on base of the data matrix or based on a correlation matrix. Both ways should result in the same, if the variables contained are the same. Do you see any problem applying factor analysis? a hint: If your base is a correlation matrix, you have to specify argument n =
because your sample size is needed.KMO()
of package psych
to the data or to the correlation matrix. Both ways should result in the same, if the variables contained are the same. Do you see any problem applying factor analysis?det()
to the correlation matrix. Do you see any problem applying factor analysis?When doing explorative analyses we don’t know anything about the number of factors in our data. We can use scree plots and eigenvalues of a first analysis to decide about that.
** We work here with PCA. With EFA the procedure is almost identical. We will anounce differences. An exercise below is dedicated to the differences in results.**
The general command for running a PCA in R is supplied by package psych
: principal(r = , nfactors = , rotate = )
. r
refers to the correlation matrix or to the raw data matrix, nfactors
is the number of factors, that we want to extract. rotate
defines the type of rotation. We talk about rotation later.
The structure of the command for running an EFA is the same: fa(r = , nfactors = , rotate = )
.
Table 3.1: Important components in the output of PCA/EFA.
Component | Where in the output? | Meaning |
---|---|---|
factor loadings | Big table up in the output | Correlations of the variables and the factors. |
h2 | At the right of the table with factor loadings | Cummunality: Measure for the percentage of variance, that can be explained by the factors of the model. |
u2 | right next to h2 | Uniqueness: Unique part of the variance of the variable in question. It’s 1 - h2 |
Eigenvalues (SS loadings) |
table below the factor loadings, first line |
sum of the squared factor loadings per factor. It is shown as percentage of explained variance. In our case with 23 variables an eigenvalue of 7.29 (PC1) means 7.29 / 23 = 0.32 or 32% of the variance in the data. We can find that value in the second line of the table. |
Table 3.2: Criteria to define an adequate number of factors to extract.
Criterion | Resulting number of factors to extract |
---|---|
Kaiser | Factors with eigenvalues above 1 presumably a good criterion if less than 30 variables are examined and the communalities after factor extraction are higher than 0.7. With sample sizes above 250 communalities of 0.6 are acceptable. With bigger samples we might accept even smaller communalities. |
Jollife | Factors with eigenvalues above 0.7 in Jollife’s opinion Kaiser’s criterion was too conservative. |
Scree Plot | Shows the importance of all factors of the first analysis. We look for a point of inflexion: A point, where the inclination of the resulting line changes rapidly. We can often detect a point, where the curve enters a sort of horizontal course after having started almost vertical. All Factors left of this point point of inflexion define the number of factors to extract. |
Conduct a PCA on raq_data
and store it under the name of pc1
. We want to have all possible factors included in the first analysis, this means a total of 23. Please do not rotate, set rotate = "none"
.
Look at the scree-plot and at the eigenvalues in the output of PCA. Decide on base of table 3.2 how many factors you want to extract.
Run the PCA again, but this time we want to extract four factors. We set nfactors = 4
to do that. Look at the communalities. Is the extraction of four factors correct if we refer to Kaiser Criterion?
A further and very recommendable method to decide about the number of facors in PCA is the parallel-analysis. Random data are generated repeatedly and compared to the real data. This way the decision is not as subjective as the above mentioned possibilities. Package psych
offers an easy way to run it: fa.parallel(<data>, fa = <"method">)
. Put in our data instead of <data>
and the method you want for <"method">
. For PCA you have to set "pc"
and for FA "fa"
. You may also put "both"
. Conduct a parallel-analysis on our dataset. What is your conclusion? (Find more on that under: http://md.psych.bio.uni-goettingen.de/mv/unit/fa/fa.html#parallelanalyse )
Look at the last line of the output. There you can find a further index for the fit of the model to the data. This index varies between 0 and 1. The closer to 1, the better the fit of model and data. Values above 0.95 are considered to indicate a good fit. Find a more in depth explanation for that in Field (2012, pp 889 - 891).
Factor rotation is an important step in factor analysis, that allows us to separate factors more clearly from each other. This works by a sort of multidimensional rotation of the coordinate system of the factors. There are two types of rotation:
Rotation | Meaning |
---|---|
Orthogonal | Factors are rotated, but stay independent (orthogonal) from each other. Their intercorrelation is 0. |
Oblique | Faktors are rotated and correlations between the rotated factors are allowed. |
Find more about this in Field (2012) chapter 17.3.9
rotate = "varimax"
to get factor rotation. This will make an orthogonal rotation. Store the result and name it pc3
.
print.psych()
. If you add the arguments cut = 0.3
and sort = TRUE
, only factor loadings above 0.3 are shown and the factors are sorted by factor loading.rotate = "oblimin"
this time, store the result and name it pc4
.
print.psych()
.pc3
.pc4
.pc4
into factors.
$scores
) and add them to our data object giving them adequate names. Give a meaningful name to our newly structured data object. **Take care: We can only find our factor scores in our ouput object, when we used raw data to do the factor analysis. If we started using a correlation matrix, they are not computed.
The most significant difference was mentioned above already. Here we want to focus on a more practical aspect.
fa()
of package psych()
. Use the same arguments you had in pc2
, also without rotation. The commands have the same structure. Store the result and name it fa1
.fa2
.pc5
.head()
to inspect the factor scores of the first 6 subjects (observations).
fa1
and fa2
.pc2
and pc5
.Render or knit your Rmd file using the shortcut strg
+ shift
+ k
(Windows) or cmd
+ shift
+ k
. If that works: Well done! If not, look at the error message, in special the lines in the syntax, where the error occured. Correct the error and start over again. We can help you in our exercise hour.
Annotation: This exercise sheet is based in part on the exercises from the textbook Dicovering Statistics Using R (Field, Miles & Field, 2012). We modified it for the purpose of this exercise and actualized the R-Code.
Field, A., Miles, J., & Field, Z. (2012). Discovering Statistics Using R. London: SAGE Publications Ltd.