Procurando um passo através de um exemplo de uma análise fatorial em dados dicotômicos (variáveis ​​binárias) usando R

14

Eu tenho alguns dados dicotômicos, apenas variáveis ​​binárias, e meu chefe me pediu para realizar uma análise fatorial usando a matriz de correlações tetracóricas. Anteriormente, eu fui capaz de me ensinar a executar análises diferentes com base nos exemplos aqui e no site de estatísticas da UCLA e em outros sites como esse, mas não consigo encontrar um passo no exemplo de uma análise fatorial sobre dicotômica. dados (variáveis ​​binárias) usando R.

Eu vi a resposta de chl a uma pergunta um tanto semelhante e também vi a resposta dos tnphns , mas estou procurando algo ainda mais detalhado , um passo em um exemplo com o qual posso trabalhar.

Alguém aqui conhece esse passo através de um exemplo de análise fatorial em variáveis ​​binárias usando R?

Atualização 2012-07-11 22: 03: 35Z

Devo acrescentar também que estou trabalhando com um instrumento estabelecido, que possui três dimensões, às quais adicionamos algumas perguntas adicionais e agora esperamos encontrar quatro dimensões distintas. Além disso, nosso tamanho de amostra é de apenas , e atualmente temos 19 itens. Comparei o tamanho da amostra e o número de itens com vários artigos de psicologia e, definitivamente, estamos no nível mais baixo, mas queríamos tentar de qualquer maneira. No entanto, isso não é importante para o exemplo passo a passo que estou procurando e o exemplo de caracal abaixo parece realmente incrível. Vou trabalhar no meu caminho usando meus dados logo de manhã.n=15319

Eric Fail
fonte
1
Como a FA pode não ser necessariamente a melhor escolha, dependendo da pergunta em que você está interessado, você poderia dizer mais sobre o contexto do seu estudo?
chl
@chl, obrigado por responder à minha pergunta, estamos investigando a estrutura fatorial subjacente de algumas perguntas relacionadas ao TEPT. Estamos interessados ​​em 1) identificar alguns domínios (clusters) e 2) investigar quanto as diferentes perguntas carregam em cada domínio .
Eric Fail
1
Só para ter certeza, (a) qual é o tamanho da sua amostra, (b) este é um instrumento existente (já validado) ou um questionário feito por você mesmo?
chl
@chl, eu realmente aprecio suas perguntas. (a) Nosso tamanho da amostra é e atualmente temos 19 itens. Comparei o tamanho da amostra e o número de itens com o que encontrei no Journal of Traumatic Stress e estamos definitivamente na extremidade inferior, mas queríamos tentar de qualquer maneira. (b) Estamos usando um instrumento existente, mas com algumas perguntas feitas por nós mesmas, pois acreditamos que elas estão faltando . n=153
Eric Fail
1
Ok, obrigado por isso. Isso deve ser fácil de configurar um exemplo de trabalho com ilustração em R.
chl

Respostas:

22

Entendo que o foco da questão é menos no lado teórico e mais no lado prático, ou seja, como implementar uma análise fatorial de dados dicotômicos em R.

Primeiro, vamos simular 200 observações de 6 variáveis, provenientes de 2 fatores ortogonais. Vou dar algumas etapas intermediárias e começar com dados contínuos normais multivariados que mais tarde dicotomizamos. Dessa forma, podemos comparar as correlações de Pearson com as correlações policóricas e comparar as cargas fatoriais de dados contínuos com as dos dados dicotômicos e as cargas verdadeiras.

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=Λf+exΛfe

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

Faça a análise fatorial para os dados contínuos. As cargas estimadas são semelhantes às verdadeiras ao ignorar o sinal irrelevante.

> 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       

Agora vamos dicotomizar os dados. Manteremos os dados em dois formatos: como um quadro de dados com fatores ordenados e como uma matriz numérica. hetcor()from package polycornos fornece a matriz de correlação policórica que usaremos posteriormente para a 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

Agora use a matriz de correlação policórica para fazer uma FA regular. Observe que as cargas estimadas são bastante semelhantes às dos dados contínuos.

> 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       

Você pode pular a etapa de cálculo da matriz de correlação policórica e usar diretamente fa.poly()do pacote psych, que faz a mesma coisa no final. Esta função aceita os dados dicotômicos brutos como uma matriz numérica.

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

EDIT: Para pontuações de fatores, observe o pacote ltmque possui uma factor.scores()função especificamente para dados de resultados politômicos. Um exemplo é fornecido nesta página -> "Pontuações fatoriais - Estimativas de capacidade".

Você pode visualizar as cargas a partir da análise fatorial usando factor.plot()e fa.diagram(), ambos do pacote psych. Por algum motivo, factor.plot()aceita apenas o $facomponente do resultado fa.poly(), não o objeto completo.

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

saída de factor.plot () e fa.diagram ()

A análise paralela e uma análise de "estrutura muito simples" fornecem ajuda na seleção do número de fatores. Novamente, o pacote psychtem as funções necessárias. vss()toma a matriz de correlação policórica como argumento.

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

A análise paralela da FA policromada também é fornecida pelo pacote random.polychor.pa.

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

saída de fa.parallel.poly () e random.polychor.pa ()

Observe que as funções fa()e fa.poly()oferecem muitas outras opções para configurar a FA. Além disso, editei parte da saída que fornece testes de ajuste de qualidade etc. A documentação para essas funções (e o pacote psychem geral) é excelente. Este exemplo aqui destina-se apenas a você começar.

caracal
fonte
Seu passo pelo exemplo parece ótimo. Vou trabalhar no meu caminho usando meus dados pela manhã e voltarei para você. Obrigado por dedicar um tempo para escrever isso. Se você tiver algumas referências teóricas, eu também estaria interessado nelas. Chl recomendou o livro-texto de Revelle para psicometria em R e eu definitivamente vou dar uma olhada nisso. Obrigado
Eric Fail
@caracal: psychpermite estimar de alguma forma as pontuações dos fatores quando correlações poli / tetra-coricas são usadas no lugar da usual Pearson r?
ttnphns
3
Desculpe, @caracal, eu não sou usuário de R. É por isso que estou perguntando. Como você não usou o Pearson r original, mas o tetracórico, perdeu o vínculo algébrico linear direto entre os dados binários originais e a matriz de carregamento. Eu imagino que, neste caso, algum algo especial seria usado (por exemplo, com base na abordagem EM) no lugar da regressão clássica / Bartlett. Então, isso se psychdeve ao fato de estarmos lidando com r tetracórico, não r usual, quando calcula escores fatoriais ou não?
22412 jtc: /
1
@EricFail Como as matrizes de correlação policórica são estimadas através das correlações aos pares, uma matriz final definida não positiva se torna mais comum à medida que o número de variáveis ​​aumenta e o número de observações é fixo (consulte esta discussão do MPlus ). Funções como nearcor()de sfsmiscou cor.smooth()de psychsão usadas para este caso.
Caracal
1
@ttnphns Desculpe, não entendi sua pergunta. Boa pergunta! Originalmente, assumi que algo como o apêndice técnico 11 do MPlus foi implementado, mas olhando o código para psych's factor.scores(), esse não é o caso. Em vez disso, as pontuações são calculadas como no caso contínuo. No entanto, a factor.scores()função no pacote ltmparece implementar os procedimentos corretos, consulte este exemplo -> "Pontuações fatoriais - estimativas de capacidade" e a página de ajuda.
caracal