Here is the template I’ve been working on to fit EFA models to categorical items. Besides the packages listed at the beginning it will use the Num2Fac function.

##import your data: this example is for spss file
##remember to change data.sav for your path/filename
library(foreign)
tt <- read.spss("data.sav", use.value.labels=TRUE,
max.value.labels=Inf, to.data.frame=TRUE)
#loading packages that may be used in the script
library(ltm)
library(psych)
library(polycor)
library(nFactors)
library(GPArotation)
#You can get the Num2Fac function on a previous post
#https://latentperiod.wordpress.com/2011/04/06/num2fac/
#save it as an R file and source it or run it to use it
source("Num2Fac.R")
#creating the dataframe with items as categorical variables ("factors")
tt.f <- Num2Fac(tt)
summary(tt)
summary(tt.f)
#using the hetcor function to run get the polychoric cors
#this will take a while
tt.polyf <- hetcor(tt.f)
tt.poly <- as.data.frame(tt.polyf$correlations)
#scree plot tests (notice that PA needs a proper simulation to run
tt.scree<-nScree(eig=NULL, x=tt.poly, aparallel=NULL,
cor=TRUE, model="factors", criteria=NULL)
plotnScree(tt.scree)
#you can also use the Very Simple Structure method to get number of
#factors to retain
VSS(tt.poly, n=6, rotate="oblimin", diagonal=FALSE,
fm="pa", n.obs=426, plot=TRUE, title="VSS")
#fitting a one factor solution (principal axis, oblimin rotation)
tt.1f <- factor.pa(tt.poly, nfactors=1, n.obs=755,rotate="oblimin")
print(tt.1f,digits=3)

Created by Pretty R at inside-R.org

### Like this:

Like Loading...

looks good!

One thing that I do now as convention is when I use foreign’s read.filetype I use the generic version, e.g. read.dta(file.choose()) – that way a window pops up and asks for the file I want to include. I figure I am not typically going to be always analyzing the same dataset so why should my template be hard coded for one?

For a more interesting scree plot, you could also try fa.parallel – which produces the typical scree plot and one based upon parallel analysis, which is kind of cool.

e.g. (with settings for basic scree) –> fa.parallel(data, n.obs=141, fm=”pa”, fa=”fa”, ntrials=30, main =”Parallel Analysis Scree Plot”, error.bars=FALSE, smc=FALSE, show.legend=FALSE)

Also, for EFA, I really do like Kwan & Friendly’s tableplots function for visualizing the factor loadings.

e.g. (with factor loadings from tt.lf$loadings saved to “loadings”)->

tableplot(t(round(100*loadings)), cell.specs = list(list(cell.fill=”yellow”, back.fill=”gray90″, scale.max=100, label=1)), side.rot=90)

plot(loadings, pch=1, main=”2 Factor Solution”)

text(loadings[,1], loadings[,2], rownames(loadings), pos=1)

abline(h=0, v=0, col=”gray”)