繁体   English   中英

如何从事实上创造因素?

[英]How to create factors from factanal?

当使用factalal执行因子分析时,通常的结果是一些加载表加上其他几个信息。 有没有直接的方法来使用这些加载来创建因子的矩阵/数据框架? 例如,稍后在回归分析中使用它们。

编辑:这样做的目的是获取后续建模的变量。 我只知道因子分数 - 但欢迎提出/指出其他术语:)

EDIT2:Joris Meys的回答基本上就是我的要求。 尽管它将我的问题转移到可能更适合statsoverflow的方向,但我现在将它保留在这里,因为正确的一组人正在讨论解决方案:

基于回归的分数的好处是什么? 产品(ML)的结果与因素高度相关......老实说,我想知道为什么差异在我的情况下很大?

 fa$scores # the correct solution
 fac <- m1 %*% loadings(fa) # the answer on your question
 diag(cor(fac,fa$scores))
 #returns:
Factor1   Factor2   Factor3 
0.8309343 0.8272019 0.8070837 

您询问如何使用载荷来构建分数。 您的解决方案虽然正确,但却没有这样做。 它使用回归方法(或者也可以使用Bartlett的方法),这使用分数不相关的限制,以0为中心,方差= 1.因此,这些因素与使用F得到的因素不同= ML,其中F为因子矩阵,M为原始矩阵,L为加载矩阵。

使用帮助文件中的示例进行演示:

v1 <- c(1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,4,5,6)
v2 <- c(1,2,1,1,1,1,2,1,2,1,3,4,3,3,3,4,6,5)
v3 <- c(3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,5,4,6)
v4 <- c(3,3,4,3,3,1,1,2,1,1,1,1,2,1,1,5,6,4)
v5 <- c(1,1,1,1,1,3,3,3,3,3,1,1,1,1,1,6,4,5)
v6 <- c(1,1,1,2,1,3,3,3,4,3,1,1,1,2,1,6,5,4)
m1 <- cbind(v1,v2,v3,v4,v5,v6)

fa <- factanal(m1, factors=3,scores="regression")

fa$scores # the correct solution

fac <- m1 %*% loadings(fa) # the answer on your question

这些显然是不同的价值观。

编辑:这与Thomson回归分数基于缩放变量的事实有关,并考虑相关矩阵。 如果你手动计算得分,你会做:

> fac2 <- scale(m1) %*% solve(cor(m1)) %*% loadings(fa)
> all.equal(fa$scores,as.matrix(fac2))
[1] TRUE

有关更多信息,请参阅此评论

并告诉你为什么它很重要:如果你以“天真”的方式计算分数,你的分数实际上是相关的。 这就是你想要摆脱的第一个地方:

> round(cor(fac),2)
        Factor1 Factor2 Factor3
Factor1    1.00    0.79    0.81
Factor2    0.79    1.00    0.82
Factor3    0.81    0.82    1.00

> round(cor(fac2),2)
        Factor1 Factor2 Factor3
Factor1       1       0       0
Factor2       0       1       0
Factor3       0       0       1

我没有手动检查过,但是这样做:

fa <-  factanal(mydf,3,rotation="varimax",scores="regression")
fa$scores

HTH别人。 建议,更正,改进欢迎!

你不想要loadings组件吗?

loadings(fa)

请参阅?loadings?factanal以检查它是否是您想要的装载量。 我发现使用的术语有时令人困惑,加载,分数,......

有关Psych SE的问题也有类似的问题。

在那里,我提供了一个函数,以防你想为新数据生成因子分数。


我编写了以下函数,该函数接受由您提供的factanal和new数据返回的fit对象(例如,具有相同变量名的数据框或矩阵)。

score_new_data <- function(fit, data) {
    z <- as.matrix(scale(data[,row.names(fit$correlation)]))
    z %*% solve(fit$correlation, fit$loadings)
}

所以,例如,

bfi <- na.omit(bfi)
variables <- c("A1", "A2", "A3", "A4", "C1", "C2", "C3", "C4")
data <- bfi[,variables]
fit <- factanal(data, factors = 2, scores = "regression", rotation = "varimax")

这是典型的因素分析。

现在提供一些新数据以及因子分析的拟合:

score_new_data(fit, data[1:5, ])

它会产生以下结果:

> score_new_data(fit, data[1:5, ])
         Factor1    Factor2
61623  1.5022427  0.5457393
61629 -0.6817812 -0.9755466
61634 -0.2901822  0.1051234
61640  0.5429929 -0.4955180
61661 -1.0732722  0.8202019

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM