我认为问题的重点不在理论上,而在实践上,即如何在R中实施二分数据的因子分析。
首先,让我们模拟来自2个正交因子的6个变量的200个观测值。我将采取一些中间步骤,并从后来分成两部分的多元正常连续数据开始。这样,我们可以将Pearson相关性与多项相关性进行比较,并比较连续数据中的因子负载与二分数据中的因子负载以及真实负载。
set.seed(1.234)
N <- 200 # number of observations
P <- 6 # number of variables
Q <- 2 # number of factors
# true P x Q loading matrix -> variable-factor correlations
Lambda <- matrix(c(0.7,-0.4, 0.8,0, -0.2,0.9, -0.3,0.4, 0.3,0.7, -0.8,0.1),
nrow=P, ncol=Q, byrow=TRUE)
x=Λf+exΛfe
library(mvtnorm) # for rmvnorm()
FF <- rmvnorm(N, mean=c(5, 15), sigma=diag(Q)) # factor scores (uncorrelated factors)
E <- rmvnorm(N, rep(0, P), diag(P)) # matrix with iid, mean 0, normal errors
X <- FF %*% t(Lambda) + E # matrix with variable values
Xdf <- data.frame(X) # data also as a data frame
对连续数据进行因子分析。忽略无关符号时,估计的载荷与真实载荷相似。
> library(psych) # for fa(), fa.poly(), factor.plot(), fa.diagram(), fa.parallel.poly, vss()
> fa(X, nfactors=2, rotate="varimax")$loadings # factor analysis continuous data
Loadings:
MR2 MR1
[1,] -0.602 -0.125
[2,] -0.450 0.102
[3,] 0.341 0.386
[4,] 0.443 0.251
[5,] -0.156 0.985
[6,] 0.590
现在让我们将数据二等分。我们将以两种格式保存数据:作为具有排序因子的数据框,以及作为数字矩阵。hetcor()
from package polycor
提供了一个多色相关矩阵,我们将在稍后将其用于FA。
# dichotomize variables into a list of ordered factors
Xdi <- lapply(Xdf, function(x) cut(x, breaks=c(-Inf, median(x), Inf), ordered=TRUE))
Xdidf <- do.call("data.frame", Xdi) # combine list into a data frame
XdiNum <- data.matrix(Xdidf) # dichotomized data as a numeric matrix
library(polycor) # for hetcor()
pc <- hetcor(Xdidf, ML=TRUE) # polychoric corr matrix -> component correlations
现在,使用多元相关矩阵执行常规FA。请注意,估计的负荷与连续数据中的负荷相当相似。
> faPC <- fa(r=pc$correlations, nfactors=2, n.obs=N, rotate="varimax")
> faPC$loadings
Loadings:
MR2 MR1
X1 -0.706 -0.150
X2 -0.278 0.167
X3 0.482 0.182
X4 0.598 0.226
X5 0.143 0.987
X6 0.571
您可以自己跳过计算多色相关矩阵的步骤,而直接fa.poly()
从package中使用psych
,最后做同样的事情。此函数接受原始的二分数据作为数值矩阵。
faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax") # polychoric FA
faPCdirect$fa$loadings # loadings are the same as above ...
编辑:对于因子评分,请查看ltm
具有factor.scores()
专门用于多结果数据的功能的软件包。此页面上提供了一个示例->“因子得分-能力估计”。
您可以使用factor.plot()
和来可视化来自因素分析的负荷fa.diagram()
,两者均来自package psych
。由于某种原因,factor.plot()
仅接受$fa
来自的结果成分fa.poly()
,而不接受完整的对象。
factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)
并行分析和“非常简单的结构”分析为选择因素数量提供了帮助。同样,程序包psych
具有必需的功能。vss()
将多色相关矩阵作为参数。
fa.parallel.poly(XdiNum) # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax") # very simple structure
包装还提供了多发性FA的平行分析random.polychor.pa
。
library(random.polychor.pa) # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)
请注意,这些功能fa()
并fa.poly()
提供了许多其他选项来设置FA。另外,我还编辑了一些输出,这些输出提供了拟合检验等方面的优势。这些功能(以及整体包装psych
)的文档非常出色。这里的例子只是为了让您入门。