Poszukuję przykładu analizy czynnikowej danych dychotomicznych (zmiennych binarnych) przy użyciu R.

14

Mam pewne dychotomiczne dane, tylko zmienne binarne, a mój szef poprosił mnie o wykonanie analizy czynnikowej z wykorzystaniem macierzy korelacji tetrachorycznych. Wcześniej byłem w stanie nauczyć się, jak przeprowadzać różne analizy na podstawie przykładów tutaj i na stronie UCLA ze statystykami i innych podobnych witryn, ale nie wydaje mi się, żebym mógł znaleźć krok przez przykład analizy czynnikowej w przypadku dychotomii dane (zmienne binarne) przy użyciu R.

Widziałem odpowiedź CHL jest do nieco simular pytanie i widziałem też odpowiedź ttnphns' , ale szukam czegoś bardziej wypisanym , krok za przykład mogę pracować.

Czy ktoś tu wie o takim kroku przez przykład analizy czynnikowej zmiennych binarnych przy użyciu R?

Aktualizacja 2012-07-11 22: 03: 35Z

Powinienem również dodać, że pracuję z ugruntowanym instrumentem, który ma trzy wymiary, do którego dodaliśmy kilka dodatkowych pytań i teraz mamy nadzieję znaleźć cztery odrębne wymiary. Co więcej, nasza wielkość próby wynosi tylko , a obecnie mamy pozycji. Porównałem naszą próbkę i liczbę przedmiotów do wielu artykułów z psychologii i zdecydowanie jesteśmy w dolnej części, ale i tak chcieliśmy to wypróbować. Chociaż nie jest to ważne w przypadku przykładu, którego szukam, a poniższy przykład karakala wygląda naprawdę niesamowicie. Najpierw będę pracował przez to, używając moich danych rano.n=15319

Eric Fail
źródło
1
Ponieważ FA niekoniecznie jest najlepszym wyborem, w zależności od interesującego Cię pytania, czy możesz powiedzieć więcej na temat kontekstu swoich badań?
chl
@chl, dziękuję za odpowiedź na moje pytanie, badamy strukturę czynników leżącą u podstaw niektórych pytań dotyczących PTSD. Interesuje nas 1) identyfikacja niektórych domen (klastrów) i 2) sprawdzenie, ile obciążają różne pytania w każdej domenie .
Eric Fail
1
Dla pewności: (a) jaki jest rozmiar próby, (b) czy jest to istniejący (już zwalidowany) instrument czy samodzielnie wykonany kwestionariusz?
chl
@chl, naprawdę doceniam twoje pytania. (a) Nasza wielkość próby wynosi , a obecnie mamy 19 pozycji. Porównałem wielkość próbki i liczbę przedmiotów do tego, co mogłem znaleźć w Journal of Traumatic Stress, i zdecydowanie jesteśmy w dolnej części, ale i tak chcieliśmy spróbować. (b) Korzystamy z istniejącego instrumentu, ale z dodanymi samodzielnie zadawanymi pytaniami, ponieważ naszym zdaniem brakuje ich . n=153
Eric Fail
1
Ok, dzięki za to. To powinno być łatwe do stworzenia działającego przykładu z ilustracją w R.
chl

Odpowiedzi:

22

Rozumiem, że celem tego pytania jest mniej po stronie teoretycznej, a bardziej po stronie praktycznej, tj. Jak wdrożyć analizę czynnikową danych dychotomicznych w R.

Najpierw symulujmy 200 obserwacji z 6 zmiennych pochodzących z 2 czynników ortogonalnych. Zrobię kilka pośrednich kroków i zacznę od wielowymiarowych normalnych ciągłych danych, które później dychotomizuję. W ten sposób możemy porównać korelacje Pearsona z korelacjami polichorycznymi i porównać ładunki czynnikowe z danych ciągłych z danymi dychotomicznymi i ładunkami rzeczywistymi.

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)

x=Λfa+mixΛfami

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

Wykonaj analizę czynnikową dla danych ciągłych. Szacunkowe obciążenia są podobne do rzeczywistych, gdy ignoruje się nieistotny znak.

> 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       

Teraz rozdzielmy dane. Będziemy przechowywać dane w dwóch formatach: jako ramka danych z uporządkowanymi czynnikami oraz jako matryca numeryczna. hetcor()z pakietu polycordaje nam polichoryczną macierz korelacji, którą później wykorzystamy dla 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

