Как создать факторы из фактаналя?
При выполнении факторного анализа с использованием фактаналя обычным результатом является некоторая таблица нагрузок плюс несколько других сведений. Есть ли прямой способ использовать эти загрузки для создания матрицы / data.frame факторов? Например, чтобы использовать их в регрессионном анализе позже.
РЕДАКТИРОВАТЬ: цель этого состоит в том, чтобы получить переменные для последующего моделирования. Я знаю только о факторных показателях - но предложения / указатели на другую терминологию приветствуются:)
РЕДАКТИРОВАТЬ 2: ответ 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
4 ответа
Вы спрашивали, как использовать нагрузки для построения партитур. Ваше решение, хотя и правильное, не делает этого. Он использует метод регрессии (в качестве альтернативы вы можете также использовать метод Бартлетта), и это использует ограничение, что оценки некоррелированы, сосредоточены вокруг 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
Это явно разные значения.
Изменить: Это связано с тем, что регрессионные оценки Томсона основаны на масштабированных переменных, и принимать во внимание матрицу корреляции. Если бы вы вычислили баллы вручную, вы бы сделали:
> 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
и новые данные, которые вы предоставляете (например, фрейм данных или матрица с идентичными именами переменных).
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