Ищем шаг на примере факторного анализа дихотомических данных (бинарных переменных) с использованием R

14

У меня есть некоторые дихотомические данные, только двоичные переменные, и мой начальник попросил меня выполнить факторный анализ с использованием матрицы тетрахорических корреляций. Ранее я был в состоянии научить себя, как проводить различные анализы, основываясь на примерах здесь и на сайте статистики UCLA и других подобных сайтах, но я не могу найти шаг к примеру факторного анализа на дихотомических данные (двоичные переменные) с использованием R.

Я видел ответ chl на несколько схожий вопрос, и я также видел ответ ttnphns , но я ищу что-то еще более понятное , шаг через пример, с которым я могу работать.

Кто-нибудь здесь знает о таком шаге на примере факторного анализа двоичных переменных с использованием R?

Обновление 2012-07-11 22: 03: 35Z

Я должен также добавить, что я работаю с устоявшимся инструментом, который имеет три измерения, к которым мы добавили несколько дополнительных вопросов, и теперь мы надеемся найти четыре отдельных измерения. Кроме того, наш размер выборки составляет всего , и в настоящее время у нас есть 19 наименований. Я сравнил размер нашей выборки и количество предметов с рядом статей по психологии, и мы определенно находимся в нижней части, но мы все равно хотели попробовать. Хотя это не важно для пошагового примера, который я ищу, и приведенный ниже пример Каракала выглядит действительно потрясающе. Я буду работать через него, используя мои данные первым делом утром.Nзнак равно15319

Эрик Фэйл
источник
1
Поскольку FA не обязательно является лучшим выбором, в зависимости от интересующего вас вопроса, не могли бы вы сказать больше о контексте вашего исследования?
chl
@ CHL, спасибо, что ответили на мой вопрос, мы изучаем структуру основных факторов некоторых вопросов, касающихся ПТСР. Мы заинтересованы в том, чтобы: 1) идентифицировать некоторые домены (кластеры) и 2) исследовать, насколько разные вопросы загружают каждый домен .
Эрик Фейл
1
Просто чтобы быть уверенным, (а) каков ваш размер выборки, (б) это уже существующий (уже утвержденный) инструмент или вопросник, созданный самостоятельно?
chl
@ CHL, я очень ценю твои вопросы. (a) Размер нашей выборки , и в настоящее время у нас 19 товаров. Я сравнил размер нашей выборки и количество предметов с тем, что смог найти в «Журнале травматического стресса», и мы определенно находимся в нижней части, но мы все равно хотели попробовать. (b) Мы используем существующий инструмент, но с некоторыми добавленными самостоятельно вопросами, поскольку мы считаем, что они отсутствуют . Nзнак равно153
Эрик Фейл
1
Хорошо, спасибо за это. Это должно быть легко создать рабочий пример с иллюстрацией в R.
chl

Ответы:

22

Я полагаю, что в центре внимания вопроса находится не столько теоретическая, сколько практическая сторона, т. Е. Как реализовать факторный анализ дихотомических данных в R.

Во-первых, давайте смоделируем 200 наблюдений от 6 переменных, исходя из 2 ортогональных факторов. Я сделаю пару промежуточных шагов и начну с многомерных нормальных непрерывных данных, которые я позже разделю. Таким образом, мы можем сравнивать корреляции Пирсона с полихорическими корреляциями и сравнивать факторные нагрузки из непрерывных данных с данными из дихотомических данных и истинных нагрузок.

set.seed(1.234)
N <- 200                             # number of observations
P <- 6                               # number of variables
Q <- 2                               # number of factors

# true P x Q loading matrix -> variable-factor correlations
Lambda <- matrix(c(0.7,-0.4, 0.8,0, -0.2,0.9, -0.3,0.4, 0.3,0.7, -0.8,0.1),
                 nrow=P, ncol=Q, byrow=TRUE)

Иксзнак равноΛе+еИксΛее н.о.р., средних 0, обычных ошибок.

library(mvtnorm)                      # for rmvnorm()
FF  <- rmvnorm(N, mean=c(5, 15), sigma=diag(Q))    # factor scores (uncorrelated factors)
E   <- rmvnorm(N, rep(0, P), diag(P)) # matrix with iid, mean 0, normal errors
X   <- FF %*% t(Lambda) + E           # matrix with variable values
Xdf <- data.frame(X)                  # data also as a data frame

Сделайте факторный анализ для непрерывных данных. Расчетные нагрузки аналогичны истинным при игнорировании не относящегося к делу знака.

> library(psych) # for fa(), fa.poly(), factor.plot(), fa.diagram(), fa.parallel.poly, vss()
> fa(X, nfactors=2, rotate="varimax")$loadings     # factor analysis continuous data
Loadings:
     MR2    MR1   
[1,] -0.602 -0.125
[2,] -0.450  0.102
[3,]  0.341  0.386
[4,]  0.443  0.251
[5,] -0.156  0.985
[6,]  0.590       

Теперь давайте дихотомизируем данные. Мы будем хранить данные в двух форматах: в виде фрейма данных с упорядоченными коэффициентами и в виде числовой матрицы. hetcor()из пакетаpolycor дает нам полихорическую корреляционную матрицу, которую мы позже будем использовать для FA.