Teraz użyj polichorycznej macierzy korelacji, aby wykonać regularny FA. Należy pamiętać, że oszacowane obciążenia są dość podobne do tych z ciągłych danych.

> 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       

Możesz pominąć krok obliczania polichorycznej macierzy korelacji i bezpośrednio użyć fa.poly()pakietu psych, który ostatecznie robi to samo. Ta funkcja przyjmuje surowe dane dychotomiczne jako macierz numeryczną.

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

EDYCJA: Aby uzyskać wyniki czynnikowe, spójrz na pakiet, ltmktóry ma factor.scores()funkcję specjalnie dla danych wyników polimorficznych. Przykład znajduje się na tej stronie -> „Wyniki czynnikowe - Szacunki umiejętności”.

Można wizualizować obciążenia z analizy czynnikowej za pomocą factor.plot()i fa.diagram(), zarówno z pakietu psych. Z jakiegoś powodu factor.plot()akceptuje tylko $faskładnik wyniku fa.poly(), a nie pełny obiekt.

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

dane wyjściowe z factor.plot () i fa.diagram ()

Analiza równoległa i analiza „bardzo prostej struktury” pomagają w wyborze liczby czynników. Ponownie, pakiet psychma wymagane funkcje. vss()przyjmuje jako argument argument polikorycznej macierzy korelacji.

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

Pakiet zapewnia również analizę równoległą dla polichorycznego FA random.polychor.pa.

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

wyjście z fa.parallel.poly () i random.polychor.pa ()

Należy pamiętać, że funkcje fa()i fa.poly()zapewniają wiele, wiele więcej opcji konfiguracji FA. Ponadto zredagowałem niektóre dane wyjściowe, które dają dobre testy dopasowania itp. Dokumentacja tych funkcji (i psychogólnie pakietu ) jest doskonała. Ten przykład tutaj jest po prostu na początek.

karakal
źródło
Twój przykład wygląda świetnie. Poruszę się, używając moich danych rano i skontaktuję się z Tobą. Dziękujemy za poświęcenie czasu na napisanie tego. Jeśli zdarzy ci się mieć jakieś odniesienia teoretyczne, zainteresowałbym się nimi. Chl polecił podręcznik Revelle'a do psychometrii w R i na pewno przyjrzę się temu. Dzięki
Eric Fail
@ caracal: czy psychpozwala w jakiś sposób oszacować wyniki czynnikowe, gdy zamiast zwykłego r Pearsona stosuje się korelacje poli / tetra-choryczne?
ttnphns
3
Przepraszam, @caracal, nie jestem użytkownikiem R. To dlatego pytam go. Ponieważ nie użyłeś oryginalnego Pearsona r, ale tetrachoryczny r, straciłeś bezpośrednie połączenie liniowo-algebraiczne między oryginalnymi danymi binarnymi a macierzą ładowania. Wyobrażam sobie, że w tym przypadku zamiast klasycznej regresji / Bartletta zastosowane zostanie jakieś specjalne algo (np. Oparte na metodzie EM). Czy zatem psychdaje to fakt, że mieliśmy do czynienia z tetrachorycznym r, a nie zwykłym r, gdy oblicza on wyniki czynnikowe, czy nie?
ttnphns
1
@EricFail Ponieważ polichoryczne macierze korelacji szacuje się, przechodząc przez korelacje parami, nie dodatnia określona macierz końcowa rzeczywiście staje się bardziej powszechna wraz ze wzrostem liczby zmiennych, a liczba obserwacji jest stała (patrz dyskusja MPlus ). W tym przypadku używane są funkcje takie jak nearcor()z sfsmisclub cor.smooth()z psych.
caracal
1
@ttnphns Przepraszamy, źle zrozumiałem twoje pytanie. Dobre pytanie! I pierwotnie zakładano, że coś podobnego Mplus dodatku technicznym 11 został zrealizowany, ale patrząc na kodzie psych„s factor.scores(), to nie jest przypadek. Zamiast tego wyniki są obliczane tak jak w przypadku ciągłym. Jednak factor.scores()funkcja w pakiecie ltmwydaje się implementować poprawne procedury, zobacz ten przykład -> „Wyniki czynnikowe - Szacunki umiejętności” i stronę pomocy.
caracal