寻找使用 R 对二分数据(二元变量)进行因子分析的示例的步骤

机器算法验证 r 因子分析 心理测量学 二进制数据
2022-02-08 02:55:20

我有一些二元数据,只有二元变量,我的老板让我使用四色相关矩阵进行因子分析。我以前已经能够根据此处以及UCLA 的统计站点和其他类似站点的示例自学如何运行不同的分析,但我似乎无法通过二分法的因子分析示例找到一个步骤使用 R 的数据(二进制变量)。

我确实看到了chl对一个有点相似的问题的回答,我也看到了ttnphns 的回答,但我正在寻找更详细的内容,一步一步通过我可以使用的示例。

这里有没有人通过使用 R 对二元变量进行因子分析的示例知道这样一个步骤?

2012-07-11 22:03:35Z 更新

我还应该补充一点,我正在使用具有三个维度的既定工具,我们在其中添加了一些额外的问题,我们现在希望找到四个不同的维度。此外,我们的样本量仅为n=153,我们目前有19项目。我将我们的样本量和项目数量与一些心理学文章进行了比较,我们肯定处于低端,但我们还是想尝试一下。虽然,这对于我正在寻找的逐步示例并不重要,并且下面的 caracal 示例看起来非常棒。我会在早上第一件事就是使用我的数据来完成它。

1个回答

我认为问题的重点不是理论方面,而是实践方面,即如何在 R 中实现二分数据的因子分析。

首先,让我们模拟来自 6 个变量的 200 个观察值,来自 2 个正交因子。我将采取几个中间步骤,从稍后将其二分法的多元正态连续数据开始。这样,我们可以将 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+e, 和x是一个人的观察变量值,Λ真实载荷矩阵,f潜在因素得分,和eiid,均值为 0,正常错误。

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 packagepolycor为我们提供了我们稍后将用于 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()from 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)

factor.plot() 和 fa.diagram() 的输出

平行分析和“非常简单的结构”分析有助于选择因素的数量。同样,包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.parallel.poly() 和 random.polychor.pa() 的输出

请注意这些功能fa()fa.poly()提供更多选项来设置 FA。此外,我编辑了一些输出,这些输出给出了拟合测试的优劣等。这些函数(以及psych一般的包)的文档非常好。这里的这个例子只是为了让你开始。