# dichotomize variables into a list of ordered factors
Xdi    <- lapply(Xdf, function(x) cut(x, breaks=c(-Inf, median(x), Inf), ordered=TRUE))
Xdidf  <- do.call("data.frame", Xdi) # combine list into a data frame
XdiNum <- data.matrix(Xdidf)         # dichotomized data as a numeric matrix

library(polycor)                     # for hetcor()
pc <- hetcor(Xdidf, ML=TRUE)         # polychoric corr matrix -> component correlations

Теперь используйте полихорическую корреляционную матрицу, чтобы сделать обычную FA. Обратите внимание, что расчетные нагрузки довольно похожи на те, которые получены из непрерывных данных.

> faPC <- fa(r=pc$correlations, nfactors=2, n.obs=N, rotate="varimax")
> faPC$loadings
Loadings:
   MR2    MR1   
X1 -0.706 -0.150
X2 -0.278  0.167
X3  0.482  0.182
X4  0.598  0.226
X5  0.143  0.987
X6  0.571       

Вы можете пропустить шаг вычисления полихорической корреляционной матрицы самостоятельно и напрямую использовать fa.poly()из пакета psych, который в конце концов делает то же самое. Эта функция принимает необработанные дихотомические данные в виде числовой матрицы.

faPCdirect <- fa.poly(XdiNum, nfactors=2, rotate="varimax")    # polychoric FA
faPCdirect$fa$loadings        # loadings are the same as above ...

РЕДАКТИРОВАТЬ: Для оценки факторов, посмотрите на пакет, ltmкоторый имеет factor.scores()функцию специально для данных о политомных результатах. Пример приведен на этой странице -> «Факторные оценки - оценки способностей».

Вы можете визуализировать загрузки из факторного анализа, используя factor.plot()и fa.diagram(), и из пакета psych. По какой-то причине factor.plot()принимает только $faкомпонент результата из fa.poly(), а не полный объект.

factor.plot(faPCdirect$fa, cut=0.5)
fa.diagram(faPCdirect)

вывод из factor.plot () и fa.diagram ()

Параллельный анализ и анализ «очень простой структуры» помогают в выборе ряда факторов. Опять же, пакет psychимеет необходимые функции. vss()принимает полихорическую корреляционную матрицу в качестве аргумента.

fa.parallel.poly(XdiNum)      # parallel analysis for dichotomous data
vss(pc$correlations, n.obs=N, rotate="varimax")   # very simple structure

Параллельный анализ для полихорического ЖК также предоставляется пакетом random.polychor.pa.

library(random.polychor.pa)    # for random.polychor.pa()
random.polychor.pa(data.matrix=XdiNum, nrep=5, q.eigen=0.99)

вывод из fa.parallel.poly () и random.polychor.pa ()

Обратите внимание, что функции fa()и fa.poly()предоставляют множество других возможностей для настройки FA. Кроме того, я отредактировал некоторые выходные данные, которые дают хорошие тесты соответствия и т. Д. Документация для этих функций (и пакета psychв целом) превосходна. Этот пример предназначен только для начала.

каракал
источник
Ваш шаг через пример выглядит великолепно. Я проработаю свой путь через мои данные утром и вернусь к вам. Спасибо, что нашли время, чтобы написать это. Если у вас есть некоторые теоретические ссылки, я бы также заинтересовался ими. Хл порекомендовал учебник Ревелла по психометрии в R, и я определенно собираюсь взглянуть на это. Спасибо
Эрик Фейл
@caracal: psychпозволяет ли как-то оценивать факторные оценки, когда вместо обычного Пирсона г используются поли / тетрахорические корреляции?
ttnphns
3
Извините, @caracal, я не пользователь R. Вот почему я спрашиваю это. Поскольку вы использовали не оригинальный Pearson r, а тетрахорический r, вы потеряли прямую линейно-алгебраическую связь между исходными двоичными данными и матрицей загрузки. Я полагаю, что в этом случае вместо классической регрессии / Бартлетта будет использоваться какой-то особый алгоритм (например, основанный на EM-подходе). Так psychпочему же это связано с тем, что мы имели дело с тетрахорическим r, а не с обычным r, когда он вычисляет факторные оценки, или нет?
ttnphns
1
@EricFail Поскольку полихорические корреляционные матрицы оцениваются путем прохождения парных корреляций, неположительно определенная конечная матрица действительно становится все более распространенной, поскольку число переменных увеличивается, а количество наблюдений фиксировано (см. Это обсуждение MPlus ). В этом случае используются такие функции, как nearcor()from sfsmiscили cor.smooth()from psych.
Каракал
1
@ttnphns Извините, я неправильно понял ваш вопрос. Хороший вопрос! Первоначально я предполагал, что реализовано что-то вроде технического приложения MPlus 11, но, глядя на код для psychs factor.scores(), это не так. Вместо этого баллы рассчитываются так же, как в непрерывном случае. Однако, похоже , что factor.scores()функция в пакете ltmреализует правильные процедуры, см. Этот пример -> «Факторные оценки - оценки возможностей» и страницу справки.
Каракал