- •brief contents
- •contents
- •preface
- •acknowledgments
- •about this book
- •What’s new in the second edition
- •Who should read this book
- •Roadmap
- •Advice for data miners
- •Code examples
- •Code conventions
- •Author Online
- •About the author
- •about the cover illustration
- •1 Introduction to R
- •1.2 Obtaining and installing R
- •1.3 Working with R
- •1.3.1 Getting started
- •1.3.2 Getting help
- •1.3.3 The workspace
- •1.3.4 Input and output
- •1.4 Packages
- •1.4.1 What are packages?
- •1.4.2 Installing a package
- •1.4.3 Loading a package
- •1.4.4 Learning about a package
- •1.5 Batch processing
- •1.6 Using output as input: reusing results
- •1.7 Working with large datasets
- •1.8 Working through an example
- •1.9 Summary
- •2 Creating a dataset
- •2.1 Understanding datasets
- •2.2 Data structures
- •2.2.1 Vectors
- •2.2.2 Matrices
- •2.2.3 Arrays
- •2.2.4 Data frames
- •2.2.5 Factors
- •2.2.6 Lists
- •2.3 Data input
- •2.3.1 Entering data from the keyboard
- •2.3.2 Importing data from a delimited text file
- •2.3.3 Importing data from Excel
- •2.3.4 Importing data from XML
- •2.3.5 Importing data from the web
- •2.3.6 Importing data from SPSS
- •2.3.7 Importing data from SAS
- •2.3.8 Importing data from Stata
- •2.3.9 Importing data from NetCDF
- •2.3.10 Importing data from HDF5
- •2.3.11 Accessing database management systems (DBMSs)
- •2.3.12 Importing data via Stat/Transfer
- •2.4 Annotating datasets
- •2.4.1 Variable labels
- •2.4.2 Value labels
- •2.5 Useful functions for working with data objects
- •2.6 Summary
- •3 Getting started with graphs
- •3.1 Working with graphs
- •3.2 A simple example
- •3.3 Graphical parameters
- •3.3.1 Symbols and lines
- •3.3.2 Colors
- •3.3.3 Text characteristics
- •3.3.4 Graph and margin dimensions
- •3.4 Adding text, customized axes, and legends
- •3.4.1 Titles
- •3.4.2 Axes
- •3.4.3 Reference lines
- •3.4.4 Legend
- •3.4.5 Text annotations
- •3.4.6 Math annotations
- •3.5 Combining graphs
- •3.5.1 Creating a figure arrangement with fine control
- •3.6 Summary
- •4 Basic data management
- •4.1 A working example
- •4.2 Creating new variables
- •4.3 Recoding variables
- •4.4 Renaming variables
- •4.5 Missing values
- •4.5.1 Recoding values to missing
- •4.5.2 Excluding missing values from analyses
- •4.6 Date values
- •4.6.1 Converting dates to character variables
- •4.6.2 Going further
- •4.7 Type conversions
- •4.8 Sorting data
- •4.9 Merging datasets
- •4.9.1 Adding columns to a data frame
- •4.9.2 Adding rows to a data frame
- •4.10 Subsetting datasets
- •4.10.1 Selecting (keeping) variables
- •4.10.2 Excluding (dropping) variables
- •4.10.3 Selecting observations
- •4.10.4 The subset() function
- •4.10.5 Random samples
- •4.11 Using SQL statements to manipulate data frames
- •4.12 Summary
- •5 Advanced data management
- •5.2 Numerical and character functions
- •5.2.1 Mathematical functions
- •5.2.2 Statistical functions
- •5.2.3 Probability functions
- •5.2.4 Character functions
- •5.2.5 Other useful functions
- •5.2.6 Applying functions to matrices and data frames
- •5.3 A solution for the data-management challenge
- •5.4 Control flow
- •5.4.1 Repetition and looping
- •5.4.2 Conditional execution
- •5.5 User-written functions
- •5.6 Aggregation and reshaping
- •5.6.1 Transpose
- •5.6.2 Aggregating data
- •5.6.3 The reshape2 package
- •5.7 Summary
- •6 Basic graphs
- •6.1 Bar plots
- •6.1.1 Simple bar plots
- •6.1.2 Stacked and grouped bar plots
- •6.1.3 Mean bar plots
- •6.1.4 Tweaking bar plots
- •6.1.5 Spinograms
- •6.2 Pie charts
- •6.3 Histograms
- •6.4 Kernel density plots
- •6.5 Box plots
- •6.5.1 Using parallel box plots to compare groups
- •6.5.2 Violin plots
- •6.6 Dot plots
- •6.7 Summary
- •7 Basic statistics
- •7.1 Descriptive statistics
- •7.1.1 A menagerie of methods
- •7.1.2 Even more methods
- •7.1.3 Descriptive statistics by group
- •7.1.4 Additional methods by group
- •7.1.5 Visualizing results
- •7.2 Frequency and contingency tables
- •7.2.1 Generating frequency tables
- •7.2.2 Tests of independence
- •7.2.3 Measures of association
- •7.2.4 Visualizing results
- •7.3 Correlations
- •7.3.1 Types of correlations
- •7.3.2 Testing correlations for significance
- •7.3.3 Visualizing correlations
- •7.4 T-tests
- •7.4.3 When there are more than two groups
- •7.5 Nonparametric tests of group differences
- •7.5.1 Comparing two groups
- •7.5.2 Comparing more than two groups
- •7.6 Visualizing group differences
- •7.7 Summary
- •8 Regression
- •8.1 The many faces of regression
- •8.1.1 Scenarios for using OLS regression
- •8.1.2 What you need to know
- •8.2 OLS regression
- •8.2.1 Fitting regression models with lm()
- •8.2.2 Simple linear regression
- •8.2.3 Polynomial regression
- •8.2.4 Multiple linear regression
- •8.2.5 Multiple linear regression with interactions
- •8.3 Regression diagnostics
- •8.3.1 A typical approach
- •8.3.2 An enhanced approach
- •8.3.3 Global validation of linear model assumption
- •8.3.4 Multicollinearity
- •8.4 Unusual observations
- •8.4.1 Outliers
- •8.4.3 Influential observations
- •8.5 Corrective measures
- •8.5.1 Deleting observations
- •8.5.2 Transforming variables
- •8.5.3 Adding or deleting variables
- •8.5.4 Trying a different approach
- •8.6 Selecting the “best” regression model
- •8.6.1 Comparing models
- •8.6.2 Variable selection
- •8.7 Taking the analysis further
- •8.7.1 Cross-validation
- •8.7.2 Relative importance
- •8.8 Summary
- •9 Analysis of variance
- •9.1 A crash course on terminology
- •9.2 Fitting ANOVA models
- •9.2.1 The aov() function
- •9.2.2 The order of formula terms
- •9.3.1 Multiple comparisons
- •9.3.2 Assessing test assumptions
- •9.4 One-way ANCOVA
- •9.4.1 Assessing test assumptions
- •9.4.2 Visualizing the results
- •9.6 Repeated measures ANOVA
- •9.7 Multivariate analysis of variance (MANOVA)
- •9.7.1 Assessing test assumptions
- •9.7.2 Robust MANOVA
- •9.8 ANOVA as regression
- •9.9 Summary
- •10 Power analysis
- •10.1 A quick review of hypothesis testing
- •10.2 Implementing power analysis with the pwr package
- •10.2.1 t-tests
- •10.2.2 ANOVA
- •10.2.3 Correlations
- •10.2.4 Linear models
- •10.2.5 Tests of proportions
- •10.2.7 Choosing an appropriate effect size in novel situations
- •10.3 Creating power analysis plots
- •10.4 Other packages
- •10.5 Summary
- •11 Intermediate graphs
- •11.1 Scatter plots
- •11.1.3 3D scatter plots
- •11.1.4 Spinning 3D scatter plots
- •11.1.5 Bubble plots
- •11.2 Line charts
- •11.3 Corrgrams
- •11.4 Mosaic plots
- •11.5 Summary
- •12 Resampling statistics and bootstrapping
- •12.1 Permutation tests
- •12.2 Permutation tests with the coin package
- •12.2.2 Independence in contingency tables
- •12.2.3 Independence between numeric variables
- •12.2.5 Going further
- •12.3 Permutation tests with the lmPerm package
- •12.3.1 Simple and polynomial regression
- •12.3.2 Multiple regression
- •12.4 Additional comments on permutation tests
- •12.5 Bootstrapping
- •12.6 Bootstrapping with the boot package
- •12.6.1 Bootstrapping a single statistic
- •12.6.2 Bootstrapping several statistics
- •12.7 Summary
- •13 Generalized linear models
- •13.1 Generalized linear models and the glm() function
- •13.1.1 The glm() function
- •13.1.2 Supporting functions
- •13.1.3 Model fit and regression diagnostics
- •13.2 Logistic regression
- •13.2.1 Interpreting the model parameters
- •13.2.2 Assessing the impact of predictors on the probability of an outcome
- •13.2.3 Overdispersion
- •13.2.4 Extensions
- •13.3 Poisson regression
- •13.3.1 Interpreting the model parameters
- •13.3.2 Overdispersion
- •13.3.3 Extensions
- •13.4 Summary
- •14 Principal components and factor analysis
- •14.1 Principal components and factor analysis in R
- •14.2 Principal components
- •14.2.1 Selecting the number of components to extract
- •14.2.2 Extracting principal components
- •14.2.3 Rotating principal components
- •14.2.4 Obtaining principal components scores
- •14.3 Exploratory factor analysis
- •14.3.1 Deciding how many common factors to extract
- •14.3.2 Extracting common factors
- •14.3.3 Rotating factors
- •14.3.4 Factor scores
- •14.4 Other latent variable models
- •14.5 Summary
- •15 Time series
- •15.1 Creating a time-series object in R
- •15.2 Smoothing and seasonal decomposition
- •15.2.1 Smoothing with simple moving averages
- •15.2.2 Seasonal decomposition
- •15.3 Exponential forecasting models
- •15.3.1 Simple exponential smoothing
- •15.3.3 The ets() function and automated forecasting
- •15.4 ARIMA forecasting models
- •15.4.1 Prerequisite concepts
- •15.4.2 ARMA and ARIMA models
- •15.4.3 Automated ARIMA forecasting
- •15.5 Going further
- •15.6 Summary
- •16 Cluster analysis
- •16.1 Common steps in cluster analysis
- •16.2 Calculating distances
- •16.3 Hierarchical cluster analysis
- •16.4 Partitioning cluster analysis
- •16.4.2 Partitioning around medoids
- •16.5 Avoiding nonexistent clusters
- •16.6 Summary
- •17 Classification
- •17.1 Preparing the data
- •17.2 Logistic regression
- •17.3 Decision trees
- •17.3.1 Classical decision trees
- •17.3.2 Conditional inference trees
- •17.4 Random forests
- •17.5 Support vector machines
- •17.5.1 Tuning an SVM
- •17.6 Choosing a best predictive solution
- •17.7 Using the rattle package for data mining
- •17.8 Summary
- •18 Advanced methods for missing data
- •18.1 Steps in dealing with missing data
- •18.2 Identifying missing values
- •18.3 Exploring missing-values patterns
- •18.3.1 Tabulating missing values
- •18.3.2 Exploring missing data visually
- •18.3.3 Using correlations to explore missing values
- •18.4 Understanding the sources and impact of missing data
- •18.5 Rational approaches for dealing with incomplete data
- •18.6 Complete-case analysis (listwise deletion)
- •18.7 Multiple imputation
- •18.8 Other approaches to missing data
- •18.8.1 Pairwise deletion
- •18.8.2 Simple (nonstochastic) imputation
- •18.9 Summary
- •19 Advanced graphics with ggplot2
- •19.1 The four graphics systems in R
- •19.2 An introduction to the ggplot2 package
- •19.3 Specifying the plot type with geoms
- •19.4 Grouping
- •19.5 Faceting
- •19.6 Adding smoothed lines
- •19.7 Modifying the appearance of ggplot2 graphs
- •19.7.1 Axes
- •19.7.2 Legends
- •19.7.3 Scales
- •19.7.4 Themes
- •19.7.5 Multiple graphs per page
- •19.8 Saving graphs
- •19.9 Summary
- •20 Advanced programming
- •20.1 A review of the language
- •20.1.1 Data types
- •20.1.2 Control structures
- •20.1.3 Creating functions
- •20.2 Working with environments
- •20.3 Object-oriented programming
- •20.3.1 Generic functions
- •20.3.2 Limitations of the S3 model
- •20.4 Writing efficient code
- •20.5 Debugging
- •20.5.1 Common sources of errors
- •20.5.2 Debugging tools
- •20.5.3 Session options that support debugging
- •20.6 Going further
- •20.7 Summary
- •21 Creating a package
- •21.1 Nonparametric analysis and the npar package
- •21.1.1 Comparing groups with the npar package
- •21.2 Developing the package
- •21.2.1 Computing the statistics
- •21.2.2 Printing the results
- •21.2.3 Summarizing the results
- •21.2.4 Plotting the results
- •21.2.5 Adding sample data to the package
- •21.3 Creating the package documentation
- •21.4 Building the package
- •21.5 Going further
- •21.6 Summary
- •22 Creating dynamic reports
- •22.1 A template approach to reports
- •22.2 Creating dynamic reports with R and Markdown
- •22.3 Creating dynamic reports with R and LaTeX
- •22.4 Creating dynamic reports with R and Open Document
- •22.5 Creating dynamic reports with R and Microsoft Word
- •22.6 Summary
- •afterword Into the rabbit hole
- •appendix A Graphical user interfaces
- •appendix B Customizing the startup environment
- •appendix C Exporting data from R
- •Delimited text file
- •Excel spreadsheet
- •Statistical applications
- •appendix D Matrix algebra in R
- •appendix E Packages used in this book
- •appendix F Working with large datasets
- •F.1 Efficient programming
- •F.2 Storing data outside of RAM
- •F.3 Analytic packages for out-of-memory data
- •F.4 Comprehensive solutions for working with enormous datasets
- •appendix G Updating an R installation
- •G.1 Automated installation (Windows only)
- •G.2 Manual installation (Windows and Mac OS X)
- •G.3 Updating an R installation (Linux)
- •references
- •index
- •Symbols
- •Numerics
- •23.1 The lattice package
- •23.2 Conditioning variables
- •23.3 Panel functions
- •23.4 Grouping variables
- •23.5 Graphic parameters
- •23.6 Customizing plot strips
- •23.7 Page arrangement
- •23.8 Going further
330 |
CHAPTER 14 Principal components and factor analysis |
Little Jiffy conquers the world
There’s quite a bit of confusion among data analysts regarding PCA and EFA. One reason for this is historical and can be traced back to a program called Little Jiffy (no kidding). Little Jiffy was one of the most popular early programs for factor analysis, and it defaulted to a principal components analysis, extracting components with eigenvalues greater than 1 and rotating them to a varimax solution. The program was so widely used that many social scientists came to think of this default behavior as synonymous with EFA. Many later statistical packages also incorporated these defaults in their EFA programs.
As I hope you’ll see in the next section, there are important and fundamental differences between PCA and EFA. To learn more about the PCA/EFA confusion, see Hayton, Allen, and Scarpello, 2004.
If your goal is to look for latent underlying variables that explain your observed variables, you can turn to factor analysis. This is the topic of the next section.
14.3 Exploratory factor analysis
The goal of EFA is to explain the correlations among a set of observed variables by uncovering a smaller set of more fundamental unobserved variables underlying the data. These hypothetical, unobserved variables are called factors. (Each factor is assumed to explain the variance shared among two or more observed variables, so technically, they’re called common factors.)
The model can be represented as
Xi = a1F1 + a2F2 + ... + ap Fp + Ui
where Xi is the ith observed variable (i = 1…k), Fj are the common factors (j = 1…p), and p < k. Ui is the portion of variable Xi unique to that variable (not explained by the common factors). The ai can be thought of as the degree to which each factor contributes to the composition of an observed variable. If we go back to the Harman74.cor example at the beginning of this chapter, we’d say that an individual’s scores on each of the 24 observed psychological tests is due to a weighted combination of their ability on 4 underlying psychological constructs.
Although the PCA and EFA models differ, many of the steps appear similar. To illustrate the process, you’ll apply EFA to the correlations among six psychological tests. One hundred twelve individuals were given six tests, including a nonverbal measure of general intelligence (general), a picture-completion test (picture), a block design test (blocks), a maze test (maze), a reading comprehension test (reading), and a vocabulary test (vocab). Can you explain the participants’ scores on these tests with a smaller number of underlying or latent psychological constructs?
The covariance matrix among the variables is provided in the dataset ability.cov. You can transform this into a correlation matrix using the cov2cor() function:
Exploratory factor analysis |
331 |
>options(digits=2)
>covariances <- ability.cov$cov
>correlations <- cov2cor(covariances)
>correlations
|
general picture blocks maze reading vocab |
|||||
general |
1.00 |
0.47 |
0.55 |
0.34 |
0.58 |
0.51 |
picture |
0.47 |
1.00 |
0.57 |
0.19 |
0.26 |
0.24 |
blocks |
0.55 |
0.57 |
1.00 |
0.45 |
0.35 |
0.36 |
maze |
0.34 |
0.19 |
0.45 |
1.00 |
0.18 |
0.22 |
reading |
0.58 |
0.26 |
0.35 |
0.18 |
1.00 |
0.79 |
vocab |
0.51 |
0.24 |
0.36 |
0.22 |
0.79 |
1.00 |
Because you’re looking for hypothetical constructs that explain the data, you’ll use an EFA approach. As in PCA, the next task is to decide how many factors to extract.
14.3.1Deciding how many common factors to extract
To decide on the number of factors to extract, turn to the fa.parallel() function:
>library(psych)
>covariances <- ability.cov$cov
>correlations <- cov2cor(covariances)
>fa.parallel(correlations, n.obs=112, fa="both", n.iter=100,
main="Scree plots with parallel analysis")
The resulting plot is shown in figure 14.4. Notice you’ve requested that the function display results for both a principal-components and common-factor approach, so that you can compare them (fa = "both").
There are several things to notice in this graph. If you’d taken a PCA approach, you might have chosen one component (scree test, parallel analysis) or two components
Scree plots with parallel analysis
analysis |
3.0 |
|
|
|
PC Actual Data |
|
|
|
|
PC Simulated Data |
|||
|
|
|
FA Actual Data |
|
||
|
|
|
FA Simulated Data |
|||
factor |
2.5 |
|
|
|
|
|
components and |
1.5 2.0 |
|
|
|
|
|
principal |
1.0 |
|
|
|
|
|
eigenvalues of |
0.0 0.5 |
|
|
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
Figure 14.4 Assessing the number of factors to retain for the psychological tests example. Results for both PCA and EFA are present. The PCA results suggest one or two components. The EFA results suggest two factors.
Factor Number
332 |
CHAPTER 14 Principal components and factor analysis |
(eigenvalues greater than 1). When in doubt, it’s usually a better idea to overfactor than to underfactor. Overfactoring tends to lead to less distortion of the “true” solution.
Looking at the EFA results, a two-factor solution is clearly indicated. The first two eigenvalues (triangles) are above the bend in the scree test and also above the mean eigenvalues based on 100 simulated data matrices. For EFA, the Kaiser–Harris criterion is number of eigenvalues above 0, rather than 1. (Most people don’t realize this, so it’s a good way to win bets at parties.) In the present case the Kaiser–Harris criteria also suggest two factors.
14.3.2Extracting common factors
Now that you’ve decided to extract two factors, you can use the fa() function to obtain your solution. The format of the fa() function is
fa(r, nfactors=, n.obs=, rotate=, scores=, fm=)
where
■r is a correlation matrix or a raw data matrix.
■nfactors specifies the number of factors to extract (1 by default).
■n.obs is the number of observations (if a correlation matrix is input).
■rotate indicates the rotation to be applied (oblimin by default).
■scores specifies whether or not to calculate factor scores (false by default).
■fm specifies the factoring method (minres by default).
Unlike PCA, there are many methods of extracting common factors. They include maximum likelihood (ml), iterated principal axis (pa), weighted least square (wls), generalized weighted least squares (gls), and minimum residual (minres). Statisticians tend to prefer the maximum likelihood approach because of its well-defined statistical model. Sometimes, this approach fails to converge, in which case the iterated principal axis option often works well. To learn more about the different approaches, see Mulaik (2009) and Gorsuch (1983).
For this example, you’ll extract the unrotated factors using the iterated principal axis (fm = "pa") approach. The results are given in the next listing.
Listing 14.6 Principal axis factoring without rotation
>fa <- fa(correlations, nfactors=2, rotate="none", fm="pa")
>fa
Factor Analysis using method = pa
Call: fa(r = |
correlations, nfactors = 2, rotate = "none", fm = "pa") |
|||
Standardized |
loadings based upon correlation matrix |
|||
|
PA1 |
PA2 |
h2 |
u2 |
general 0.75 |
0.07 |
0.57 |
0.43 |
|
picture 0.52 |
0.32 |
0.38 |
0.62 |
|
blocks |
0.75 |
0.52 |
0.83 |
0.17 |
maze |
0.39 |
0.22 |
0.20 |
0.80 |
reading 0.81 |
-0.51 0.91 0.09 |
|||
vocab |
0.73 |
-0.39 0.69 0.31 |
Exploratory factor analysis |
333 |
|
|
PA1 |
PA2 |
SS loadings |
2.75 |
0.83 |
|
Proportion |
Var 0.46 |
0.14 |
|
Cumulative |
Var 0.46 |
0.60 |
[... additional output deleted ...]
You can see that the two factors account for 60% of the variance in the six psychological tests. When you examine the loadings, though, they aren’t easy to interpret. Rotating them should help.
14.3.3Rotating factors
You can rotate the two-factor solution from section 14.3.4 using either an orthogonal rotation or an oblique rotation. Let’s try both so you can see how they differ. First try an orthogonal rotation (in the next listing).
Listing 14.7 Factor extraction with orthogonal rotation
>fa.varimax <- fa(correlations, nfactors=2, rotate="varimax", fm="pa")
>fa.varimax
Factor Analysis using method = pa
Call: fa(r = |
correlations, nfactors = 2, rotate = "varimax", fm = "pa") |
|||
Standardized |
loadings based upon correlation matrix |
|||
|
PA1 |
PA2 |
h2 |
u2 |
general 0.49 |
0.57 |
0.57 |
0.43 |
|
picture 0.16 |
0.59 |
0.38 |
0.62 |
|
blocks |
0.18 |
0.89 |
0.83 |
0.17 |
maze |
0.13 |
0.43 |
0.20 |
0.80 |
reading 0.93 |
0.20 |
0.91 |
0.09 |
|
vocab |
0.80 |
0.23 |
0.69 |
0.31 |
PA1 PA2
SS loadings 1.83 1.75
Proportion Var 0.30 0.29
Cumulative Var 0.30 0.60
[... additional output omitted ...]
Looking at the factor loadings, the factors are certainly easier to interpret. Reading and vocabulary load on the first factor; and picture completion, block design, and mazes load on the second factor. The general nonverbal intelligence measure loads on both factors. This may indicate a verbal intelligence factor and a nonverbal intelligence factor.
By using an orthogonal rotation, you artificially force the two factors to be uncorrelated. What would you find if you allowed the two factors to correlate? You can try an oblique rotation such as promax (see the next listing).
Listing 14.8 Factor extraction with oblique rotation
>fa.promax <- fa(correlations, nfactors=2, rotate="promax", fm="pa")
>fa.promax
Factor Analysis using method = pa
334 CHAPTER 14 Principal components and factor analysis
Call: fa(r = correlations, nfactors = 2, rotate = "promax", fm = "pa") Standardized loadings based upon correlation matrix
|
PA1 |
PA2 |
h2 |
u2 |
general |
0.36 |
0.49 |
0.57 |
0.43 |
picture -0.04 |
0.64 |
0.38 |
0.62 |
|
blocks |
-0.12 |
0.98 |
0.83 |
0.17 |
maze |
-0.01 |
0.45 |
0.20 |
0.80 |
reading |
1.01 -0.11 0.91 0.09 |
|||
vocab |
0.84 -0.02 0.69 0.31 |
|||
|
|
PA1 |
PA2 |
|
SS loadings |
1.82 |
1.76 |
|
|
Proportion Var 0.30 0.29 |
|
|||
Cumulative Var 0.30 0.60 |
|
|||
With factor correlations of |
||||
PA1 |
PA2 |
|
|
|
PA1 1.00 0.57
PA2 0.57 1.00
[... additional output omitted ...]
Several differences exist between the orthogonal and oblique solutions. In an orthogonal solution, attention focuses on the factor structure matrix (the correlations of the variables with the factors). In an oblique solution, there are three matrices to consider: the factor structure matrix, the factor pattern matrix, and the factor intercorrelation matrix.
The factor pattern matrix is a matrix of standardized regression coefficients. They give the weights for predicting the variables from the factors. The factor intercorrelation matrix gives the correlations among the factors.
In listing 14.8, the values in the PA1 and PA2 columns constitute the factor pattern matrix. They’re standardized regression coefficients rather than correlations. Examination of the columns of this matrix is still used to name the factors (although there’s some controversy here). Again, you’d find a verbal and nonverbal factor.
The factor intercorrelation matrix indicates that the correlation between the two factors is 0.57. This is a hefty correlation. If the factor intercorrelations had been low, you might have gone back to an orthogonal solution to keep things simple.
The factor structure matrix (or factor loading matrix) isn’t provided. But you can easily calculate it using the formula F = P*Phi, where F is the factor loading matrix, P is the factor pattern matrix, and Phi is the factor intercorrelation matrix. A simple function for carrying out the multiplication is as follows:
fsm <- function(oblique) {
if (class(oblique)[2]=="fa" & is.null(oblique$Phi)) { warning("Object doesn't look like oblique EFA")
} else {
P <- unclass(oblique$loading) F <- P %*% oblique$Phi colnames(F) <- c("PA1", "PA2") return(F)
}
}
Exploratory factor analysis |
335 |
|
1.0 |
|
0.8 |
|
0.6 |
PA2 |
0.4 |
|
0.2 |
|
0.0 |
Factor Analysis
blocks
picture
general maze
vocab
readin
0.0 |
0.2 |
0.4 |
0.6 |
0.8 |
1.0 |
PA1
Figure 14.5 Two-factor plot for the psychological tests in ability.cov. vocab and reading load on the first factor (PA1), and blocks, picture, and maze load on the second factor (PA2). The general intelligence test loads on both.
Applying this to the example, you get
> fsm(fa.promax) PA1 PA2 general 0.64 0.69
picture 0.33 0.61 blocks 0.44 0.91 maze 0.25 0.45 reading 0.95 0.47 vocab 0.83 0.46
Now you can review the correlations between the variables and the factors. Comparing them to the factor loading matrix in the orthogonal solution, you see that these columns aren’t as pure. This is because you’ve allowed the underlying factors to be correlated. Although the oblique approach is more complicated, it’s often a more realistic model of the data.
You can graph an orthogonal or oblique solution using the factor.plot() or fa.diagram() function. The code
factor.plot(fa.promax, labels=rownames(fa.promax$loadings))
produces the graph in figure 14.5. The code
fa.diagram(fa.promax, simple=FALSE)
produces the diagram in figure 14.6. If you let simple = TRUE, only the largest loading per item is displayed. It shows the largest loadings for each factor, as well as the