Overview
Overview
William Revelle
Department of Psychology
Northwestern University
Contents
0.1 Jump starting the psych package–a guide for the impatient . . . . . . . . . . . . . 4
0.2 Psychometric functions are summarized in this vignette . . . . . . . . . . . . . . . 5
2 Getting started 8
1
4.7 Exploratory Structural Equation Modeling (ESEM) . . . . . . . . . . . . . . . . . 37
7 Multilevel modeling 70
7.1 Decomposing data into within and between level correlations using statsBy . . . 71
7.2 Generating and displaying multilevel data . . . . . . . . . . . . . . . . . . . . . . 71
7.3 Factor analysis by groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.4 Multilevel reliability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
9 Simulation functions 74
10 Graphical Displays 76
12 Miscellaneous functions 79
13 Data sets 80
15 Psychometric Theory 81
2
16 SessionInfo 82
3
0.1 Jump starting the psych package–a guide for the impatient
You have installed psych (section 2) and you want to use it without reading much more. What
should you do?
1. Activate the psych package:
library(psych)
library(psychTools)
2. Input your data (see the Introduction to Psych vignette section 3.1). There are two ways to
do this:
• Find and read standard files using read.file. This will open a search window for
your operating system which you can use to find the file. If the file has a suffix of .text,
.txt, .csv, .data, .sav, .r, .R, .rds, .Rds, .rda, .Rda, .rdata, or .RData, then the file will be
opened and the data will be read in.
myData <- read.file() # find the appropriate file using your normal operating system
• Alternatively, go to your friendly text editor or data manipulation program (e.g., Excel)
and copy the data to the clipboard. Include a first line that has the variable labels. Paste
it into psych using the read.clipboard.tab command:
myData <- read.clipboard.tab() # if on the clipboard
Note that there are number of options for read.clipboard for reading in Excel
based files, lower triangular files, etc.
3. Make sure that what you just read is right. Describe it (see the Introduction to Psych vignette
section 3.3) on how to describe data) and perhaps look at the first and last few lines. If
you have multiple groups, try describeBy.
dim(myData) #What are the dimensions of the data?
describe(myData) # or
descrbeBy(myData,groups="mygroups") #for descriptive statistics by groups
headTail(myData) #show the first and last n lines of a file
4. Look at the patterns in the data. If you have fewer than about 12 variables, look at the
SPLOM (Scatter Plot Matrix) of the data using pairs.panels ( (see the Introduction to
Psych vignette section 3.4 for a discussion of graphics)) . Then, use the outlier function
to detect outliers.
pairs.panels(myData)
outlier(myData)
5. Note that you might have some weird subjects, probably due to data entry errors. Either edit
the data by hand (use the edit command) or just scrub the data).
cleaned <- scrub(myData, max=9) #e.g., change anything great than 9 to NA
6. Graph the data with error bars for each variable ( (see the Introduction to Psych vignette
section 3.1)).
4
error.bars(myData)
7. Find the correlations of all of your data. lowerCor will by default find the pairwise corre-
lations, round them to 2 decimals, and display the lower off diagonal matrix.
• Descriptively (just the values) (section ??)
r <- lowerCor(myData) #The correlation matrix, rounded to 2 decimals
• Graphically (section ??). Another way is to show a heat map of the correlations with
the correlation values included.
corPlot(r) #examine the many options for this function.
• Inferentially (the values, the ns, and the p values) (section ??)
corr.test(myData)
• mediate will take raw data or a correlation matrix and find (and graph the path dia-
gram) for multiple y variables depending upon multiple x variables mediated through a
mediation variable. It then tests the mediation effect using a boot strap.
mediate(y1 + y2 ~ x1 + x2 + (med1) , data = myData)
• mediate will take raw data and find (and graph the path diagram) a moderated mul-
tiple regression model for multiple y variables depending upon multiple x variables
mediated through a mediation variable. It then tests the mediation effect using a boot
strap.
mediate(y1 + y2 ~ x1 + x2* mod1 +(med1), data = myData)
5
• Test for the number of factors in your data using parallel analysis (fa.parallel,
section 4.5.2) or Very Simple Structure (vss, 4.5.1) .
fa.parallel(myData)
vss(myData)
• Factor analyze (see section 4.1) the data with a specified number of factors (the de-
fault is 1), the default method is minimum residual, the default rotation for more than
one factor is oblimin. There are many more possibilities (see sections 4.1.1-4.1.4).
Compare the solution to a hierarchical cluster analysis using the ICLUST algorithm
(Revelle, 1979) (see section 4.1.7). Also consider a hierarchical factor solution to find
coefficient ω (see 4.1.6).
fa(myData)
iclust(myData)
omega(myData)
If you prefer to do a principal components analysis you may use the principal
function. The default is one component.
principal(myData)
• Some people like to find coefficient α as an estimate of reliability. This may be done for
a single scale using the alpha function (see 5.1). Perhaps more useful is the ability to
create several scales as unweighted averages of specified items using the scoreItems
function (see 5.4) and to find various estimates of internal consistency for these scales,
find their intercorrelations, and find scores for all the subjects.
alpha(myData) #score all of the items as part of one scale.
myKeys <- make.keys(nvar=20,list(first = c(1,-3,5,-7,8:10),second=c(2,4,-6,11:15,-16)))
my.scores <- scoreItems(myKeys,myData) #form several scales
my.scores #show the highlights of the results
At this point you have had a chance to see the highlights of the psych package and to do some basic
(and advanced) data analysis. You might find reading this entire vignette as well as the Overview
Vignette to be helpful to get a broader understanding of what can be done in R using the psych.
Remember that the help command (?) is available for every function. Try running the examples for
each help page.
6
1 Overview of this and related documents
The psych package (Revelle, 2023) has been developed at Northwestern University since 2005
to include functions most useful for personality, psychometric, and psychological research. The
package is also meant to supplement a text on psychometric theory (Revelle, prep), a draft of
which is available at https://personality-project.org/r/book/.
Some of the functions (e.g., read.file, read.clipboard, describe, pairs.panels,
scatter.hist, error.bars, multi.hist, bi.bars) are useful for basic data entry and
descriptive analyses.
Psychometric applications emphasize techniques for dimension reduction including factor analysis,
cluster analysis, and principal components analysis. The fa function includes five methods of fac-
tor analysis (minimum residual, principal axis, weighted least squares, generalized least squares
and maximum likelihood factor analysis). Principal Components Analysis (PCA) is also avail-
able through the use of the principal or pca functions. Determining the number of factors
or components to extract may be done by using the Very Simple Structure (Revelle and Rock-
lin, 1979) (vss), Minimum Average Partial correlation (Velicer, 1976) (MAP) or parallel analysis
(fa.parallel) criteria. These and several other criteria are included in the nfactors func-
tion. Two parameter Item Response Theory (IRT) models for dichotomous or polytomous items
may be found by factoring tetrachoric or polychoric correlation matrices and expressing
the resulting parameters in terms of location and discrimination using irt.fa.
Bifactor and hierarchical factor structures may be estimated by using Schmid Leiman transfor-
mations (Schmid and Leiman, 1957) (schmid) to transform a hierarchical factor structure into a
bifactor solution (Holzinger and Swineford, 1937). Higher order models can also be found using
fa.multi.
Scale construction can be done using the Item Cluster Analysis (Revelle, 1979) (iclust) func-
tion to determine the structure and to calculate reliability coefficients α (Cronbach, 1951)(alpha,
scoreItems, score.multiple.choice), β (Revelle, 1979; Revelle and Zinbarg, 2009)
(iclust) and McDonald’s ωh and ωt (McDonald, 1999) (omega). Guttman’s six estimates of
internal consistency reliability (Guttman (1945), as well as additional estimates (Revelle and Zin-
barg, 2009) are in the guttman function. The six measures of Intraclass correlation coefficients
(ICC) discussed by Shrout and Fleiss (1979) are also available.
For data with a a multilevel structure (e.g., items within subjects across time, or items within
subjects across groups), the describeBy, statsBy functions will give basic descriptives by
group. StatsBy also will find within group (or subject) correlations as well as the between group
correlation.
multilevel.reliability mlr will find various generalizability statistics for subjects over
time and items. mlPlot will graph items over for each subject, mlArrange converts wide data
frames to long data frames suitable for multilevel modeling.
7
Graphical displays include Scatter Plot Matrix (SPLOM) plots using pairs.panels, correlation
“heat maps” (corPlot) factor, cluster, and structural diagrams using fa.diagram, iclust.diagram,
structure.diagram and het.diagram, as well as item response characteristics and item
and test information characteristic curves plot.irt and plot.poly.
This vignette is meant to give an overview of the psych package. That is, it is meant to give a
summary of the main functions in the psych package with examples of how they are used for data
description, dimension reduction, and scale construction. The extended user manual at psych_
manual.pdf includes examples of graphic output and more extensive demonstrations than are
found in the help menus. (Also available at https://personality-project.org/r/
psych_manual.pdf). The vignette, psych for sem, at psych_for_sem.pdf, discusses how
to use psych as a front end to the sem package of John Fox (Fox et al., 2013). (The vignette
is also available at https://personality-project.org/r/book/psych_for_sem.
pdf).
In addition, there are a growing number of “HowTo"s at the personality project. Currently these
include:
1. An introduction (vignette) of the psych package
2. An overview (vignette) of the psych package
3. Installing R and some useful packages
4. Using R and the psych package to find omegah and ωt .
5. Using R and the psych for factor analysis and principal components analysis.
6. Using the scoreItems function to find scale scores and scale statistics.
7. Using mediate and lmCor to do mediation, moderation and regression analysis.
For a step by step tutorial in the use of the psych package and the base functions in R for basic per-
sonality research, see the guide for using R for personality research at https://personalitytheory.
org/r/r.short.html. For an introduction to psychometric theory with applications in R, see
the draft chapters at https://personality-project.org/r/book).
2 Getting started
Some of the functions described in this overview require other packages. Particularly useful for ro-
tating the results of factor analyses (from e.g., fa, factor.minres, factor.pa, factor.wls,
or principal) or hierarchical factor models using omega or schmid, is the GPArotation pack-
age. These and other useful packages may be installed by first installing and then using the task
views (ctv) package to install the “Psychometrics" task view, but doing it this way is not neces-
sary.
8
install.packages("ctv")
library(ctv)
task.views("Psychometrics")
The “Psychometrics” task view will install a large number of useful packages. To install the bare
minimum for the examples in this vignette, it is necessary to install just 3 packages:
install.packages(list(c("GPArotation","mnormt","psychTools")
Because of the difficulty of installing the package Rgraphviz, alternative graphics have been de-
veloped and are available as diagram functions. If Rgraphviz is available, some functions will
take advantage of it. An alternative is to use “dot” output of commands for any external graphics
package that uses the dot language.
9
dimension reduction (e.g., factor analysis, cluster analysis, principal components analysis) and of
forming and estimating the reliability of the resulting composite scales.
1 Although probably neither original with Ockham nor directly stated by him (Thorburn, 1918), Ockham’s razor
observed variables, but are willing to estimate the major underlying factors.
10
factor.minres (deprecated) Minimum residual factor analysis is a least squares, iterative solution to the factor problem. minres attempts to minimize the residual (off-
diagonal) correlation matrix. It produces solutions similar to maximum likelihood solutions, but will work even if the matrix is singular.
factor.pa (deprecated) Principal Axis factor analysis is a least squares, iterative solution to the factor problem. PA will work for cases where maximum likelihood techniques
(factanal) will not work. The original communality estimates are either the squared multiple correlations (smc) for each item or 1.
factor.wls (deprecated) Weighted least squares factor analysis is a least squares, iterative solution to the factor problem. It minimizes the (weighted) squared residual matrix.
The weights are based upon the independent contribution of each variable.
principal Principal Components Analysis reports the largest n eigen vectors rescaled by the
square root of their eigen values. Note that PCA is not the same as factor analysis and the
two should not be confused.
factor.congruence The congruence between two factors is the cosine of the angle between
them. This is just the cross products of the loadings divided by the sum of the squared load-
ings. This differs from the correlation coefficient in that the mean loading is not subtracted
before taking the products. factor.congruence will find the cosines between two (or
more) sets of factor loadings.
vss Very Simple Structure Revelle and Rocklin (1979) applies a goodness of fit test to determine
the optimal number of factors to extract. It can be thought of as a quasi-confirmatory model,
in that it fits the very simple structure (all except the biggest c loadings per item are set to
zero where c is the level of complexity of the item) of a factor pattern matrix to the original
correlation matrix. For items where the model is usually of complexity one, this is equivalent
to making all except the largest loading for each item 0. This is typically the solution that
the user wants to interpret. The analysis includes the MAP criterion of Velicer (1976) and a
χ 2 estimate.
nfactors combines VSS, MAP, and a number of other fit statistics. The depressing reality is
that frequently these conventional fit estimates of the number of factors do not agree.
fa.parallel The parallel factors technique compares the observed eigen values of a correla-
tion matrix with those from random data.
fa.plot will plot the loadings from a factor, principal components, or cluster analysis (just a
call to plot will suffice). If there are more than two factors, then a SPLOM of the loadings is
generated.
fa.diagram replaces fa.graph and will draw a path diagram representing the factor struc-
ture. It does not require Rgraphviz and thus is probably preferred.
fa.graph requires Rgraphviz and will draw a graphic representation of the factor structure.
If factors are correlated, this will be represented as well.
iclust is meant to do item cluster analysis using a hierarchical clustering algorithm specifically
asking questions about the reliability of the clusters (Revelle, 1979). Clusters are formed
until either coefficient α Cronbach (1951) or β Revelle (1979) fail to increase.
11
4.1.1 Minimum Residual Factor Analysis
The factor model is an approximation of a correlation matrix by a matrix of lower rank. That is, can
the correlation matrix, n~Rn be approximated by the product of a factor matrix, n~Fk and its transpose
plus a diagonal matrix of uniqueness.
R = FF 0 +U 2 (1)
The maximum likelihood solution to this equation is found by factanal in the stats package as
well as the fa function in psych. Seven alternatives are provided in psych, all of them are included
in the fa function and are called by specifying the factor method (e.g., fm=“minres", fm=“pa",
fm=“alpha" fm=‘wls", fm=“gls", fm = “min.rank", and fm=“ml"). In the discussion of the other
algorithms, the calls shown are to the fa function specifying the appropriate method.
factor.minres attempts to minimize the off diagonal residual correlation matrix by adjusting
the eigen values of the original correlation matrix. This is similar to what is done in factanal,
but uses an ordinary least squares instead of a maximum likelihood fit function. The solutions tend
to be more similar to the MLE solutions than are the factor.pa solutions. min.res is the default
for the fa function.
A classic data set, collected by Thurstone and Thurstone (1941) and then reanalyzed by Bech-
toldt (1961) and discussed by McDonald (1999), is a set of 9 cognitive variables with a clear
bi-factor structure (Holzinger and Swineford, 1937). The minimum residual solution was trans-
formed into an oblique solution using the default option on rotate which uses an oblimin trans-
formation (Table 1). Alternative rotations and transformations include “none", “varimax", “quar-
timax", “bentlerT", “varimin” and “geominT" (all of which are orthogonal rotations). as well as
“promax", “oblimin", “simplimax", “bentlerQ, and “geominQ" and “cluster" which are possible
oblique transformations of the solution. The default is to do a oblimin transformation. The mea-
sures of factor adequacy reflect the multiple correlations of the factors with the best fitting linear
regression estimates of the factor scores (Grice, 2001).
Note that if extracting more than one factor, and doing any oblique rotation, it is necessary to have
the GPArotation installed. This is checked for in the appropriate functions.
12
Table 1: Three correlated factors from the Thurstone 9 variable problem. By default, the solution
is transformed obliquely using oblimin. The extraction method is (by default) minimum residual.
> if(!require('GPArotation')) {stop('GPArotation must be installed to do rotations')} else {
+ library(psych)
+ library(psychTools)
+ f3t <- fa(Thurstone,3,n.obs=213)
+ f3t }
Factor Analysis using method = minres
Call: fa(r = Thurstone, nfactors = 3, n.obs = 213)
Standardized loadings (pattern matrix) based upon correlation matrix
MR1 MR2 MR3 h2 u2 com
Sentences 0.90 -0.03 0.04 0.82 0.18 1.0
Vocabulary 0.89 0.06 -0.03 0.84 0.16 1.0
Sent.Completion 0.84 0.03 0.00 0.74 0.26 1.0
First.Letters 0.00 0.85 0.00 0.73 0.27 1.0
Four.Letter.Words -0.02 0.75 0.10 0.63 0.37 1.0
Suffixes 0.18 0.63 -0.08 0.50 0.50 1.2
Letter.Series 0.03 -0.01 0.84 0.73 0.27 1.0
Pedigrees 0.38 -0.05 0.46 0.51 0.49 2.0
Letter.Group -0.06 0.21 0.63 0.52 0.48 1.2
df null model = 36 with the objective function = 5.2 with Chi Square = 1081.97
df of the model are 12 and the objective function was 0.01
The harmonic n.obs is 213 with the empirical chi square 0.52 with prob < 1
The total n.obs was 213 with Likelihood Chi Square = 2.98 with prob < 1
13
The solutions from the fa, the factor.minres and factor.pa as well as the principal
functions can be rotated or transformed with a number of options. Some of these call the GPAro-
tation package. Orthogonal rotations include varimax, quartimax, varimin, bifactor .
Oblique transformations include oblimin, quartimin, biquartimin and then two targeted
rotation functions Promax and target.rot. The latter of these will transform a loadings ma-
trix towards an arbitrary target matrix. The default is to transform towards an independent cluster
solution.
Using the Thurstone data set, three factors were requested and then transformed into an independent
clusters solution using target.rot (Table 2).
Table 2: The 9 variable problem from Thurstone is a classic example of factoring where there is a
higher order factor, g, that accounts for the correlation between the factors. The extraction method
was principal axis. The transformation was a targeted transformation to a simple cluster solution.
> if(!require('GPArotation')) {stop('GPArotation must be installed to do rotations')} else {
+ f3 <- fa(Thurstone,3,n.obs = 213,fm="pa")
+ f3o <- target.rot(f3)
+ f3o}
Call: NULL
Standardized loadings (pattern matrix) based upon correlation matrix
PA1 PA2 PA3 h2 u2
Sentences 0.89 -0.03 0.07 0.81 0.19
Vocabulary 0.89 0.07 0.00 0.80 0.20
Sent.Completion 0.83 0.04 0.03 0.70 0.30
First.Letters -0.02 0.85 -0.01 0.73 0.27
Four.Letter.Words -0.05 0.74 0.09 0.57 0.43
Suffixes 0.17 0.63 -0.09 0.43 0.57
Letter.Series -0.06 -0.08 0.84 0.69 0.31
Pedigrees 0.33 -0.09 0.48 0.37 0.63
Letter.Group -0.14 0.16 0.64 0.45 0.55
14
worth comparing solutions from minres, alpha, and MLE, for they are not the same.
15
Table 3: The 9 variable problem from Thurstone is a classic example of factoring where there is
a higher order factor, g, that accounts for the correlation between the factors. The factors were
extracted using a weighted least squares algorithm. All loadings are shown by using the cut=0
option in the print.psych function.
> f3w <- fa(Thurstone,3,n.obs = 213,fm="wls")
> print(f3w,cut=0,digits=3)
Factor Analysis using method = wls
Call: fa(r = Thurstone, nfactors = 3, n.obs = 213, fm = "wls")
Standardized loadings (pattern matrix) based upon correlation matrix
WLS1 WLS2 WLS3 h2 u2 com
Sentences 0.905 -0.034 0.040 0.822 0.178 1.01
Vocabulary 0.890 0.066 -0.031 0.835 0.165 1.01
Sent.Completion 0.833 0.034 0.007 0.735 0.265 1.00
First.Letters -0.002 0.855 0.003 0.731 0.269 1.00
Four.Letter.Words -0.016 0.743 0.106 0.629 0.371 1.04
Suffixes 0.180 0.626 -0.082 0.496 0.504 1.20
Letter.Series 0.033 -0.015 0.838 0.719 0.281 1.00
Pedigrees 0.381 -0.051 0.464 0.505 0.495 1.95
Letter.Group -0.062 0.209 0.632 0.527 0.473 1.24
df null model = 36 with the objective function = 5.198 with Chi Square = 1081.968
df of the model are 12 and the objective function was 0.014
The harmonic n.obs is 213 with the empirical chi square 0.531 with prob < 1
The total n.obs was 213 with Likelihood Chi Square = 2.885 with prob < 0.996
16
> plot(f3t)
Factor Analysis
0.0 0.2 0.4 0.6 0.8
0.8
0.6
MR1
0.4
0.2
0.0
0.8
0.6
MR2
0.4
0.2
0.0
0.8
0.6
0.4
MR3 0.2
0.0
0.0 0.2 0.4 0.6 0.8 0.0 0.2 0.4 0.6 0.8
Figure 1: A graphic representation of the 3 oblique factors from the Thurstone data using plot.
Factors were transformed to an oblique solution using the oblimin function from the GPArotation
package.
17
> fa.diagram(f3t)
Factor Analysis
Sentences
0.9
Vocabulary 0.9
MR1
Sent.Completion 0.8
0.6
First.Letters
0.9
0.6
Suffixes
0.5
Letter.Series 0.8
MR3
Letter.Group 0.6
0.5
Pedigrees
Figure 2: A graphic representation of the 3 oblique factors from the Thurstone data using
fa.diagram. Factors were transformed to an oblique solution using oblimin.
18
Table 4: The Thurstone problem can also be analyzed using Principal Components Analysis. Com-
pare this to Table 2. The loadings are higher for the PCA because the model accounts for the unique
as well as the common variance.The fit of the off diagonal elements, however, is much worse than
the fa results.
> p3p <-principal(Thurstone,3,n.obs = 213,rotate="Promax")
> p3p
Principal Components Analysis
Call: principal(r = Thurstone, nfactors = 3, rotate = "Promax", n.obs = 213)
Standardized loadings (pattern matrix) based upon correlation matrix
RC1 RC2 RC3 h2 u2 com
Sentences 0.92 0.01 0.01 0.86 0.14 1.0
Vocabulary 0.90 0.10 -0.05 0.86 0.14 1.0
Sent.Completion 0.91 0.04 -0.04 0.83 0.17 1.0
First.Letters 0.01 0.84 0.07 0.78 0.22 1.0
Four.Letter.Words -0.05 0.81 0.17 0.75 0.25 1.1
Suffixes 0.18 0.79 -0.15 0.70 0.30 1.2
Letter.Series 0.03 -0.03 0.88 0.78 0.22 1.0
Pedigrees 0.45 -0.16 0.57 0.67 0.33 2.1
Letter.Group -0.19 0.19 0.86 0.75 0.25 1.2
19
found using the omega function. This technique has more recently been applied to the personality
domain to consider such things as the structure of neuroticism (treated as a general factor, with
lower order factors of anxiety, depression, and aggression).
Consider the 9 Thurstone variables analyzed in the prior factor analyses. The correlations between
the factors (as shown in Figure 2 can themselves be factored. This results in a higher order factor
model (Figure 3). An an alternative solution is to take this higher order model and then solve for
the general factor loadings as well as the loadings on the residualized lower order factors using the
Schmid-Leiman procedure. (Figure 4). Yet another solution is to use structural equation modeling
to directly solve for the general and group factors.
> om.h <- omega(Thurstone,n.obs=213,sl=FALSE)
> op <- par(mfrow=c(1,1))
Omega
Sentences
0.9
Vocabulary
0.9
F1
0.8
Sent.Completion
0.8
First.Letters
0.9
0.6 0.4
Suffixes
0.7
Letter.Series
0.2 0.8
F3
0.6
Letter.Group
0.5
Pedigrees
Yet another approach to the bifactor structure is do use the bifactor rotation function in either
20
> om <- omega(Thurstone,n.obs=213)
Omega
Sentences
0.6
0.7 Vocabulary
0.6
F1*
0.7 0.5
Sent.Completion
0.7
First.Letters
0.6 0.6
Pedigrees
21
psych or in GPArotation. This does the rotation discussed in Jennrich and Bentler (2011).
22
the structure matrix of factor analysis) are reported when printing (Table 7). The pattern matrix is
available as an object in the results.
> data(bfi)
> ic <- iclust(bfi[1:25])
ICLUST
O5 0.57
0.57 C7
O2 0.32 C21
α = 0.41
O4 −0.42 β = 0.27
C5 0.69
0.69 C1
C4 0.68 C15
α = 0.73
C3 C14β = 0.67
−0.91
0.7 α = 0.63
C2 0.65 0.84 β = 0.58
0.65 C4
C1
N4 0.72
0.72 C8
N3 0.72 C13
α = 0.71
N5 0.75 β = 0.650.86 C16
α = 0.81
N2 0.84 0.76 β = 0.76
0.84 C5
N1
O3 0.63
0.63 C2
O1 0.73 C12
α = 0.68
E5 0.63 0.9 β = 0.64
0.63 C9 0.69
E3 C19
α = 0.76
E4 0.72 β = 0.64
−0.72 C6 0.69
E2 0.77 C11 0.63
α = 0.72
E1 −0.77 β = 0.69 C20
α = 0.81
A5 0.71 β = 0.63
0.71 C3
A3 0.77 C10
α = 0.72 0.69
A2 0.77 β = 0.68 0.67 C17
α = 0.72
A4 0.7 C18
0.61
β = 0.54
α = 0.71
A1 −0.61 β = 0.5
Figure 5: Using the iclust function to find the cluster structure of 25 personality items (the three
demographic variables were excluded from this analysis). When analyzing many variables, the tree
structure may be seen more clearly if the graphic output is saved as a pdf and then enlarged using
a pdf viewer.
The previous analysis (Figure 5) was done using the Pearson correlation. A somewhat cleaner
structure is obtained when using the polychoric function to find polychoric correlations (Fig-
ure 6). Note that the first time finding the polychoric correlations some time, but the next three
analyses were done using that correlation matrix (r.poly$rho). When using the console for input,
polychoric will report on its progress while working using progressBar.
23
Table 5: The summary statistics from an iclust analysis shows three large clusters and smaller
cluster.
> summary(ic) #show the results
ICLUST (Item Cluster Analysis)Call: iclust(r.mat = bfi[1:25])
ICLUST
Purified Alpha:
C20 C16 C15 C21
0.80 0.81 0.73 0.61
Guttman Lambda6*
C20 C16 C15 C21
0.82 0.81 0.72 0.61
Original Beta:
C20 C16 C15 C21
0.63 0.76 0.67 0.27
Cluster size:
C20 C16 C15 C21
10 5 5 5
Table 6: The polychoric and the tetrachoric functions can take a long time to finish and
report their progress by a series of dots as they work. The dots are suppressed when creating a
Sweave document.
> data(bfi)
> r.poly <- polychoric(bfi[1:25],correct=0) #the ... indicate the progress of the function
1.7.1
24
> ic.poly <- iclust(r.poly$rho,title="ICLUST using polychoric correlations")
> iclust.diagram(ic.poly)
ICLUST using polychoric correlations
N2 0.87
0.87 C4
N1 0.7 C16
α = 0.84
N5 C13 0.96 β = 0.79
0.78 α = 0.74
N4 0.75 0.86 β = 0.69
0.75 C8
N3
O4 C21
0.52 α = 0.48
O5 0.63 −0.57 β = 0.35
0.63 C7 0.31
O2 C22
α = 0.81
A5 0.76 β = 0.29
0.76 C1
A3 0.8 C10
α = 0.77
A2 0.81 β = 0.73 0.69 C17 0.31
α = 0.77
A4 0.73 C18
0.65
β = 0.59
α = 0.76
A1 −0.65 0.63C20
β = 0.56
α = 0.83
E5 0.66 β = 0.66
0.66 C9 0.6
E3 0.77 C12
α = 0.72 0.72
O3 0.67 0.89 β = 0.68
0.67 C5 0.7
O1 C19
α = 0.8
E1 C11 −0.68 β = 0.66
0.8 α = 0.77
E4 0.76 −0.91 β = 0.73
−0.76 C6
E2 C23
α = 0.83
C3 C14 β = 0.58
0.72 α = 0.67
C2 0.7 0.84 β = 0.61 0.49
0.7 C2 0.8
C1 C15
α = 0.77
C5 0.73 −0.81 β = 0.71
0.73 C3
C4
Figure 6: ICLUST of the BFI data set using polychoric correlations. Compare this solution to the
previous one (Figure 5) which was done using Pearson correlations.
25
> ic.poly <- iclust(r.poly$rho,5,title="ICLUST using polychoric correlations for nclusters=5")
> iclust.diagram(ic.poly)
ICLUST using polychoric correlations for nclusters=5
O5 0.63
0.63 C7
O2
O4
C3 C14
0.72 α = 0.67
C2 0.7 0.84 β = 0.61
0.7 C2 0.8
C1 C15
α = 0.77
C5 0.73 −0.81 β = 0.71
0.73 C3
C4
N2 0.87
0.87 C4
N1 0.7 C16
α = 0.84
N5 C13 0.96 β = 0.79
0.78 α = 0.74
N4 0.75 0.86 β = 0.69
0.75 C8
N3
A5 0.76
0.76 C1
A3 0.8 C10
α = 0.77
A2 0.81 β = 0.73 0.69 C17
α = 0.77
A4 0.73 C18
0.65
β = 0.59
α = 0.76
A1 −0.65 0.63C20
β = 0.56
α = 0.83
E5 0.66 β = 0.66
0.66 C9
E3 0.77 C12
α = 0.72 0.72
O3 0.67 0.89 β = 0.68
0.67 C5 0.7
O1 C19
α = 0.8
E1 C11 −0.68 β = 0.66
0.8 α = 0.77
E4 0.76 −0.91 β = 0.73
−0.76 C6
E2
Figure 7: ICLUST of the BFI data set using polychoric correlations with the solution set to 5
clusters. Compare this solution to the previous one (Figure 6) which was done without specifying
the number of clusters and to the next one (Figure 8) which was done by changing the beta criterion.
26
> ic.poly <- iclust(r.poly$rho,beta.size=3,title="ICLUST beta.size=3")
ICLUST beta.size=3
N2 0.87
0.87 C4
N1 0.7 C16
α = 0.84
N5 C13 0.96 β = 0.79
0.78 α = 0.74
N4 0.75 0.86 β = 0.69
0.75 C8
N3
O4 C21
0.52 α = 0.48
O5 0.63 −0.57 β = 0.35
0.63 C7 0.31
O2 C22
α = 0.81
A5 0.76 β = 0.29
0.76 C1
A3 0.8 C10
α = 0.77
A2 0.81 β = 0.73 0.69 C17 0.31
α = 0.77
A4 0.73 C18
0.65
β = 0.59
α = 0.76
A1 −0.65 0.63C20
β = 0.56
α = 0.83
E5 0.66 β = 0.66
0.66 C9 0.6
E3 0.77 C12
α = 0.72 0.72
O3 0.67 0.89 β = 0.68
0.67 C5 0.7
O1 C19
α = 0.8
E1 C11 −0.68 β = 0.66
0.8 α = 0.77
E4 0.76 −0.91 β = 0.73
−0.76 C6
E2 C23
α = 0.83
C3 C14 β = 0.58
0.72 α = 0.67
C2 0.7 0.84 β = 0.61 0.49
0.7 C2 0.8
C1 C15
α = 0.77
C5 0.73 −0.81 β = 0.71
0.73 C3
C4
Figure 8: ICLUST of the BFI data set using polychoric correlations with the beta criterion set to 3.
Compare this solution to the previous three (Figure 5, 6, 7).
27
Table 7: The output from iclust includes the loadings of each item on each cluster. These
are equivalent to factor structure loadings. By specifying the value of cut, small loadings are
suppressed. The default is for cut=0.su
> print(ic,cut=.3)
ICLUST (Item Cluster Analysis)
Call: iclust(r.mat = bfi[1:25])
Purified Alpha:
C20 C16 C15 C21
0.80 0.81 0.73 0.61
G6* reliability:
C20 C16 C15 C21
0.83 1.00 0.50 0.38
Original Beta:
C20 C16 C15 C21
0.63 0.76 0.67 0.27
Cluster size:
C20 C16 C15 C21
10 5 5 5
∑nk=1 fik f jk
c fi f j = .
∑ fik2 ∑ f jk
2
Consider the case of a four factor solution and four cluster solution to the Big Five problem.
> f4 <- fa(bfi[1:25],4,fm="pa")
> factor.congruence(f4,ic)
29
Table 8: An example of bootstrapped confidence intervals on 10 items from the Big 5 inventory.
The number of bootstrapped samples was set to 20. More conventional bootstrapping would use
100 or 1000 replications.
> fa(bfi[1:10],2,n.iter=20)
Factor Analysis with confidence intervals using method = fa(r = bfi[1:10], nfactors = 2, n.iter = 20)
Factor Analysis using method = minres
Call: fa(r = bfi[1:10], nfactors = 2, n.iter = 20)
Standardized loadings (pattern matrix) based upon correlation matrix
MR1 MR2 h2 u2 com
A1 0.08 -0.41 0.15 0.85 1.1
A2 0.01 0.68 0.46 0.54 1.0
A3 -0.03 0.76 0.56 0.44 1.0
A4 0.14 0.44 0.25 0.75 1.2
A5 0.03 0.60 0.37 0.63 1.0
C1 0.57 -0.06 0.31 0.69 1.0
C2 0.64 -0.01 0.40 0.60 1.0
C3 0.54 0.03 0.31 0.69 1.0
C4 -0.65 0.00 0.42 0.58 1.0
C5 -0.56 -0.06 0.34 0.66 1.0
MR1 MR2
SS loadings 1.80 1.78
Proportion Var 0.18 0.18
Cumulative Var 0.18 0.36
Proportion Explained 0.50 0.50
Cumulative Proportion 0.50 1.00
df null model = 45 with the objective function = 2.03 with Chi Square = 5664.89
df of the model are 26 and the objective function was 0.17
The harmonic n.obs is 2762 with the empirical chi square 397.07 with prob < 5e-68
The total n.obs was 2800 with Likelihood Chi Square = 468.37 with prob < 1.2e-82
30
PA3 0.35 -0.24 -0.88 -0.37
PA4 0.29 -0.12 -0.27 -0.90
A more complete comparison of oblique factor solutions (both minres and principal axis), bifactor
and component solutions to the Thurstone data set is done using the factor.congruence
function. (See table 9).
Table 9: Congruence coefficients for oblique factor, bifactor and component solutions for the Thur-
stone problem.
> factor.congruence(list(f3t,f3o,om,p3p))
MR1 MR2 MR3 PA1 PA2 PA3 g F1* F2* F3* h2 RC1 RC2 RC3
MR1 1.00 0.06 0.09 1.00 0.06 0.13 0.72 1.00 0.06 0.09 0.73 1.00 0.08 0.04
MR2 0.06 1.00 0.08 0.03 1.00 0.07 0.60 0.06 1.00 0.08 0.57 0.04 0.99 0.12
MR3 0.09 0.08 1.00 0.01 0.01 1.00 0.52 0.09 0.08 1.00 0.51 0.06 0.02 0.99
PA1 1.00 0.03 0.01 1.00 0.04 0.05 0.67 1.00 0.03 0.01 0.68 1.00 0.06 -0.04
PA2 0.06 1.00 0.01 0.04 1.00 0.00 0.57 0.06 1.00 0.01 0.54 0.04 0.99 0.05
PA3 0.13 0.07 1.00 0.05 0.00 1.00 0.54 0.13 0.07 1.00 0.54 0.10 0.01 0.99
g 0.72 0.60 0.52 0.67 0.57 0.54 1.00 0.72 0.60 0.52 0.99 0.69 0.58 0.50
F1* 1.00 0.06 0.09 1.00 0.06 0.13 0.72 1.00 0.06 0.09 0.73 1.00 0.08 0.04
F2* 0.06 1.00 0.08 0.03 1.00 0.07 0.60 0.06 1.00 0.08 0.57 0.04 0.99 0.12
F3* 0.09 0.08 1.00 0.01 0.01 1.00 0.52 0.09 0.08 1.00 0.51 0.06 0.02 0.99
h2 0.73 0.57 0.51 0.68 0.54 0.54 0.99 0.73 0.57 0.51 1.00 0.71 0.56 0.50
RC1 1.00 0.04 0.06 1.00 0.04 0.10 0.69 1.00 0.04 0.06 0.71 1.00 0.06 0.00
RC2 0.08 0.99 0.02 0.06 0.99 0.01 0.58 0.08 0.99 0.02 0.56 0.06 1.00 0.05
RC3 0.04 0.12 0.99 -0.04 0.05 0.99 0.50 0.04 0.12 0.99 0.50 0.00 0.05 1.00
31
5) Extracting factors as long as they are interpretable.
6) Using the Very Structure Criterion (vss) (Revelle and Rocklin, 1979).
7) Using Wayne Velicer’s Minimum Average Partial (MAP) criterion (Velicer, 1976).
8) Extracting principal components until the eigen value < 1.
Each of the procedures has its advantages and disadvantages. Using either the chi square test or the
change in square test is, of course, sensitive to the number of subjects and leads to the nonsensical
condition that if one wants to find many factors, one simply runs more subjects. Parallel analysis is
partially sensitive to sample size in that for large samples the eigen values of random factors will
all tend towards 1. The scree test is quite appealing but can lead to differences of interpretation
as to when the scree “breaks". Extracting interpretable factors means that the number of factors
reflects the investigators creativity more than the data. vss, while very simple to understand, will
not work very well if the data are very factorially complex. (Simulations suggests it will work fine
if the complexities of some of the items are no more than 2). The eigen value of 1 rule, although
the default for many programs, seems to be a rough way of dividing the number of variables by 3
and is probably the worst of all criteria.
An additional problem in determining the number of factors is what is considered a factor. Many
treatments of factor analysis assume that the residual correlation matrix after the factors of interest
are extracted is composed of just random error. An alternative concept is that the matrix is formed
from major factors of interest but that there are also numerous minor factors of no substantive
interest but that account for some of the shared covariance between variables. The presence of
such minor factors can lead one to extract too many factors and to reject solutions on statistical
grounds of misfit that are actually very good fits to the data. This problem is partially addressed
later in the discussion of simulating complex structures using sim.structure and of small
extraneous factors using the sim.minor function.
32
> vss <- vss(bfi[1:25],title="Very Simple Structure of a Big 5 inventory")
4 4
0.8
4
3 4
4
3 3 3 3
2 2
Very Simple Structure Fit
3
2 2 2
2
2
0.6
1
1 1
1 1
1 1
1
0.4
0.2
0.0
1 2 3 4 5 6 7 8
Number of Factors
Figure 9: The Very Simple Structure criterion for the number of factors compares solutions for
various levels of item complexity and various numbers of factors. For the Big 5 Inventory, the
complexity 1 and 2 solutions both achieve their maxima at four factors. This is in contrast to
parallel analysis which suggests 6 and the MAP criterion which suggests 5.
33
The Velicer MAP achieves a minimum of 0.01 with 5 factors
BIC achieves a minimum of -513.09 with 8 factors
Sample Size adjusted BIC achieves a minimum of -106.39 with 8 factors
34
> fa.parallel(bfi[1:25],main="Parallel Analysis of a Big 5 inventory")
Parallel analysis suggests that the number of factors = 6 and the number of components = 6
PC Actual Data
PC Simulated Data
PC Resampled Data
FA Actual Data
4
FA Simulated Data
FA Resampled Data
3
2
1
0
5 10 15 20 25
Factor/Component Number
Figure 10: Parallel analysis compares factor and principal components solutions to the real data as
well as resampled data. Although vss suggests 4 factors, MAP 5, parallel analysis suggests 6. One
more demonstration of Kaiser’s dictum.
35
> v16 <- sim.item(16)
> s <- c(1,3,5,7,9,11,13,15)
> f2 <- fa(v16[,s],2)
> fe <- fa.extension(cor(v16)[s,-s],f2)
> fa.diagram(f2,fe=fe)
Factor analysis and extension
V15 V14
−0.6 −0.6
V5 V16
0.6 −0.6
0.6 0.6
V7 V8
V1 V2
0.6 0.6
0.6 0.6
V3 V4
−0.5 −0.6
V9 V12
Figure 11: Factor extension applies factors from one set (those on the left) to another set of variables
(those on the right). fa.extension is particularly useful when one wants to define the factors
with one set of variables and then apply those factors to another set. fa.diagram is used to show
the structure.
36
4.7 Exploratory Structural Equation Modeling (ESEM)
Generaizing the procedures of factor extension, we can do Exploratory Structural Equation Mod-
eling (ESEM). Traditional Exploratory Factor Analysis (EFA) examines how latent variables can
account for the correlations within a data set. All loadings and cross loadings are found and rota-
tion is done to some approximation of simple structure. Traditional Confirmatory Factor Analysis
(CFA) tests such models by fitting just a limited number of loadings and typically does not allow
any (or many) cross loadings. Structural Equation Modeling then applies two such measurement
models, one to a set of X variables, another to a set of Y variables, and then tries to estimate the
correlation between these two sets of latent variables. (Some SEM procedures estimate all the pa-
rameters from the same model, thus making the loadings in set Y affect those in set X.) It is possible
to do a similar, exploratory modeling (ESEM) by conducting two Exploratory Factor Analyses, one
in set X, one in set Y, and then finding the correlations of the X factors with the Y factors, as well as
the correlations of the Y variables with the X factors and the X variables with the Y factors.
Consider the simulated data set of three ability variables, two motivational variables, and three
outcome variables:
Call: sim.structural(fx = fx, Phi = Phi, fy = fy)
37
X1 X2
V 0.91 -0.06
Q 0.81 -0.05
A 0.53 0.57
nach -0.10 0.81
Anx 0.08 -0.71
The degrees of freedom for the null model are 56 and the empirical chi square
The degrees of freedom for the model are 7 and the empirical chi square functio
with prob < 0.0027
RMSEA index = 0.046 and the 90 % confidence intervals are 0.025 0.069
Empirical BIC = -26.53
ESABIC = -4.29
Fit based upon off diagonal values = 1
To see the item loadings for the X and Y sets combined, and the associated fa ou
38
Exploratory Structural Model
V
0.9 gpa
Q 0.8 X1
0.6
0.7
A Y1
0.6 0.7 0.5
Pre
−0.7
Anx MA
39
α (Cronbach, 1951) is the same as Guttman’s λ 3 (Guttman, 1945) and may be found by
n tr(~V )x n Vx − tr(~Vx )
λ3 = 1− = =α
n−1 Vx n−1 Vx
Perhaps because it is so easy to calculate and is available in most commercial programs, alpha is
without doubt the most frequently reported measure of internal consistency reliability. Alpha is
the mean of all possible spit half reliabilities (corrected for test length). For a unifactorial test, it
is a reasonable estimate of the first factor saturation, although if the test has any microstructure
(i.e., if it is “lumpy") coefficients β (Revelle, 1979) (see iclust) and ωh (see omega) are more
appropriate estimates of the general factor saturation. ωt is a better estimate of the reliability of the
total test.
Guttman’s λ6 (G6) considers the amount of variance in each item that can be accounted for the lin-
ear regression of all of the other items (the squared multiple correlation or smc), or more precisely,
the variance of the errors, e2j , and is
∑ e2j 2 )
∑(1 − rsmc
λ6 = 1 − = 1− .
Vx Vx
The squared multiple correlation is a lower bound for the item communality and as the number of
items increases, becomes a better estimate.
G6 is also sensitive to lumpiness in the test and should not be taken as a measure of unifactorial
structure. For lumpy tests, it will be greater than alpha. For tests with equal item loadings, alpha
> G6, but if the loadings are unequal or if there is a general factor, G6 > alpha. G6 estimates item
reliability by the squared multiple correlation of the other items in a scale. A modification of G6,
G6*, takes as an estimate of an item reliability the smc with all the items in an inventory, including
those not keyed for a particular scale. This will lead to a better estimate of the reliable variance of
a particular item.
Alpha, G6 and G6* are positive functions of the number of items in a test as well as the average
intercorrelation of the items in the test. When calculated from the item variances and total test
variance, as is done here, raw alpha is sensitive to differences in the item variances. Standardized
alpha is based upon the correlations rather than the covariances.
More complete reliability analyses of a single scale can be done using the omega function which
finds ωh and ωt based upon a hierarchical factor analysis.
Alternative functions scoreItems and cluster.cor will also score multiple scales and report
more useful statistics. “Standardized" alpha is calculated from the inter-item correlations and will
differ from raw alpha.
Functions for examining the reliability of a single scale or a set of scales include:
40
alpha Internal consistency measures of reliability range from ωh to α to ωt . The alpha function
reports two estimates: Cronbach’s coefficient α and Guttman’s λ6 . Also reported are item -
whole correlations, α if an item is omitted, and item means and standard deviations.
guttman Eight alternative estimates of test reliability include the six discussed by Guttman (1945),
four discussed by ten Berge and Zergers (1978) (µ0 . . . µ3 ) as well as β (the worst split half,
Revelle, 1979), the glb (greatest lowest bound) discussed by Bentler and Woodward (1980),
and ωh andωt ((McDonald, 1999; Zinbarg et al., 2005).
omega Calculate McDonald’s omega estimates of general and total factor saturation. (Revelle and
Zinbarg (2009) compare these coefficients with real and artificial data sets.)
cluster.cor Given a n x c cluster definition matrix of -1s, 0s, and 1s (the keys) , and a n x n
correlation matrix, find the correlations of the composite clusters.
scoreItems Given a matrix or data.frame of k keys for m items (-1, 0, 1), and a matrix or data.frame
of items scores for m items and n people, find the sum scores or average scores for each per-
son and each scale. If the input is a square matrix, then it is assumed that correlations or
covariances were used, and the raw scores are not available. In addition, report Cronbach’s
alpha, coefficient G6*, the average r, the scale intercorrelations, and the item by scale cor-
relations (both raw and corrected for item overlap and scale reliability). Replace missing
values with the item median or mean if desired. Will adjust scores for reverse scored items.
score.multiple.choice Ability tests are typically multiple choice with one right answer. score.multiple.choice
takes a scoring key and a data matrix (or data.frame) and finds total or average number right
for each participant. Basic test statistics (alpha, average r, item means, item-whole correla-
tions) are also reported.
splitHalf Given a set of items, consider all (if n.items < 17) or 10,000 random splits of the item
into two sets. The correlation between these two split halfs is then adjusted by the Spearman-
Brown prophecy formula to show the range of split half reliablities.
V1 V2 V3 V4 V5 V6 V7 V8 V9
V1 1.00 0.58 0.47 0.44 0.36 0.31 0.30 0.17 0.13
V2 0.58 1.00 0.36 0.39 0.26 0.26 0.30 0.24 0.15
41
V3 0.47 0.36 1.00 0.32 0.34 0.26 0.28 0.17 0.15
V4 0.44 0.39 0.32 1.00 0.45 0.41 0.31 0.17 0.16
V5 0.36 0.26 0.34 0.45 1.00 0.34 0.22 0.13 0.21
V6 0.31 0.26 0.26 0.41 0.34 1.00 0.17 0.10 0.12
V7 0.30 0.30 0.28 0.31 0.22 0.17 1.00 0.39 0.30
V8 0.17 0.24 0.17 0.17 0.13 0.10 0.39 1.00 0.22
V9 0.13 0.15 0.15 0.16 0.21 0.12 0.30 0.22 1.00
> alpha(r9)
Reliability analysis
Call: alpha(x = r9)
Item statistics
n raw.r std.r r.cor r.drop mean sd
V1 500 0.70 0.70 0.68 0.58 0.0247 0.98
V2 500 0.66 0.66 0.62 0.53 -0.0022 0.98
V3 500 0.62 0.62 0.55 0.49 -0.1027 0.93
V4 500 0.69 0.68 0.64 0.56 -0.0661 1.05
V5 500 0.61 0.62 0.55 0.48 -0.0622 0.98
V6 500 0.55 0.55 0.46 0.40 -0.0163 0.99
V7 500 0.61 0.61 0.54 0.47 0.0706 1.01
V8 500 0.49 0.48 0.37 0.32 0.0134 1.02
V9 500 0.45 0.45 0.33 0.29 0.0247 0.96
Some scales have items that need to be reversed before being scored. Rather than reversing the
items in the raw data, it is more convenient to just specify which items need to be reversed scored.
This may be done in alpha by specifying a keys vector of 1s and -1s. (This concept of keys
vector is more useful when scoring multiple scale inventories, see below.) As an example, consider
scoring the 7 attitude items in the attitude data set. Assume a conceptual mistake in that items 2
and 6 (complaints and critical) are to be scored (incorrectly) negatively.
> alpha(attitude,keys=c("complaints","critical"))
Reliability analysis
Call: alpha(x = attitude, keys = c("complaints", "critical"))
42
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.18 0.27 0.66 0.05 0.37 0.19 53 4.7 0.16
Item statistics
n raw.r std.r r.cor r.drop mean sd
rating 30 0.600 0.601 0.63 0.28 65 12.2
complaints- 30 -0.542 -0.559 -0.78 -0.75 50 13.3
privileges 30 0.679 0.663 0.57 0.39 53 12.2
learning 30 0.857 0.853 0.90 0.70 56 11.7
raises 30 0.719 0.730 0.77 0.50 65 10.4
critical- 30 0.015 0.036 -0.29 -0.27 42 9.9
advance 30 0.688 0.694 0.66 0.46 43 10.3
>
Note how the reliability of the 7 item scales with an incorrectly reversed item is very poor, but if
items 2 and 6 is dropped then the reliability is improved substantially. This suggests that items 2
and 6 were incorrectly scored. Doing the analysis again with the items positively scored produces
much more favorable results.
> alpha(attitude)
Reliability analysis
Call: alpha(x = attitude)
43
Item statistics
n raw.r std.r r.cor r.drop mean sd
rating 30 0.78 0.76 0.75 0.67 65 12.2
complaints 30 0.84 0.81 0.82 0.74 67 13.3
privileges 30 0.70 0.68 0.60 0.56 53 12.2
learning 30 0.81 0.80 0.78 0.71 56 11.7
raises 30 0.85 0.86 0.85 0.79 65 10.4
critical 30 0.42 0.45 0.31 0.27 75 9.9
advance 30 0.60 0.62 0.56 0.46 43 10.3
It is useful when considering items for a potential scale to examine the item distribution. This is
done in scoreItems as well as in alpha.
> items <- sim.congeneric(N=500,short=FALSE,low=-2,high=2,categorical=TRUE) #500 responses to 4 discrete item
> alpha(items$observed) #item response analysis of congeneric measures
Reliability analysis
Call: alpha(x = items$observed)
Item statistics
n raw.r std.r r.cor r.drop mean sd
V1 500 0.79 0.79 0.71 0.59 0.066 1.02
V2 500 0.77 0.77 0.68 0.56 0.098 1.01
V3 500 0.69 0.70 0.52 0.44 0.022 0.98
V4 500 0.66 0.65 0.44 0.38 0.130 1.06
44
McDonald has proposed coefficient omega (hierarchical) (ωh ) as an estimate of the general factor
saturation of a test. Zinbarg et al. (2005) https://personality-project.org/revelle/
publications/zinbarg.revelle.pmet.05.pdf compare McDonald’s ωh to Cronbach’s
α and Revelle’s β . They conclude that ωh is the best estimate. (See also Zinbarg et al. (2006) and
Revelle and Zinbarg (2009) https://personality-project.org/revelle/publications/
revelle.zinbarg.08.pdf ).
One way to find ωh is to do a factor analysis of the original data set, rotate the factors obliquely,
factor that correlation matrix, do a Schmid-Leiman (schmid) transformation to find general factor
loadings, and then find ωh .
ωh differs slightly as a function of how the factors are estimated. Four options are available, the
default will do a minimum residual factor analysis, fm=“pa" does a principal axes factor analysis
(factor.pa), fm=“mle" uses the factanal function, and fm=“pc" does a principal components
analysis (principal).
For ability items, it is typically the case that all items will have positive loadings on the general
factor. However, for non-cognitive items it is frequently the case that some items are to be scored
positively, and some negatively. Although probably better to specify which directions the items
are to be scored by specifying a key vector, if flip =TRUE (the default), items will be reversed so
that they have positive loadings on the general factor. The keys are reported so that scores can be
found using the scoreItems function. Arbitrarily reversing items this way can overestimate the
general factor. (See the example with a simulated circumplex).
β , an alternative to ω , is defined as the worst split half reliability. It can be estimated by us-
ing iclust (Item Cluster analysis: a hierarchical clustering algorithm). For a very complimen-
tary review of why the iclust algorithm is useful in scale construction, see Cooksey and Soutar
(2006).
The omega function uses exploratory factor analysis to estimate the ωh coefficient. It is important
to remember that “A recommendation that should be heeded, regardless of the method chosen to
estimate ωh , is to always examine the pattern of the estimated general factor loadings prior to esti-
mating ωh . Such an examination constitutes an informal test of the assumption that there is a latent
variable common to all of the scale’s indicators that can be conducted even in the context of EFA. If
the loadings were salient for only a relatively small subset of the indicators, this would suggest that
there is no true general factor underlying the covariance matrix. Just such an informal assumption
test would have afforded a great deal of protection against the possibility of misinterpreting the
misleading ωh estimates occasionally produced in the simulations reported here." (Zinbarg et al.,
2006, p 137).
Although ωh is uniquely defined only for cases where 3 or more subfactors are extracted, it is
sometimes desired to have a two factor solution. By default this is done by forcing the schmid
extraction to treat the two subfactors as having equal loadings.
45
There are three possible options for this condition: setting the general factor loadings between the
√
two lower order factors to be “equal" which will be the rab where rab is the oblique correlation
between the factors) or to “first" or “second" in which case the general factor is equated with either
the first or second group factor. A message is issued suggesting that the model is not really well
defined. This solution discussed in Zinbarg et al., 2007. To do this in omega, add the option=“first"
or option=“second" to the call.
Although obviously not meaningful for a 1 factor solution, it is of course possible to find the sum
of the loadings on the first (and only) factor, square them, and compare them to the overall matrix
variance. This is done, with appropriate complaints.
In addition to ωh , another of McDonald’s coefficients is ωt . This is an estimate of the total reliability
of a test.
McDonald’s ωt , which is similar to Guttman’s λ6 , (see guttman) uses the estimates of uniqueness
u2 from factor analysis to find e2j . This is based on a decomposition of the variance of a test score,
Vx into four parts: that due to a general factor, ~g, that due to a set of group factors, ~f , (factors
common to some but not all of the items), specific factors, ~s unique to each item, and ~e, random
error. (Because specific variance can not be distinguished from random error unless the test is given
at least twice, some combine these both into error).
Letting ~x = c~g + A~ f + Ds~ +~e then the communality of item j , based upon general as well as group
factors, h j = c j + ∑ fi j and the unique variance for the item u2j = σ 2j (1−h2j ) may be used to estimate
2 2 2
the test reliability. That is, if h2j is the communality of item j , based upon general as well as group
factors, then for standardized items, e2j = 1 − h2j and
~ 0~1 +~1AA
~1cc ~ 0~10 ∑(1 − h2j ) ∑ u2
ωt = = 1− = 1−
Vx Vx Vx
It is important to distinguish here between the two ω coefficients of McDonald, 1978 and Equa-
tion 6.20a of McDonald, 1999, ωt and ωh . While the former is based upon the sum of squared
loadings on all the factors, the latter is based upon the sum of the squared loadings on the general
factor.
~ 0~1
~1cc
ωh =
Vx
Another estimate reported is the omega for an infinite length test with a structure similar to the
observed test. This is found by
~ 0~1
~1cc
ωinf =
~ 0~1 +~1AA
~1cc ~ 0~10
46
> om.9 <- omega(r9,title="9 simulated variables")
9 simulated variables
V1
0.5
0.7 V2
0.4
F1*
0.6 0.2
V3
0.5
V5
0.5 0.4
0.4 0.3
V6
0.4
V7
0.3 0.6
F3*
0.5
0.3 V8
0.3
V9
Figure 13: A bifactor solution for 9 simulated variables with a hierarchical structure.
47
In the case of these simulated 9 variables, the amount of variance attributable to a general factor
(ωh ) is quite large, and the reliability of the set of 9 items is somewhat greater than that estimated
by α or λ6 .
> om.9
9 simulated variables
Call: omegah(m = m, nfactors = nfactors, fm = fm, key = key, flip = flip,
digits = digits, title = title, sl = sl, labels = labels,
plot = plot, n.obs = n.obs, rotate = rotate, Phi = Phi, option = option,
covar = covar)
Alpha: 0.77
G.6: 0.78
Omega Hierarchical: 0.64
Omega H asymptotic: 0.78
Omega Total 0.82
Compare this with the adequacy of just a general factor and no group factors
The degrees of freedom for just the general factor are 27 and the fit is 0.37
The number of observations was 500 with Chi Square = 184.27 with prob < 2.3e-25
The root mean square of the residuals is 0.09
The df corrected root mean square of the residuals is 0.1
RMSEA index = 0.108 and the 10 % confidence intervals are 0.094 0.123
BIC = 16.48
48
Total, General and Subset omega for each subset
g F1* F2* F3*
Omega total for total scores and subscales 0.82 0.74 0.67 0.59
Omega general for total scores and subscales 0.64 0.53 0.46 0.20
Omega group for total scores and subscales 0.15 0.22 0.22 0.39
Compare this with the adequacy of just a general factor and no group factors
49
The degrees of freedom for just the general factor are 27 and the fit is 0.37
The number of observations was 500 with Chi Square = 184.27 with prob < 2.3e-25
The root mean square of the residuals is 0.09
The df corrected root mean square of the residuals is 0.1
RMSEA index = 0.108 and the 10 % confidence intervals are 0.094 0.123
BIC = 16.48
The degrees of freedom of the confirmatory model are 18 and the fit is 25.42543 with p = 0.1136393
general/max 1.55 max/min = 3.86
mean percent general = 0.58 with sd = 0.28 and cv of 0.48
Explained Common Variance of the general factor = 0.48
To get the standard sem fit statistics, ask for summary on the fitted object
50
5.3.1 Other estimates of reliability
Other estimates of reliability are found by the splitHalf and guttman functions. These are
described in more detail in Revelle and Zinbarg (2009) and in Revelle and Condon (2018). They
include the 6 estimates from Guttman, four from TenBerge, and an estimate of the greatest lower
bound.
> splitHalf(r9)
51
> #These two approaches can be mixed if desired
> keys.list <- list(agree=c("-A1","A2","A3","A4","A5"),conscientious=c("C1","C2","C3","-C4","-C5"),
+ extraversion=c("-E1","-E2","E3","E4","E5"),
+ neuroticism=c(16:20),openness = c(21,-22,23,24,-25))
> keys.list
$agree
[1] "-A1" "A2" "A3" "A4" "A5"
$conscientious
[1] "C1" "C2" "C3" "-C4" "-C5"
$extraversion
[1] "-E1" "-E2" "E3" "E4" "E5"
$neuroticism
[1] 16 17 18 19 20
$openness
[1] 21 -22 23 24 -25
In the past (prior to version 1.6.9, the keys.list was then converted a keys matrix using the helper function make.keys. This is no longer necessary. Logically, scales are merely
the weighted composites of a set of items. The weights used are -1, 0, and 1. 0 implies do not use that item in the scale, 1 implies a positive weight (add the item to the total score),
-1 a negative weight (subtract the item from the total score, i.e., reverse score the item). Reverse scoring an item is equivalent to subtracting the item from the maximum + minimum
possible value for that item. The minima and maxima can be estimated from all the items, or can be specified by the user.
There are two different ways that scale scores tend to be reported. Social psychologists and educational psychologists tend to report the scale score as the average item score while
many personality psychologists tend to report the total item score. The default option for scoreItems is to report item averages (which thus allows interpretation in the same
metric as the items) but totals can be found as well. Personality researchers should be encouraged to report scores based upon item means and avoid using the total score although
some reviewers are adamant about the following the tradition of total scores.
The printed output includes coefficients α and G6*, the average correlation of the items within the scale (corrected for item ovelap and scale relliability), as well as the correlations
between the scales (below the diagonal, the correlations above the diagonal are corrected for attenuation. As is the case for most of the psych functions, additional information is
returned as part of the object.
First, create keys matrix using the make.keys function. (The keys matrix could also be prepared externally using a spreadsheet and then copying it into R). Although not normally
necessary, show the keys to understand what is happening. There are two ways to make up the keys. You can specify the items by location (the old way) or by name (the newer and
probably preferred way). To use the newer way you must specify the file on which you will use the keys. The example below shows how to construct keys either way.
Note that the number of items to specify in the make.keys function is the total number of items in the inventory. This is done automatically in the new way of forming keys, but
if using the older way, the number must be specified. That is, if scoring just 5 items from a 25 item inventory, make.keys should be told that there are 25 items. make.keys
just changes a list of items on each scale to make up a scoring matrix. Because the bfi data set has 25 items as well as 3 demographic items, the number of variables is specified
as 28.
(Unstandardized) Alpha:
agree conscientious extraversion neuroticism openness
alpha 0.7 0.72 0.76 0.81 0.6
52
0.34 0.34 0.38 0.41 0.22
Guttman 6* reliability:
agree conscientious extraversion neuroticism openness
Lambda.6 0.7 0.72 0.76 0.81 0.6
Average adjusted item x scale correlations within and between scales (MIMT)
agree cnscn extrv nrtcs opnns
agree 0.68
conscientious 0.18 0.69
extraversion 0.33 0.19 0.71
neuroticism -0.14 -0.18 -0.17 0.76
openness 0.10 0.12 0.14 -0.05 0.62
In order to see the item by scale loadings and frequency counts of the data
print with the short option = FALSE
To see the additional information (the raw correlations, the individual scores, etc.), they may be
specified by name. Then, to visualize the correlations between the raw scores, use the pairs.panels
function on the scores values of scores. (See figure 14
53
> png('scores.png')
> pairs.panels(scores$scores,pch='.',jiggle=TRUE)
> dev.off()
pdf
2
Figure 14: A graphic analysis of the Big Five scales found by using the scoreItems function. The
pair.wise plot allows us to see that some participants have reached the ceiling of the scale for these
5 items scales. Using the pch=’.’ option in pairs.panels is recommended when plotting many cases.
The data points were “jittered” by setting jiggle=TRUE. Jiggling this way shows the density more
clearly. To save space, the figure was done as a png. For a clearer figure, save as a pdf.
54
> scales <- scoreItems(keys.list,r.bfi)
> summary(scales)
Call: NULL
To find the correlations of the items with each of the scales (the “structure" matrix) or the correla-
tions of the items controlling for the other scales (the “pattern" matrix), use the cluster.loadings
function. To do both at once (e.g., the correlations of the scales as well as the item by scale corre-
lations), it is also possible to just use scoreItems.
(Unstandardized) Alpha:
[1] 0.84
item statistics
key 0 1 2 3 4 5 6 7 8 miss r n mean sd
reason.4 4 0.05 0.05 0.11 0.10 0.64 0.03 0.02 0.00 0.00 0 0.59 1523 0.64 0.48
reason.16 4 0.04 0.06 0.08 0.10 0.70 0.01 0.00 0.00 0.00 0 0.53 1524 0.70 0.46
reason.17 4 0.05 0.03 0.05 0.03 0.70 0.03 0.11 0.00 0.00 0 0.59 1523 0.70 0.46
reason.19 6 0.04 0.02 0.13 0.03 0.06 0.10 0.62 0.00 0.00 0 0.56 1523 0.62 0.49
letter.7 6 0.05 0.01 0.05 0.03 0.11 0.14 0.60 0.00 0.00 0 0.58 1524 0.60 0.49
letter.33 3 0.06 0.10 0.13 0.57 0.04 0.09 0.02 0.00 0.00 0 0.56 1523 0.57 0.50
letter.34 4 0.04 0.09 0.07 0.11 0.61 0.05 0.02 0.00 0.00 0 0.59 1523 0.61 0.49
letter.58 4 0.06 0.14 0.09 0.09 0.44 0.16 0.01 0.00 0.00 0 0.58 1525 0.44 0.50
55
matrix.45 5 0.04 0.01 0.06 0.14 0.18 0.53 0.04 0.00 0.00 0 0.51 1523 0.53 0.50
matrix.46 2 0.04 0.12 0.55 0.07 0.11 0.06 0.05 0.00 0.00 0 0.52 1524 0.55 0.50
matrix.47 2 0.04 0.05 0.61 0.07 0.11 0.06 0.06 0.00 0.00 0 0.55 1523 0.61 0.49
matrix.55 4 0.04 0.02 0.18 0.14 0.37 0.07 0.18 0.00 0.00 0 0.45 1524 0.37 0.48
rotate.3 3 0.04 0.03 0.04 0.19 0.22 0.15 0.05 0.12 0.15 0 0.51 1523 0.19 0.40
rotate.4 2 0.04 0.03 0.21 0.05 0.18 0.04 0.04 0.25 0.15 0 0.56 1523 0.21 0.41
rotate.6 6 0.04 0.22 0.02 0.05 0.14 0.05 0.30 0.04 0.14 0 0.55 1523 0.30 0.46
rotate.8 7 0.04 0.03 0.21 0.07 0.16 0.05 0.13 0.19 0.13 0 0.48 1524 0.19 0.39
vars n mean sd median trimmed mad min max range skew kurtosis se
reason.4 1 1523 0.64 0.48 1 0.68 0 0 1 1 -0.58 -1.66 0.01
reason.16 2 1524 0.70 0.46 1 0.75 0 0 1 1 -0.86 -1.26 0.01
reason.17 3 1523 0.70 0.46 1 0.75 0 0 1 1 -0.86 -1.26 0.01
reason.19 4 1523 0.62 0.49 1 0.64 0 0 1 1 -0.47 -1.78 0.01
letter.7 5 1524 0.60 0.49 1 0.62 0 0 1 1 -0.41 -1.84 0.01
letter.33 6 1523 0.57 0.50 1 0.59 0 0 1 1 -0.29 -1.92 0.01
letter.34 7 1523 0.61 0.49 1 0.64 0 0 1 1 -0.46 -1.79 0.01
letter.58 8 1525 0.44 0.50 0 0.43 0 0 1 1 0.23 -1.95 0.01
matrix.45 9 1523 0.53 0.50 1 0.53 0 0 1 1 -0.10 -1.99 0.01
matrix.46 10 1524 0.55 0.50 1 0.56 0 0 1 1 -0.20 -1.96 0.01
matrix.47 11 1523 0.61 0.49 1 0.64 0 0 1 1 -0.47 -1.78 0.01
matrix.55 12 1524 0.37 0.48 0 0.34 0 0 1 1 0.52 -1.73 0.01
rotate.3 13 1523 0.19 0.40 0 0.12 0 0 1 1 1.55 0.40 0.01
rotate.4 14 1523 0.21 0.41 0 0.14 0 0 1 1 1.40 -0.03 0.01
rotate.6 15 1523 0.30 0.46 0 0.25 0 0 1 1 0.88 -1.24 0.01
rotate.8 16 1524 0.19 0.39 0 0.11 0 0 1 1 1.62 0.63 0.01
Once the items have been scored as true or false (assigned scores of 1 or 0), they made then be
scored into multiple scales using the normal scoreItems function.
56
> data(iqitems)
> iq.keys <- c(4,4,4, 6,6,3,4,4, 5,2,2,4, 3,2,6,7)
> scores <- score.multiple.choice(iq.keys,iqitems,score=TRUE,short=FALSE)
> #note that for speed we can just do this on simple item counts rather than IRT based scores.
> op <- par(mfrow=c(2,2)) #set this to see the output for multiple items
> irt.responses(scores$scores,iqitems[1:4],breaks=11)
reason.4 reason.16
0 2 4 0 2 4
0.8
0.8
1 3 5 1 3 5
P(response)
P(response)
0.4
0.4
0.0
0.0
0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0
theta theta
reason.17 reason.19
0 2 4 0 2 4
0.8
0.8
1 3 5 1 3 5
P(response)
P(response)
0.4
0.4
0.0
0.0
0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0
theta theta
Figure 15: The pattern of responses to multiple choice ability items can show that some items
have poor distractors. This may be done by using the the irt.responses function. A good
distractor is one that is negatively related to ability.
57
5.6.1 Exploring the item structure of scales
The Big Five scales found above can be understood in terms of the item - whole correlations, but
it is also useful to think of the endorsement frequency of the items. The item.lookup function
will sort items by their factor loading/item-whole correlation, and then resort those above a certain
threshold in terms of the item means. Item content is shown by using the dictionary developed
for those items. This allows one to see the structure of each scale in terms of its endorsement
range. This is a simple way of thinking of items that is also possible to do using the various IRT
approaches discussed later.
> m <- colMeans(bfi,na.rm=TRUE)
> item.lookup(scales$item.corrected[,1:3],m,dictionary=bfi.dictionary[1:2])
58
gender ItemLabel Item Giant3
N5 0.21 q_1505 Panic easily. Stability
A2 0.18 q_1162 Inquire about others' well-being. Cohesion
A1 -0.16 q_146 Am indifferent to the feelings of others. Cohesion
A3 0.14 q_1206 Know how to comfort others. Cohesion
A4 0.13 q_1364 Love children. Cohesion
E1 -0.13 q_712 Don't talk a lot. Plasticity
N3 0.12 q_1099 Have frequent mood swings. Stability
O1 -0.10 q_128 Am full of ideas. Plasticity
A5 0.10 q_1419 Make people feel at ease. Cohesion
$education
education ItemLabel Item Giant3
A1 -0.14 q_146 Am indifferent to the feelings of others. Cohesion
$age
age ItemLabel Item Giant3
A1 -0.16 q_146 Am indifferent to the feelings of others. Cohesion
C4 -0.15 q_626 Do things in a half-way manner. Stability
A4 0.14 q_1364 Love children. Cohesion
A5 0.13 q_1419 Make people feel at ease. Cohesion
E5 0.11 q_1768 Take charge. Plasticity
A2 0.11 q_1162 Inquire about others' well-being. Cohesion
N3 -0.11 q_1099 Have frequent mood swings. Stability
E2 -0.11 q_901 Find it difficult to approach others. Plasticity
N5 -0.10 q_1505 Panic easily. Stability
N2 -0.10 q_974 Get irritated easily. Stability
Dτ λj
δj = q , αj = q (2)
1 − λ j2 1 − λ j2
59
where D is a scaling factor used when converting to the parameterization of logistic model and is
1.702 in that case and 1 in the case of the normal ogive model. Thus, in the case of the normal
model, factor loadings (λ j ) and item thresholds (τ ) are just
αj δj
λj = q , τj = q .
1 + α 2j 1 + α 2j
Consider 9 dichotomous items representing one factor but differing in their levels of difficulty
> set.seed(17)
> d9 <- sim.irt(9,1000,-2.0,2.0,mod="normal") #dichotomous items
> test <- irt.fa(d9$items,correct=0)
> test
Factor analysis with Call: fa(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate,
fm = fm)
Similar analyses can be done for polytomous items such as those of the bfi extraversion scale:
60
> op <- par(mfrow=c(3,1))
> plot(test,type="ICC")
> plot(test,type="IIC")
> plot(test,type="test")
> op <- par(mfrow=c(1,1))
0.8
V1 V2 V3 V4 V5 V6 V7 V8 V9
0.4
0.0
−3 −2 −1 0 1 2 3
V1
Item Information
V9
1.0
V5
V4 V6 V7 V8
V3
V2
0.0
−3 −2 −1 0 1 2 3
3.0
Reliability
0.6
1.5
−0.2
0.0
−3 −2 −1 0 1 2 3
Figure 16: A graphic analysis of 9 dichotomous (simulated) items. The top panel shows the prob-
ability of item endorsement as the value of the latent trait increases. Items differ in their location
(difficulty) and discrimination (slope). The middle panel shows the information in each item as
a function of latent trait level. An item is most informative when the probability of endorsement
is 50%. The lower panel shows the total test information. These items form a test that is most
informative (most accurate) at the middle range of the latent trait.
61
> data(bfi)
> e.irt <- irt.fa(bfi[11:15])
> e.irt
Factor analysis with Call: fa(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate,
fm = fm)
The item information functions show that not all of items are equally good (Figure 17):
These procedures can be generalized to more than one factor by specifying the number of factors
in irt.fa. The plots can be limited to those items with discriminations greater than some value
of cut. An invisible object is returned when plotting the output from irt.fa that includes the
average information for each item that has loadings greater than cut.
> print(e.info,sort=TRUE)
62
> e.info <- plot(e.irt,type="IIC")
−E2
1.2
E4
1.0
0.8
Item Information
−E1
E3
0.6
E5
0.4
0.2
0.0
−3 −2 −1 0 1 2 3
Figure 17: A graphic analysis of 5 extraversion items from the bfi. The curves represent the amount
of information in the item as a function of the latent score for an individual. That is, each item is
maximally discriminating at a different part of the latent continuum. Print e.info to see the average
information for each item.
63
More extensive IRT packages include the ltm and eRm and should be used for serious Item Re-
sponse Theory analysis.
> iq.irt
64
> iq.irt <- irt.fa(ability)
rotate.4
0.8
reason.17
reason.4
rotate.3
rotate.6
0.6
Item Information
letter.34
letter.58
letter.7 rotate.8
reason.19
letter.33
reason.16
matrix.47
0.4
matrix.46
matrix.45
0.2
matrix.55
0.0
−3 −2 −1 0 1 2 3
Figure 18: A graphic analysis of 16 ability items sampled from the SAPA project. The curves
represent the amount of information in the item as a function of the latent score for an individual.
That is, each item is maximally discriminating at a different part of the latent continuum. Print
iq.irt to see the average information for each item. Partly because this is a power test (it is given
on the web) and partly because the items have not been carefully chosen, the items are not very
discriminating at the high end of the ability dimension.
65
> plot(iq.irt,type='test')
0.84
6
5
0.78
4
Test Information
Reliability
0.67
3
2
0.34
1
0
−3 −2 −1 0 1 2 3
Figure 19: A graphic analysis of 16 ability items sampled from the SAPA project. The total test
information at all levels of difficulty may be shown by specifying the type=’test’ option in the plot
function.
66
rotate.8 0.01 0.02 0.09 0.28 0.51 0.35 0.12
Test Info 0.66 2.17 5.03 6.03 4.93 2.35 0.68
SEM 1.23 0.68 0.45 0.41 0.45 0.65 1.22
Reliability -0.52 0.54 0.80 0.83 0.80 0.57 -0.48
Factor analysis with Call: fa(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate,
fm = fm)
67
> om <- omega(iq.irt$rho,4)
Omega
rotate.3
rotate.4 0.7
0.6 0.6
rotate.8 0.6
0.6 F1*
0.5
rotate.6
0.5
0.6 letter.34
0.5
0.6 letter.7 0.5
0.6 F2*
letter.33 0.4
0.6
0.3
0.6 letter.58
g
0.5 matrix.47
0.7
reason.17 0.6 F3*
0.6 0.3
0.6 reason.4 0.2
0.2
0.5 reason.19
0.5
reason.16
0.5 F4*
0.4 matrix.45 0.8
0.3
matrix.46
matrix.55
Figure 20: An Omega analysis of 16 ability items sampled from the SAPA project. The items rep-
resent a general factor as well as four lower level factors. The analysis is done using the tetrachoric
correlations found in the previous irt.fa analysis. The four matrix items have some serious
problems, which may be seen later when examine the item response functions.
68
These results are seen in Figure 21.
Figure 21: IRT based scoring and total test scores for 1000 simulated subjects. True theta values
are reported and then the IRT and total scoring systems.
> pairs.panels(scores.df,pch='.',gap=0)
> title('Comparing true theta for IRT, Rasch and classically based scoring',li
Comparing true theta for IRT, Rasch and classically based scoring
−2 0 1 2 0.4 0.8 1.2 0.0 0.4 0.8
True theta
2
0.83 0.40 0.05 0.55 0.40 −0.19
0
−3
0 1 2
irt theta
0.50 0.07 0.68 0.50 −0.20
−2
total
fit
−0.02 0.10 0.82
0.8
0.4
rasch
0.5
0.96 −0.14
−1.0
total
0.0 0.4 0.8
−0.01
fit 1.4
1.0
0.6
69
> keys.list <- list(agree=c("-A1","A2","A3","A4","A5"),
+ conscientious=c("C1","C2","C3","-C4","-C5"),
+ extraversion=c("-E1","-E2","E3","E4","E5"),
+ neuroticism=c("N1","N2","N3","N4","N5"),
+ openness = c("O1","-O2","O3","O4","-O5"))
> item.list <- list(agree=c("A1","A2","A3","A4","A5"),
+ conscientious=c("C1","C2","C3","C4","C5"),
+ extraversion=c("E1","E2","E3","E4","E5"),
+ neuroticism=c("N1","N2","N3","N4","N5"),
+ openness = c("O1","O2","O3","O4","O5"))
> bfi.1pl <- scoreIrt.1pl(keys.list,bfi) #the one parameter solution
> bfi.2pl <- scoreIrt.2pl(item.list,bfi) #the two parameter solution
> bfi.ctt <- scoreFast(keys.list,bfi) # fast scoring function
>
We can compare these three ways of doing the analysis using the cor2 function which correlates
two separate data frames. All three models produce vey simillar results for the case of almost
complete data. It is when we have massively missing completely at random data (MMCAR) that
the results show the superiority of the irt scoring.
> #compare the solutions using the cor2 function
> cor2(bfi.1pl,bfi.ctt)
> cor2(bfi.2pl,bfi.ctt)
> cor2(bfi.2pl,bfi.1pl)
7 Multilevel modeling
Correlations between individuals who belong to different natural groups (based upon e.g., ethnic-
ity, age, gender, college major, or country) reflect an unknown mixture of the pooled correlation
within each group as well as the correlation of the means of these groups. These two correlations
are independent and do not allow inferences from one level (the group) to the other level (the indi-
vidual). When examining data at two levels (e.g., the individual and by some grouping variable), it
70
is useful to find basic descriptive statistics (means, sds, ns per group, within group correlations) as
well as between group statistics (over all descriptive statistics, and overall between group correla-
tions). Of particular use is the ability to decompose a matrix of correlations at the individual level
into correlations within group and correlations between groups.
7.1 Decomposing data into within and between level correlations using statsBy
There are at least two very powerful packages (nlme and multilevel) which allow for complex
analysis of hierarchical (multilevel) data structures. statsBy is a much simpler function to give
some of the basic descriptive statistics for two level models.
This follows the decomposition of an observed correlation into the pooled correlation within groups
(rwg) and the weighted correlation of the means between groups which is discussed by Pedhazur
(1997) and by Bliese (2009) in the multilevel package.
where rxy is the normal correlation which may be decomposed into a within group and between
group correlations rxywg and rxybg and η (eta) is the correlation of the data with the within group
values, or the group means.
71
7.3 Factor analysis by groups
Confirmatory factor analysis comparing the structures in multiple groups can be done in the lavaan
package. However, for exploratory analyses of the structure within each of multiple groups, the
faBy function may be used in combination with the statsBy function. First run pfunstatsBy
with the correlation option set to TRUE, and then run faBy on the resulting output.
sb <- statsBy(bfi[c(1:25,27)], group="education",cors=TRUE)
faBy(sb,nfactors=5) #find the 5 factor solution for each education level
where λi is the ith eigen value of the eigen value decomposition of the matrix
R = R−1 −1 −1
xx Rxy Rxx Rxy .
Unfortunately, there are several cases where set correlation will give results that are much too high.
This will happen if some variables from the first set are highly related to those in the second set,
even though most are not. In this case, although the set correlation can be very high, the degree
of relationship between the sets is not as high. In this case, an alternative statistic, based upon the
average canonical correlation might be more appropriate.
lmCor has the additional feature that it will calculate multiple and partial correlations from the
correlation or covariance matrix rather than the original data.
72
Consider the correlations of the 6 variables in the sat.act data set. First do the normal multiple
regression, and then compare it with the results using lmCor. Two things to notice. lmCor works
on the correlation or covariance or raw data matrix, and thus if using the correlation matrix, will
report standardized or raw β̂ weights. Secondly, it is possible to do several multiple regressions
simultaneously. If the number of observations is specified, or if the analysis is done on raw data,
statistical tests of significance are applied.
For this example, the analysis is done on the correlation matrix rather than the raw data.
> C <- cov(sat.act,use="pairwise")
> model1 <- lm(ACT~ gender + education + age, data=sat.act)
> summary(model1)
Call:
lm(formula = ACT ~ gender + education + age, data = sat.act)
Residuals:
Min 1Q Median 3Q Max
-25.2458 -3.2133 0.7769 3.5921 9.2630
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 27.41706 0.82140 33.378 < 2e-16 ***
gender -0.48606 0.37984 -1.280 0.20110
education 0.47890 0.15235 3.143 0.00174 **
age 0.01623 0.02278 0.712 0.47650
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
DV = gender
slope se t p lower.ci upper.ci VIF Vy.x
(Intercept) 0.00 0.02 0.00 1.000 -0.08 0.08 1.00 0.00
ACT -0.29 0.60 -0.48 0.680 -2.88 2.30 1029.17 0.21
SATV 1.10 0.28 3.98 0.058 -0.09 2.29 217.77 -0.58
SATQ -1.55 0.35 -4.45 0.047 -3.06 -0.05 347.59 1.36
Multiple Regression
R R2 Ruw R2uw Shrunken R2 SE of R2 overall F df1 df2 p
gender 1 1 0.73 0.54 1 0 947.92 3 2 0.00105
DV = education
73
slope se t p lower.ci upper.ci VIF Vy.x
(Intercept) 0.00 0.55 0.00 1.00 -2.35 2.35 1.00 0.00
ACT 2.30 17.52 0.13 0.91 -73.07 77.68 1029.17 1.39
SATV -0.39 8.06 -0.05 0.97 -35.06 34.28 217.77 -0.25
SATQ -1.36 10.18 -0.13 0.91 -45.17 42.44 347.59 -0.74
Multiple Regression
R R2 Ruw R2uw Shrunken R2 SE of R2 overall F df1 df2 p
education 0.64 0.4 0.6 0.37 -0.49 0.09 0.45 3 2 0.744
DV = age
slope se t p lower.ci upper.ci VIF Vy.x
(Intercept) 0.00 0.48 0.00 1.00 -2.07 2.07 1.00 0.00
ACT 3.01 15.43 0.20 0.86 -63.39 69.42 1029.17 -2.16
SATV -1.87 7.10 -0.26 0.82 -32.42 28.67 217.77 1.34
SATQ -1.99 8.97 -0.22 0.85 -40.58 36.60 347.59 1.36
Multiple Regression
R R2 Ruw R2uw Shrunken R2 SE of R2 overall F df1 df2 p
age 0.73 0.54 0.72 0.52 -0.16 0.08 0.77 3 2 0.606
Note that the lmCor analysis also reports the amount of shared variance between the predictor set
and the criterion (dependent) set. This set correlation is symmetric. That is, the R2 is the same
independent of the direction of the relationship.
9 Simulation functions
It is particularly helpful, when trying to understand psychometric concepts, to be able to generate
sample data sets that meet certain specifications. By knowing “truth" it is possible to see how
well various algorithms can capture it. Several of the sim functions create artificial data sets with
known structures.
A number of functions in the psych package will generate simulated data. These functions include
sim for a factor simplex, and sim.simplex for a data simplex, sim.circ for a circumplex
structure, sim.congeneric for a one factor factor congeneric model, sim.dichot to simu-
late dichotomous items, sim.hierarchical to create a hierarchical factor model, sim.item
74
is a more general item simulation, sim.minor to simulate major and minor factors, sim.omega
to test various examples of omega, sim.parallel to compare the efficiency of various ways of
determining the number of factors, sim.rasch to create simulated rasch data, sim.irt to create
general 1 to 4 parameter IRT data by calling sim.npl 1 to 4 parameter logistic IRT or sim.npn
1 to 4 paramater normal IRT, sim.structural a general simulation of structural models, and
sim.anova for ANOVA and lm simulations, and sim.vss. Some of these functions are sep-
arately documented and are listed here for ease of the help function. See each function for more
detailed help.
sim The default version is to generate a four factor simplex structure over three occasions, al-
though more general models are possible.
sim.simple Create major and minor factors. The default is for 12 variables with 3 major factors
and 6 minor factors.
sim.structure To combine a measurement and structural model into one data matrix. Useful
for understanding structural equation models.
sim.hierarchical To create data with a hierarchical (bifactor) structure.
sim.congeneric To create congeneric items/tests for demonstrating classical test theory. This
is just a special case of sim.structure.
sim.circ To create data with a circumplex structure.
sim.item To create items that either have a simple structure or a circumplex structure.
sim.dichot Create dichotomous item data with a simple or circumplex structure.
sim.rasch Simulate a 1 parameter logistic (Rasch) model.
sim.irt Simulate a 2 parameter logistic (2PL) or 2 parameter Normal model. Will also do 3 and
4 PL and PN models.
sim.multilevel Simulate data with different within group and between group correlational
structures.
Some of these functions are described in more detail in the companion vignette: psych for sem.
The default values for sim.structure is to generate a 4 factor, 12 variable data set with a
simplex structure between the factors.
Two data structures that are particular challenges to exploratory factor analysis are the simplex
structure and the presence of minor factors. Simplex structures sim.simplex will typically
occur in developmental or learning contexts and have a correlation structure of r between adjacent
variables and rn for variables n apart. Although just one latent variable (r) needs to be estimated,
the structure will have nvar-1 factors.
75
Many simulations of factor structures assume that except for the major factors, all residuals are
normally distributed around 0. An alternative, and perhaps more realistic situation, is that the there
are a few major (big) factors and many minor (small) factors. The challenge is thus to identify the
major factors. sim.minor generates such structures. The structures generated can be thought of
as having a a major factor structure with some small correlated residuals.
Although coefficient ωh is a very useful indicator of the general factor saturation of a unifactorial
test (one with perhaps several sub factors), it has problems with the case of multiple, independent
factors. In this situation, one of the factors is labelled as “general” and the omega estimate is too
large. This situation may be explored using the sim.omega function.
The four irt simulations, sim.rasch, sim.irt, sim.npl and sim.npn, simulate dichoto-
mous items following the Item Response model. sim.irt just calls either sim.npl (for logistic
models) or sim.npn (for normal models) depending upon the specification of the model.
The logistic model is
ζj −γj
P(x|θi , δ j , γ j , ζ j ) = γ j + . (4)
1 + eα j (δ j −θi
where γ is the lower asymptote or guessing parameter, ζ is the upper asymptote (normally 1),
α j is item discrimination and δ j is item difficulty. For the 1 Paramater Logistic (Rasch) model,
gamma=0, zeta=1, alpha=1 and item difficulty is the only free parameter to specify.
(Graphics of these may be seen in the demonstrations for the logistic function.)
The normal model (irt.npn calculates the probability using pnorm instead of the logistic func-
tion used in irt.npl, but the meaning of the parameters are otherwise the same. With the a = α
parameter = 1.702 in the logiistic model the two models are practically identical.
10 Graphical Displays
Many of the functions in the psych package include graphic output and examples have been shown
in the previous figures. After running fa, iclust, omega, irt.fa, plotting the resulting ob-
ject is done by the plot.psych function as well as specific diagram functions. e.g., (but not
shown)
f3 <- fa(Thurstone,3)
plot(f3)
fa.diagram(f3)
c <- iclust(Thurstone)
plot(c) #a pretty boring plot
iclust.diagram(c) #a better diagram
c3 <- iclust(Thurstone,3)
plot(c3) #a more interesting plot
data(bfi)
e.irt <- irt.fa(bfi[11:15])
plot(e.irt)
76
ot <- omega(Thurstone)
plot(ot)
omega.diagram(ot)
The ability to show path diagrams to represent factor analytic and structural models is discussed
in somewhat more detail in the accompanying vignette, psych for sem. Basic routines to draw
path diagrams are included in the dia.rect and accompanying functions. These are used by the
fa.diagram, structure.diagram and iclust.diagram functions.
77
> xlim=c(0,10)
> ylim=c(0,10)
> plot(NA,xlim=xlim,ylim=ylim,main="Demonstration of dia functions",axes=FALSE,xlab="",ylab="")
> ul <- dia.rect(1,9,labels="upper left",xlim=xlim,ylim=ylim)
> ll <- dia.rect(1,3,labels="lower left",xlim=xlim,ylim=ylim)
> lr <- dia.ellipse(9,3,"lower right",xlim=xlim,ylim=ylim,e.size=.09)
> ur <- dia.ellipse(7,9,"upper right",xlim=xlim,ylim=ylim,e.size=.1)
> ml <- dia.ellipse(3,6,"middle left",xlim=xlim,ylim=ylim,e.size=.1)
> mr <- dia.ellipse(7,6,"middle right",xlim=xlim,ylim=ylim,e.size=.08)
> bl <- dia.ellipse(1,1,"bottom left",xlim=xlim,ylim=ylim,e.size=.08)
> br <- dia.rect(9,1,"bottom right",xlim=xlim,ylim=ylim)
> dia.arrow(from=lr,to=ul,labels="right to left")
> dia.arrow(from=ul,to=ur,labels="left to right")
> dia.curved.arrow(from=lr,to=ll$right,labels ="right to left")
NULL
> dia.curved.arrow(to=ur,from=ul$right,labels ="left to right")
NULL
> dia.curve(ll$top,ul$bottom,"double",-1) #for rectangles, specify where to point
> dia.curved.arrow(mr,ur,"up") #but for ellipses, just point to it.
NULL
> dia.curve(ml,mr,"across")
> dia.curved.arrow(ur,lr,"top down")
NULL
> dia.curved.arrow(br$top,lr$bottom,"up")
NULL
> dia.curved.arrow(bl,br,"left to right")
NULL
> dia.arrow(bl$top,ll$bottom)
> dia.curved.arrow(ml,ll$top,scale=-1)
NULL
> dia.curved.arrow(mr,lr$top)
NULL
left to right
upper left left to right upper right
up
across
right to left
lower left lower right
up
left to right
bottom left bottom right
78
Figure 22: The basic graphic capabilities of the dia functions are shown in this figure.
12 Miscellaneous functions
A number of functions have been developed for some very specific problems that don’t fit into any
other category. The following is an incomplete list. Look at the Index for psych for a list of all of
the functions.
block.random Creates a block randomized structure for n independent variables. Useful for
teaching block randomization for experimental design.
df2latex is useful for taking tabular output (such as a correlation matrix or that of describe
and converting it to a LATEX table. May be used when Sweave is not convenient.
cor2latex Will format a correlation matrix in APA style in a LATEX table. See also fa2latex
and irt2latex.
cosinor One of several functions for doing circular statistics. This is important when studying
mood effects over the day which show a diurnal pattern. See also circadian.mean,
circadian.cor and circadian.linear.cor for finding circular means, circular
correlations, and correlations of circular with linear data.
fisherz Convert a correlation to the corresponding Fisher z score.
geometric.mean also harmonic.mean find the appropriate mean for working with different
kinds of data.
ICC and cohen.kappa are typically used to find the reliability for raters.
headtail combines the head and tail functions to show the first and last lines of a data set
or output.
topBottom Same as headtail. Combines the head and tail functions to show the first and last
lines of a data set or output, but does not add ellipsis between.
mardia calculates univariate or multivariate (Mardia’s test) skew and kurtosis for a vector, ma-
trix, or data.frame
p.rep finds the probability of replication for an F, t, or r and estimate effect size.
partial.r partials a y set of variables out of an x set and finds the resulting partial correlations.
(See also lmCor.)
rangeCorrection will correct correlations for restriction of range.
reverse.code will reverse code specified items. Done more conveniently in most psych func-
tions, but supplied here as a helper function when using other packages.
superMatrix Takes two or more matrices, e.g., A and B, and combines them into a “Super
matrix” with A on the top left, B on the lower right, and 0s for the other two quadrants. A
79
useful trick when forming complex keys, or when forming example problems.
13 Data sets
A number of data sets for demonstrating psychometric techniques are included in the psych pack-
age. These include six data sets showing a hierarchical factor structure (five cognitive examples,
Thurstone, Thurstone.33, Holzinger, Bechtoldt.1, Bechtoldt.2, and one from
health psychology Reise). One of these (Thurstone) is used as an example in the sem package
as well as McDonald (1999). The original data are from Thurstone and Thurstone (1941) and rean-
alyzed by Bechtoldt (1961). Personality item data representing five personality factors on 25 items
(bfi) or 13 personality inventory scores (epi.bfi), and 14 multiple choice iq items (iqitems).
The vegetables example has paired comparison preferences for 9 vegetables. This is an exam-
ple of Thurstonian scaling used by Guilford (1954) and Nunnally (1967). Other data sets include
cubits, peas, and heights from Galton.
Thurstone Holzinger-Swineford (1937) introduced the bifactor model of a general factor and un-
correlated group factors. The Holzinger correlation matrix is a 14 * 14 matrix from their
paper. The Thurstone correlation matrix is a 9 * 9 matrix of correlations of ability items.
The Reise data set is 16 * 16 correlation matrix of mental health items. The Bechtholdt data
sets are both 17 x 17 correlation matrices of ability tests.
bfi 25 personality self report items taken from the International Personality Item Pool (ipip.ori.org)
were included as part of the Synthetic Aperture Personality Assessment (SAPA) web based
personality assessment project. The data from 2800 subjects are included here as a demon-
stration set for scale construction, factor analysis and Item Response Theory analyses.
sat.act Self reported scores on the SAT Verbal, SAT Quantitative and ACT were collected as part
of the Synthetic Aperture Personality Assessment (SAPA) web based personality assessment
project. Age, gender, and education are also reported. The data from 700 subjects are in-
cluded here as a demonstration set for correlation and analysis.
epi.bfi A small data set of 5 scales from the Eysenck Personality Inventory, 5 from a Big 5 inven-
tory, a Beck Depression Inventory, and State and Trait Anxiety measures. Used for demon-
strations of correlations, regressions, graphic displays.
epiR The EPI was given twice to 474 participants. This is a useful data set for exploring test-retest
reliability,
sai, msqR 20 anxiety items and 75 mood items were given at least twice to 3032 participants.
These are useful for understanding reliability structures.
iq 14 multiple choice ability items were included as part of the Synthetic Aperture Personality
Assessment (SAPA) web based personality assessment project. The data from 1000 subjects
80
are included here as a demonstration set for scoring multiple choice inventories and doing
basic item statistics.
galton Two of the earliest examples of the correlation coefficient were Francis Galton’s data sets
on the relationship between mid parent and child height and the similarity of parent genera-
tion peas with child peas. galton is the data set for the Galton height. peas is the data set
Francis Galton used to ntroduce the correlation coefficient with an analysis of the similarities
of the parent and child generation of 700 sweet peas.
Dwyer Dwyer (1937) introduced a method for factor extension (see fa.extension that finds
loadings on factors from an original data set for additional (extended) variables. This data
set includes his example.
miscellaneous cities is a matrix of airline distances between 11 US cities and may be used
for demonstrating multiple dimensional scaling. vegetables is a classic data set for
demonstrating Thurstonian scaling and is the preference matrix of 9 vegetables from Guil-
ford (1954). Used by Guilford (1954); Nunnally (1967); Nunnally and Bernstein (1994), this
data set allows for examples of basic scaling techniques.
15 Psychometric Theory
The psych package has been developed to help psychologists do basic research. Many of the
functions were developed to supplement a book (https://personality-project.org/
81
r/book An introduction to Psychometric Theory with Applications in R (Revelle, prep) More
information about the use of some of the functions may be found in the book .
For more extensive discussion of the use of psych in particular and R in general, consult https:
//personality-project.org/r/r.guide.html A short guide to R.
16 SessionInfo
This document was prepared using the following settings.
> sessionInfo()
locale:
[1] C
82
References
Bechtoldt, H. (1961). An empirical study of the factor analysis stability hypothesis. Psychometrika,
26(4):405–432.
Blashfield, R. K. (1980). The growth of cluster analysis: Tryon, Ward, and Johnson. Multivariate
Behavioral Research, 15(4):439 – 458.
Blashfield, R. K. and Aldenderfer, M. S. (1988). The methods and problems of cluster analysis. In
Nesselroade, J. R. and Cattell, R. B., editors, Handbook of multivariate experimental psychology
(2nd ed.), pages 447–473. Plenum Press, New York, NY.
Bliese, P. D. (2009). Multilevel Modeling in R (2.3) A Brief Introduction to R, the multilevel
package and the nlme package.
Cattell, R. B. (1966). The scree test for the number of factors. Multivariate Behavioral Research,
1(2):245–276.
Cattell, R. B. (1978). The scientific use of factor analysis. Plenum Press, New York.
Cohen, J. (1982). Set correlation as a general multivariate data-analytic method. Multivariate
Behavioral Research, 17(3).
Cohen, J., Cohen, P., West, S. G., and Aiken, L. S. (2003). Applied multiple regression/correlation
analysis for the behavioral sciences. L. Erlbaum Associates, Mahwah, N.J., 3rd ed edition.
Cooksey, R. and Soutar, G. (2006). Coefficient beta and hierarchical item clustering - an analytical
procedure for establishing and displaying the dimensionality and homogeneity of summated
scales. Organizational Research Methods, 9:78–98.
Cronbach, L. J. (1951). Coefficient alpha and the internal structure of tests. Psychometrika, 16:297–
334.
Dwyer, P. S. (1937). The determination of the factor loadings of a given test from the known factor
loadings of other tests. Psychometrika, 2(3):173–178.
Everitt, B. (1974). Cluster analysis. John Wiley & Sons, Cluster analysis. 122 pp. Oxford, England.
Fox, J., Nie, Z., and Byrnes, J. (2013). sem: Structural Equation Models. R package version 3.1-3.
Grice, J. W. (2001). Computing and evaluating factor scores. Psychological Methods, 6(4):430–
450.
Guilford, J. P. (1954). Psychometric Methods. McGraw-Hill, New York, 2nd edition.
Guttman, L. (1945). A basis for analyzing test-retest reliability. Psychometrika, 10(4):255–282.
Hartigan, J. A. (1975). Clustering Algorithms. John Wiley & Sons, Inc., New York, NY, USA.
83
Henry, D. B., Tolan, P. H., and Gorman-Smith, D. (2005). Cluster analysis in family psychology
research. Journal of Family Psychology, 19(1):121–132.
Holzinger, K. and Swineford, F. (1937). The bi-factor method. Psychometrika, 2(1):41–54.
Horn, J. (1965). A rationale and test for the number of factors in factor analysis. Psychometrika,
30(2):179–185.
Horn, J. L. and Engstrom, R. (1979). Cattell’s scree test in relation to Bartlett’s chi-square test
and other observations on the number of factors problem. Multivariate Behavioral Research,
14(3):283–300.
Jennrich, R. and Bentler, P. (2011). Exploratory bi-factor analysis. Psychometrika, 76(4):537–549.
Jensen, A. R. and Weng, L.-J. (1994). What is a good g? Intelligence, 18(3):231–258.
Kaiser, H. F. and Caffrey, J. (1965). Alpha factor analysis. Psychometrika, 30(1):1–14.
Loehlin, J. C. and Beaujean, A. (2017). Latent variable models: an introduction to factor, path,
and structural equation analysis. Routledge, Mahwah, N.J., 5th edition.
Loevinger, J., Gleser, G., and DuBois, P. (1953). Maximizing the discriminating power of a
multiple-score test. Psychometrika, 18(4):309–317.
MacCallum, R. C., Browne, M. W., and Cai, L. (2007). Factor analysis models as approximations.
In Cudeck, R. and MacCallum, R. C., editors, Factor analysis at 100: Historical developments
and future directions, pages 153–175. Lawrence Erlbaum Associates Publishers, Mahwah, NJ.
Martinent, G. and Ferrand, C. (2007). A cluster analysis of precompetitive anxiety: Relationship
with perfectionism and trait anxiety. Personality and Individual Differences, 43(7):1676–1686.
McDonald, R. P. (1999). Test theory: A unified treatment. L. Erlbaum Associates, Mahwah, N.J.
Mun, E. Y., von Eye, A., Bates, M. E., and Vaschillo, E. G. (2008). Finding groups using model-
based cluster analysis: Heterogeneous emotional self-regulatory processes and heavy alcohol
use risk. Developmental Psychology, 44(2):481–495.
Nunnally, J. C. (1967). Psychometric theory. McGraw-Hill, New York,.
Nunnally, J. C. and Bernstein, I. H. (1994). Psychometric theory. McGraw-Hill, New York„ 3rd
edition.
Pedhazur, E. (1997). Multiple regression in behavioral research: explanation and prediction. Har-
court Brace College Publishers.
Revelle, W. (1979). Hierarchical cluster-analysis and the internal structure of tests. Multivariate
Behavioral Research, 14(1):57–74.
84
Revelle, W. (2023). psych: Procedures for Personality and Psychological Research. Northwestern
University, Evanston, https://cran.r-project.org/web/packages=psych. R package version 2.3.5.
Revelle, W. (in prep). An introduction to psychometric theory with applications in R. Springer.
Revelle, W., Condon, D., and Wilt, J. (2011). Methodological advances in differential psychology.
In Chamorro-Premuzic, T., Furnham, A., and von Stumm, S., editors, Handbook of Individual
Differences, chapter 2, pages 39–73. Wiley-Blackwell.
Revelle, W. and Condon, D. M. (2018). Reliability. In Irwing, P., Booth, T., and Hughes, D.,
editors, Wiley-Blackwell Handbook of Psychometric Testing. Wiley-Blackwell.
Revelle, W. and Rocklin, T. (1979). Very Simple Structure - alternative procedure for estimating
the optimal number of interpretable factors. Multivariate Behavioral Research, 14(4):403–414.
Revelle, W., Wilt, J., and Rosenthal, A. (2010). Individual differences in cognition: New methods
for examining the personality-cognition link. In Gruszka, A., Matthews, G., and Szymura, B.,
editors, Handbook of Individual Differences in Cognition: Attention, Memory and Executive
Control, chapter 2, pages 27–49. Springer, New York, N.Y.
Revelle, W. and Wilt, J. A. (2017). Analyzing dynamic data: a tutorial. Personality and Individual
Differences, (in press).
Revelle, W. and Zinbarg, R. E. (2009). Coefficients alpha, beta, omega and the glb: comments on
Sijtsma. Psychometrika, 74(1):145–154.
Schmid, J. J. and Leiman, J. M. (1957). The development of hierarchical factor solutions. Psy-
chometrika, 22(1):83–90.
Shrout, P. and Lane, S. P. (2012). Psychometrics. In Handbook of research methods for studying
daily life. Guilford Press.
Shrout, P. E. and Fleiss, J. L. (1979). Intraclass correlations: Uses in assessing rater reliability.
Psychological Bulletin, 86(2):420–428.
Sneath, P. H. A. and Sokal, R. R. (1973). Numerical taxonomy: the principles and practice of
numerical classification. A Series of books in biology. W. H. Freeman, San Francisco.
Sokal, R. R. and Sneath, P. H. A. (1963). Principles of numerical taxonomy. A Series of books in
biology. W. H. Freeman, San Francisco.
Spearman, C. (1904). The proof and measurement of association between two things. The Ameri-
can Journal of Psychology, 15(1):72–101.
Thorburn, W. M. (1918). The myth of Occam’s razor. Mind, 27:345–353.
Thurstone, L. L. and Thurstone, T. G. (1941). Factorial studies of intelligence. The University of
Chicago press, Chicago, Ill.
85
Tryon, R. C. (1935). A theory of psychological components–an alternative to "mathematical fac-
tors.". Psychological Review, 42(5):425–454.
Tryon, R. C. (1939). Cluster analysis. Edwards Brothers, Ann Arbor, Michigan.
Velicer, W. (1976). Determining the number of components from the matrix of partial correlations.
Psychometrika, 41(3):321–327.
Zinbarg, R. E., Revelle, W., Yovel, I., and Li, W. (2005). Cronbach’s α , Revelle’s β , and McDon-
ald’s ωH : Their relations with each other and two alternative conceptualizations of reliability.
Psychometrika, 70(1):123–133.
Zinbarg, R. E., Yovel, I., Revelle, W., and McDonald, R. P. (2006). Estimating generalizability to a
latent variable common to all of a scale’s indicators: A comparison of estimators for ωh . Applied
Psychological Measurement, 30(2):121–144.
86
Index
agnes, 22 edit, 4
alpha, 6, 7, 41, 42, 44, 56 epi.bfi, 80
alpha factor analysis, 10 eRm, 64
error.bars, 7
Bechtoldt.1, 80 esem, 37
Bechtoldt.2, 80 esem.diagram, 37
bestScales, 58
bfi, 51–53, 58, 69, 80 FA, 10, 15
bi.bars, 7 fa, 7, 8, 10, 12, 14, 15, 19, 29, 56, 76, 77
bifactor, 7, 14, 20 fa.diagram, 8, 11, 18, 36, 77
biquartimin, 14 fa.extension, 36, 81
block.random, 79 fa.graph, 11
fa.irt, 64
circadian.cor, 79 fa.multi, 7
circadian.linear.cor, 79 fa.parallel, 6, 7, 11, 31, 34, 56
circadian.mean, 79 fa.parallel.poly, 34
circular statistics, 79 fa.plot, 11, 15
cities, 81 fa.poly, 10, 29
cluster analysis, 10, 22 fa2latex, 77, 79
cluster scores, 10 faBy, 72
cluster.cor, 40, 51, 53 factanal, 11, 12
cluster.loadings, 51, 55 factor analysis, 7, 10, 15
cohen.kappa, 79 factor extension, 34
common variance, 15 factor scores, 10
component scores, 10 factor.congruence, 11, 31
congruence coefficient, 29 factor.minres, 8, 11, 12, 14
cor2, 70 factor.pa, 8, 11, 12, 14, 45
cor2latex, 77, 79 factor.wls, 8, 11
corPlot, 8, 9 factors, 10
cosinor, 79 fisherz, 79
ctv, 8
cubits, 80 galton, 81
generalized least squares, 7
describe, 4, 7, 9, 56, 79 generalized least squares factor analysis, 10
describeBy, 4, 7, 9 geometric.mean, 79
df2latex, 77, 79 GPArotation, 8, 12, 14, 22
dia.rect, 77 guttman, 7, 46, 51
diagram, 9
harmonic.mean, 79
87
hclust, 22 mlArrange, 7
head, 79 mlPlot, 7
headtail, 79 mlr, 7, 72
heights, 80 multi.hist, 7
het.diagram, 8 multilevel, 71
hierarchical cluster analysis, 22 multilevel.reliability, 7
Holzinger, 80 multilevelReliablity, 72
ICC, 7, 79 nfactors, 7, 11
iclust, 7, 11, 22, 23, 28, 40, 45, 56, 76 nlme, 71
iclust.diagram, 8, 77
Index, 79 oblimin, 14
introduction to psychometric theory with appli- omega, 7, 8, 20, 29, 40, 44, 45, 64, 76
cations in R, 8 omegaSem, 44, 49
iqitems, 80 outlier, 4
irt.fa, 7, 59, 62, 64, 68, 76, 77 p.rep, 79
irt.npl, 76 pairs.panels, 4, 7, 8, 53
irt.npn, 76 pairs.panesl, 9
irt.responses, 56, 57 parallels, 64
irt2latex, 77, 79 paran, 34
item.lookup, 58 partial.r, 79
keys, 42 PCA, 10, 15
KnitR, 77 pca, 7
peas, 80, 81
lavaan, 34, 44, 72 plot, 15, 17
library, 9 plot.irt, 8
lmCor, 5, 8, 9, 34, 56, 72–74, 79 plot.poly, 8
logistic, 60 plot.psych, 76
lowerCor, 5 pnorm, 76
ltm, 64 polychoric, 7, 23, 24, 34, 59
principal, 6–8, 11, 14, 15, 45
make.keys, 52 principal axis, 7
MAP, 7, 11, 32 principal axis factor analysis, 10
mardia, 79 principal components, 10
maximum likelihood, 7 principal components analysis, 10, 15
maximum likelihood factor analysis, 10 princomp, 15
mediate, 5, 8 print, 15
mediation, 9 print.psych, 16
min.res, 12 progressBar, 23
minimum residual, 7 Promax, 14, 15
minres factor analysis, 10 psych, 4, 6–10, 12, 22, 52, 64, 76, 77, 79–82
88
quartimax, 14 fa.multi, 7
quartimin, 14 fa.parallel, 6, 7, 11, 31, 34, 56
fa.parallel.poly, 34
R function fa.plot, 11, 15
agnes, 22 fa.poly, 10, 29
alpha, 6, 7, 41, 42, 44, 56 fa2latex, 77, 79
Bechtoldt.1, 80 faBy, 72
Bechtoldt.2, 80 factanal, 11, 12
bestScales, 58 factor.congruence, 11, 31
bfi, 51–53, 58, 69, 80 factor.minres, 8, 11, 12, 14
bi.bars, 7 factor.pa, 8, 11, 12, 14, 45
bifactor, 14, 20 factor.wls, 8, 11
biquartimin, 14 fisherz, 79
block.random, 79 galton, 81
circadian.cor, 79 geometric.mean, 79
circadian.linear.cor, 79 guttman, 7, 46, 51
circadian.mean, 79 harmonic.mean, 79
cities, 81 hclust, 22
cluster.cor, 40, 51, 53 head, 79
cluster.loadings, 51, 55 headtail, 79
cohen.kappa, 79 heights, 80
cor2, 70 het.diagram, 8
cor2latex, 77, 79 Holzinger, 80
corPlot, 8, 9 ICC, 7, 79
cosinor, 79 iclust, 7, 11, 22, 23, 28, 40, 45, 56, 76
cubits, 80 iclust.diagram, 8, 77
describe, 4, 7, 9, 56, 79 iqitems, 80
describeBy, 4, 7, 9 irt.fa, 7, 59, 62, 64, 68, 76, 77
df2latex, 77, 79 irt.npl, 76
dia.rect, 77 irt.npn, 76
edit, 4 irt.responses, 56, 57
epi.bfi, 80 irt2latex, 77, 79
error.bars, 7 item.lookup, 58
esem, 37 library, 9
esem.diagram, 37 lmCor, 5, 8, 9, 34, 56, 72–74, 79
fa, 7, 8, 10, 12, 14, 15, 19, 29, 56, 76, lowerCor, 5
77 make.keys, 52
fa.diagram, 8, 11, 18, 36, 77 MAP, 7, 11, 32
fa.extension, 36, 81 mardia, 79
fa.graph, 11 mediate, 5, 8
fa.irt, 64 mediation, 9
89
mlArrange, 7 circadian.cor, 79
mlPlot, 7 circadian.linear.cor, 79
mlr, 7, 72 circadian.mean, 79
multi.hist, 7 cities, 81
multilevel.reliability, 7 cluster.cor, 40, 51, 53
multilevelReliablity, 72 cluster.loadings, 51, 55
nfactors, 7, 11 cohen.kappa, 79
oblimin, 14 cor2, 70
omega, 7, 8, 20, 29, 40, 44, 45, 64, 76 cor2latex, 77, 79
omegaSem, 44, 49 corPlot, 8, 9
outlier, 4 cosinor, 79
p.rep, 79 cubits, 80
pairs.panels, 4, 7, 8, 53 describe, 4, 7, 9, 56, 79
pairs.panesl, 9 describeBy, 4, 7, 9
paran, 34 df2latex, 77, 79
partial.r, 79 dia.rect, 77
pca, 7 epi.bfi, 80
peas, 80, 81 error.bars, 7
plot, 15, 17 esem, 37
plot.irt, 8 esem.diagram, 37
plot.poly, 8 fa, 7, 8, 10, 12, 14, 15, 19, 29, 56, 76,
plot.psych, 76 77
pnorm, 76 fa.diagram, 8, 11, 18, 36, 77
polychoric, 7, 23, 24, 59 fa.extension, 36, 81
principal, 6–8, 11, 14, 15, 45 fa.graph, 11
princomp, 15 fa.irt, 64
print, 15 fa.multi, 7
print.psych, 16 fa.parallel, 6, 7, 11, 31, 34, 56
progressBar, 23 fa.parallel.poly, 34
Promax, 14, 15 fa.plot, 11, 15
psych, 81 fa.poly, 10, 29
psych package fa2latex, 77, 79
alpha, 6, 7, 41, 42, 44, 56 faBy, 72
Bechtoldt.1, 80 factor.congruence, 11, 31
Bechtoldt.2, 80 factor.minres, 8, 11, 12, 14
bestScales, 58 factor.pa, 8, 11, 12, 14, 45
bfi, 51–53, 58, 69, 80 factor.wls, 8, 11
bi.bars, 7 fisherz, 79
bifactor, 14, 20 galton, 81
biquartimin, 14 geometric.mean, 79
block.random, 79 guttman, 7, 46, 51
90
harmonic.mean, 79 plot.psych, 76
headtail, 79 polychoric, 7, 23, 24, 59
heights, 80 principal, 6–8, 11, 14, 15, 45
het.diagram, 8 print, 15
Holzinger, 80 print.psych, 16
ICC, 7, 79 progressBar, 23
iclust, 7, 11, 22, 23, 28, 40, 45, 56, 76 Promax, 14, 15
iclust.diagram, 8, 77 psych, 81
iqitems, 80 rangeCorrection, 79
irt.fa, 7, 59, 62, 64, 68, 76, 77 read.clipboard, 4, 7, 9
irt.npl, 76 read.clipboard.tab, 4
irt.npn, 76 read.file, 4, 7, 9
irt.responses, 56, 57 Reise, 80
irt2latex, 77, 79 response.frequencies, 56
item.lookup, 58 reverse.code, 79
lmCor, 5, 8, 9, 34, 56, 72–74, 79 sat.act, 73
lowerCor, 5 scatter.hist, 7
make.keys, 52 schmid, 7, 8, 45
MAP, 7, 11, 32 score.multiple.choice, 7, 55, 56, 64
mardia, 79 scoreIrt, 67
mediate, 5, 8 scoreIrt.1pl, 69
mediation, 9 scoreIrt.2pl, 69
mlArrange, 7 scoreItems, 6–8, 40, 44, 45, 51–53, 55,
mlPlot, 7 56
mlr, 7, 72 scrub, 4, 9
multi.hist, 7 sim, 74, 75
multilevel.reliability, 7 sim.anova, 75
multilevelReliablity, 72 sim.circ, 74, 75
nfactors, 7, 11 sim.congeneric, 74, 75
omega, 7, 8, 20, 29, 40, 44, 45, 64, 76 sim.dichot, 74, 75
omegaSem, 44, 49 sim.hierarchical, 74, 75
outlier, 4 sim.irt, 75, 76
p.rep, 79 sim.item, 74, 75
pairs.panels, 4, 7, 8, 53 sim.minor, 32, 75, 76
pairs.panesl, 9 sim.multilevel, 71, 75
partial.r, 79 sim.npl, 75, 76
pca, 7 sim.npn, 75, 76
peas, 80, 81 sim.omega, 75, 76
plot, 17 sim.parallel, 75
plot.irt, 8 sim.rasch, 75, 76
plot.poly, 8 sim.simple, 75
91
sim.simplex, 74, 75 sim.anova, 75
sim.structural, 75 sim.circ, 74, 75
sim.structure, 32, 75 sim.congeneric, 74, 75
sim.vss, 75 sim.dichot, 74, 75
smc, 11 sim.hierarchical, 74, 75
splitHalf, 51 sim.irt, 75, 76
StatsBy, 7 sim.item, 74, 75
statsBy, 7, 71, 72 sim.minor, 32, 75, 76
statsBy.boot, 71 sim.multilevel, 71, 75
statsBy.boot.summary, 71 sim.npl, 75, 76
structure.diagram, 8, 77 sim.npn, 75, 76
superMatrix, 79 sim.omega, 75, 76
target.rot, 14 sim.parallel, 75
tetrachoric, 7, 24, 59 sim.rasch, 75, 76
Thurstone, 80 sim.simple, 75
Thurstone.33, 80 sim.simplex, 74, 75
topBottom, 79 sim.structural, 75
varimin, 14 sim.structure, 32, 75
vegetables, 80, 81 sim.vss, 75
vss, 6, 7, 11, 32, 56 smc, 11
withinBetween, 71 splitHalf, 51
quartimax, 14 StatsBy, 7
quartimin, 14 statsBy, 7, 71, 72
rangeCorrection, 79 statsBy.boot, 71
read.clipboard, 4, 7, 9 statsBy.boot.summary, 71
read.clipboard.tab, 4 structure.diagram, 8, 77
read.file, 4, 7, 9 superMatrix, 79
Reise, 80 tail, 79
response.frequencies, 56 target.rot, 14
reverse.code, 79 tetrachoric, 7, 24, 59
Rgraphviz, 11 Thurstone, 80
sat.act, 73 Thurstone.33, 80
scatter.hist, 7 topBottom, 79
schmid, 7, 8, 45 varimax, 14
score.multiple.choice, 7, 55, 56, 64 varimin, 14
scoreIrt, 67 vegetables, 80, 81
scoreIrt.1pl, 69 vss, 6, 7, 11, 32, 56
scoreIrt.2pl, 69 withinBetween, 71
scoreItems, 6–8, 40, 44, 45, 51–53, 55, 56 R package
scrub, 4, 9 ctv, 8
sim, 74, 75 eRm, 64
92
GPArotation, 8, 12, 14, 22 sim.congeneric, 74, 75
KnitR, 77 sim.dichot, 74, 75
lavaan, 34, 44, 72 sim.hierarchical, 74, 75
ltm, 64 sim.irt, 75, 76
multilevel, 71 sim.item, 74, 75
nlme, 71 sim.minor, 32, 75, 76
parallels, 64 sim.multilevel, 71, 75
paran, 34 sim.npl, 75, 76
psych, 4, 6–10, 12, 22, 52, 64, 76, 77, 79– sim.npn, 75, 76
82 sim.omega, 75, 76
Rgraphviz, 9 sim.parallel, 75
sem, 8, 34, 49, 80 sim.rasch, 75, 76
stats, 12, 15 sim.simple, 75
Sweave, 77 sim.simplex, 74, 75
xtable, 77 sim.structural, 75
rangeCorrection, 79 sim.structure, 32, 75
read.clipboard, 4, 7, 9 sim.vss, 75
read.clipboard.tab, 4 Singular Value Decomposition, 10
read.file, 4, 7, 9 smc, 11
Reise, 80 splitHalf, 51
response.frequencies, 56 stats, 12, 15
reverse.code, 79 StatsBy, 7
Rgraphviz, 9, 11 statsBy, 7, 71, 72
rooted dendritic structure, 22 statsBy.boot, 71
statsBy.boot.summary, 71
SAPA, 55, 64–67, 80 structure.diagram, 8, 77
sat.act, 73 superMatrix, 79
scatter.hist, 7 Sweave, 77
schmid, 7, 8, 45
Schmid-Leiman, 20 tail, 79
score.multiple.choice, 7, 55, 56, 64 target.rot, 14
scoreIrt, 67 tetrachoric, 7, 24, 59
scoreIrt.1pl, 69 Thurstone, 80
scoreIrt.2pl, 69 Thurstone.33, 80
scoreItems, 6–8, 40, 44, 45, 51–53, 55, 56 topBottom, 79
scrub, 4, 9 tree diagram, 22
sem, 8, 34, 49, 80
set correlation, 34, 72 varimax, 14
sim, 74, 75 varimin, 14
sim.anova, 75 vegetables, 80, 81
sim.circ, 74, 75 vss, 6, 7, 11, 32, 56
93
weighted least squares, 7
weighted least squares factor analysis, 10
withinBetween, 71
xtable, 77
94