2

我无法从对有序分类数据的探索性因子分析中计算因子得分。我已经设法评估了要绘制多少个因子,并使用 psych 包运行因子分析,但无法弄清楚如何为单个参与者获取因子分数,并且在网上找不到太多帮助。这是我卡住的地方:

library(polycor)
library(nFactors)
library(psych)

# load data
dat <- read.csv("https://raw.githubusercontent.com/paulrconnor/datasets/master/data.csv")

# convert to ordered factors
for(i in 1:length(dat)){
  dat[,i] <- as.factor(dat[,i])
}

# compute polychoric correlations
pc <- hetcor(dat,ML=T)

# 2. choose number of factors
ev <- eigen(pc) 
ap <- parallel(subject = nrow(dat), 
               var=ncol(dat),rep=100,cent=.05)
nS <- nScree(x = ev$values, aparallel = ap$eigen$qevpea)
dev.new(height=4,width=6,noRStudioGD = T)
plotnScree(nS) # 2 factors, maybe 1

# run FA
faPC <- fa(r=pc$correlations, nfactors = 2, rotate="varimax",fm="ml")
faPC$loadings

编辑:我找到了一种使用 irt.fa() 和 scoreIrt() 获取分数的方法,但它涉及将我的有序类别转换为数字,所以我不确定它是否有效。任何建议将不胜感激!

x = as.matrix(dat)
fairt <- irt.fa(x = x,nfactors=2,correct=TRUE,plot=TRUE,n.obs=NULL,rotate="varimax",fm="ml",sort=FALSE)
for(i in 1:length(dat)){dat[,i] <- as.numeric(dat[,i])}
scoreIrt(stats = fairt, items = dat, cut = 0.2, mod="logistic") 
4

1 回答 1

1

这是一个有趣的问题。常规因子分析假设您的输入度量是比率或区间缩放的。对于序数变量,您有几个选择。您可以使用基于 IRT 的方法(在这种情况下,您将使用诸如分级响应模型之类的方法),或者像您在示例中所做的那样使用多变量相关矩阵作为因子分析的输入。你可以在这里看到更多关于这个问题的讨论

大多数因子分析包都有获取因子分数的方法,但会根据您选择用作输入的内容为您提供不同的输出。例如,通常您可以只使用factor.scores()来获取您的预期因子分数,但前提是您输入原始原始分数数据。这里的问题是要求使用多色矩阵作为输入

我不是 100% 确定(如果我错了,请有人纠正我),但我认为在你的情况下应该可以:

dat <- read.csv("https://raw.githubusercontent.com/paulrconnor/datasets/master/data.csv")
dat_orig <- dat

#convert to ordered factors
for(i in 1:length(dat)){
    dat[,i] <- as.factor(dat[,i])
}

# compute polychoric correlations
pc <- hetcor(dat,ML=T)

# run FA
faPC <- fa(r=pc$correlations, nfactors = 2, rotate="varimax",fm="ml")

factor.scores(dat_orig, faPC)

本质上,您正在做的是:

  1. 计算多元相关矩阵
  2. 使用该矩阵进行因子分析并提取 2 个因子和相关载荷
  3. 使用来自 FA 的负载和原始(数字)数据来获取您的因子分数

此方法和您在编辑中使用的方法都将原始数据视为数字而不是因子。我认为这应该没问题,因为您只是将原始数据投影到 FA 确定的因素上,并且那里的负载已经考虑到变量的序数性质(因为您使用多色矩阵作为输入到FA)。然而,上面链接的帖子对这种方法提出了警告,并提出了一些替代方案,但这不是一个简单的问题要解决

于 2018-11-10T21:47:57.110 回答