Как создать факторы из фактаналя? - PullRequest
11 голосов
/ 10 ноября 2010

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

РЕДАКТИРОВАТЬ: цель этого - получить переменные для последующего моделирования.Я знаю только о факторных показателях - но предложения / указатели на другую терминологию приветствуются:)

РЕДАКТИРОВАТЬ2: Ответ Джорис Мейс в основном то, что я просил.Тем не менее, хотя это и продвигает мой вопрос в направлении, которое может лучше подходить для 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 ]

22 голосов
/ 10 ноября 2010

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

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

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

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

2 голосов
/ 10 ноября 2010

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

loadings(fa)

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

1 голос
/ 07 августа 2018

Аналогичный вопрос был задан на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...