【发布时间】:2015-04-03 23:03:16
【问题描述】:
使用 stats 包中的 factanal 函数进行因子分析时。
我尝试了以下事情。
library(mirt)
library(ltm)
library(psych)
library(stats)
data(SAT12)
data=SAT12
cor_mat=polychoric(data, ML=TRUE, global=F)
fit <- factanal(factors=2, n.obs=nrow(data), covmat=cor_mat$rho)
Divide_item_Factor_Loading(fit)
当我尝试运行 Divide_item_Factor_Loading(fit) 时出现一个名为
的错误 Error in a[[i]][[2]] : subscript out of bounds
弹出。
我的 Divide_item_Factor_Loading 完整代码:
Divide_item_Factor_Loading=function(fit)
{
a=list()
items=NULL
for(i in 1:nrow(fit$loadings)) ######corresponding to rows of loading matrix
{
k=which(fit$loadings[i,]==max(abs(fit$loadings[i,])))
a[[i]]=c(i,as.numeric(k))
}
fact_item_mat=matrix(, nrow=nrow(fit$loadings), ncol=ncol(fit$loadings))
for(j in 1:(ncol(fit$loadings)))
{
for(i in 1:(nrow(fit$loadings)))
{
if(a[[i]][[2]]==j) {fact_item_mat[i,j]=a[[i]][[1]]}
}
}
nam=names(fit$loadings[,1])
factor=list()
for(i in 1:ncol(fit$loadings))
{
factor[[i]]=sort(fact_item_mat[,i], decreasing = FALSE, na.last = NA)
fac=factor[[i]]
fac=nam[fac]
factor[[i]]=fac
}
names(factor)=paste("factor", 1:ncol(fit$loadings), sep="")
return(factor)
}
我现在应该采取什么步骤来避免这个错误?
【问题讨论】:
-
正如 Andrei 所说,这只是打印方法——所有值都在负载矩阵中。查看
loadings(fit)和loadings(fit)[]。由于打印方法,它们看起来不同,但加载矩阵是相同的。检查str(loadings(fit))和str(loadings(fit)[])。再次检查loadings(fit)[] == loadings(fit) -
@Irri,在
LSAT数据上传递您的代码不会给我任何错误(尽管“ML 选项已从 psych 包中的 polychoric 函数中删除。请修复通话”)并做Divide_item_Factor_Loading(fit),我得到$factor1 [1] "Item 5" $factor2 [1] "Item 1" "Item 2" "Item 3" "Item 4"。所以,我很抱歉,但我真的不明白你的问题...... -
@CathG,能否请您提供您的电子邮件 ID。这样我就可以给你有问题的数据集。
-
@Irri,我不希望它成为解决方案。你真的应该重新表述你的问题,因为你给出了 2 个有效的例子......相反,你应该给出一个最小的可重复的例子,导致你得到错误(并给出预期的输出)。 Here 是一些可以帮助你的建议。
-
@CathG,我再次编辑了我的问题。我希望这个可以帮助您重现我遇到的错误。
标签: r factor-analysis