Шукаємо крок на прикладі факторного аналізу на дихотомічні дані (бінарні змінні) за допомогою R


14

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

Я бачив реакцію CHL в на кілька Двійники питання , і я також бачив відповідь ttnphns ' , але я шукаю що - то ще прописано , крок через приклад я можу працювати з.

Хтось тут знає про такий крок через приклад факторного аналізу бінарних змінних за допомогою R?

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

Я також повинен додати, що я працюю з усталеним інструментом, який має три виміри, до якого ми додали додаткові запитання, і тепер ми сподіваємося знайти чотири різних аспекти. Крім того, розмір вибірки становить лише , і наразі у нас є 19 елементів. Я порівняв наш розмір вибірки та нашу кількість предметів із низкою статей з психології, і ми, безумовно, в нижній частині, але ми хотіли все-таки спробувати. Хоча це не важливо для того, щоб проглянути крок через приклад, який я шукаю, а приклад каракалу нижче виглядає справді дивовижно. Я буду працювати по-своєму, використовуючи свої дані, перш за все, вранці.н=15319


1
Оскільки FA не може бути найкращим вибором, залежно від питання, яке вас цікавить, ви могли б сказати більше про контекст свого дослідження?
chl

@chl, спасибі за відповідь на моє запитання, ми досліджуємо лежить в основі фактора структури деяких питань , що стосуються ПТСР. Нас цікавить 1) визначення деяких доменів (кластерів) та 2) дослідження, наскільки різні питання завантажуються на кожен домен .
Eric Fail

1
Просто напевне: (а) який ваш розмір вибірки; (б) це вже існуючий (вже затверджений) інструмент або саморобний опитувальник?
chl

@chl, я дуже вдячний за ваші запитання. (a) Наш розмір вибірки , і в даний час у нас є 19 елементів. Я порівняв наш розмір вибірки та нашу кількість предметів з тим, що я міг знайти у «Журналі травматичного стресу», і ми, безумовно, в нижньому кінці, але ми хотіли все-таки спробувати. (b) Ми використовуємо існуючий інструмент, але додано деякі власні запитання, оскільки, на нашу думку, вони відсутні . н=153
Eric Fail

1
Добре, дякую за це. Це має бути легко налагодити робочий приклад із ілюстрацією в Р.
chl

Відповіді:


22

Я вважаю, що фокус питання полягає не в теоретичній стороні, а більше з практичної сторони, тобто як реалізувати факторний аналіз дихотомічних даних у Р.

Спочатку давайте змоделюємо 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)

х=Λf+ехΛfе

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

Тепер використовуйте поліхіричну кореляційну матрицю, щоб зробити звичайну ФА. Зауважимо, що передбачувані навантаження досить схожі на завантажені з безперервних даних.

> 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дозволяє якимось чином оцінити показник коефіцієнтів, коли замість звичайного Пірсона r використовуються полі / тетра-хоричні кореляції?
ttnphns

3
Вибачте, @caracal, я не користувач R. Ось чому я це запитую. Оскільки ви використовували не оригінальний Пірсон r, а тетрахорний r, ви втратили прямий лінійно-алгебраїчний зв’язок між вихідними бінарними даними та матрицею завантаження. Я думаю, що в цьому випадку замість класичної регресії / Бартлетта буде використано якесь спеціальне альго (наприклад, на основі підходу ЕМ). Так чи psychдає це через те, що ми мали справу з тетрахоричним r, а не звичайним r, коли він обчислює коефіцієнти чи ні?
ttnphns

1
@EricFail Оскільки оцінюються матриці поліхоричної кореляції шляхом попарних кореляцій, непозитивна визначена кінцева матриця дійсно стає більш поширеною, оскільки кількість змінних збільшується, а кількість спостережень фіксується (див. Цю дискусію MPlus ). Функції, подібні nearcor()до sfsmiscабо cor.smooth()від psych, використовуються для цього випадку.
каракал

1
@ttnphns Вибачте, я неправильно зрозумів ваше запитання. Гарне питання! Спочатку я припускав, що щось на кшталт технічного додатку MPlus було реалізовано, але, дивлячись на код для psych's factor.scores(), це не так. Натомість бали обчислюються так само, як у безперервному випадку. Однак factor.scores()функція в пакеті, ltmздається, реалізує правильні процедури, дивіться цей приклад -> "Факторні показники - Оцінки можливостей" та сторінку довідки.
каракал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.