Подтвердить что ты не робот

Как создать факторы из factanal?

При выполнении факторного анализа с использованием factanal обычным результатом является некоторая таблица нагрузок плюс несколько других данных. Есть ли прямой способ использовать эти нагрузки для создания матрицы /data.frame факторов? Например, чтобы использовать их в регрессионном анализе позже.

EDIT: целью этого является получение переменных для последующего моделирования. Я знаю только оценки факторов - но предложения/указатели на другую терминологию приветствуются:)

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 
4b9b3361

Ответ 1

Вы спросили, как использовать нагрузки для построения баллов. Ваше решение, хотя и верно, не делает этого. Он использует метод регрессии (в качестве альтернативы вы также можете использовать метод Бартлетта), и это использует ограничение, что баллы некоррелированы, с центром в 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

Ответ 2

Я не проверял его вручную, но вот как это сделать:

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

HTH кто-то другой. Предложения, исправления, улучшения приветствуются!

Ответ 3

Вам не нужен компонент loadings?

loadings(fa)

См. ?loadings и ?factanal, чтобы проверить, что это нагрузки, которые вы хотите. Я нахожу терминологию, используемую так запутанной время от времени, что с нагрузками, оценками,...