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


14

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

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

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

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

我还应该补充一点,我正在使用一个已建立的,具有三个维度的工具,我们在其中添加了一些其他问题,现在希望找到四个不同的维度。此外,我们的样本量仅为,目前我们有19个项目。我将样本量和项目数与许多心理学文章进行了比较,我们绝对处于较低端,但无论如何我们都想尝试一下。虽然,这对于我正在寻找的逐步示例和以下caracal的示例并不重要n=15319看起来确实很棒。早上,我将首先使用数据来解决问题。


1
由于FA不一定是最佳选择,具体取决于您感兴趣的问题,您能否在研究背景上说更多?
chl 2012年

@chl,谢谢您回答我的问题,我们正在调查有关PTSD的一些问题的潜在因素结构。我们感兴趣的是1)识别一些(集群),以及2)研究每个加载的不同问题的数量。
埃里克·菲尔

1
只需确定一下,(a)您的样本量是多少,(b)这是现有的(已经验证)的仪器还是自制的问卷?
chl 2012年

@chl,非常感谢您的提问。(a)我们的样本量为,目前我们有19个项目。我将样本量和项目数量与《创伤压力杂志》中的样本进行了比较,我们肯定处于较低水平,但无论如何我们都想尝试一下。(b)我们使用的是现有的仪器,但由于我们认为缺少这些问题,因此添加了一些自制的问题。n=153
埃里克·菲尔

1
好的,谢谢你。这应该是很容易建立一个工作示例与插图R.
CHL

Answers:


22

我认为问题的重点不在理论上,而在实践上,即如何在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ΛfË

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)

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)的文档非常出色。这里的例子只是为了让您入门。


您的示例逐步看起来很棒。早上,我将使用我的数据进行处理,并尽快回复您。感谢您抽出时间来写这个。如果您碰巧有一些理论参考,我也会对它们感兴趣。Chl推荐了Revelle的R心理学计量学教科书,我肯定会对此进行研究。谢谢
埃里克失败

@caracal:使用多项/四项相关来代替通常的Pearson r时,是否psych可以通过某种方式估算因子得分
ttnphns 2012年

3
抱歉,@ caracal,我不是R用户。这就是我要问的原因。由于您没有使用原始的Pearson r,而是四色的r,因此您已经失去了原始二进制数据和加载矩阵之间的直接线性代数链接。我想象在这种情况下,将使用一些特殊算法(例如基于EM方法)来代替经典回归/巴特利特算法。所以做psych给我们处理的四项R,不平常的R事实给予其应有的,当它计算因子得分,或不?
ttnphns 2012年

1
@EricFail由于多对相关矩阵是通过成对相关来估计的,因此,随着变量数量的增加,非正定端矩阵的确变得更加普遍,并且观测值的数量是固定的(请参见MPlus讨论)。这种情况下使用诸如nearcor()from sfsmisccor.smooth()from psych这样的功能。
caracal 2012年

1
@ttnphns抱歉,我误解了您的问题。好问题!我本来认为像MPlus技术附录11中实现,但看的代码psychfactor.scores(),这是情况并非如此。取而代之的是,分数的计算与连续情况一样。但是,factor.scores()软件包中的函数ltm似乎实现了正确的过程,请参见此示例 ->“因子得分-能力评估”和帮助页面。
caracal 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.