Buscando un paso a través de un ejemplo de análisis factorial en datos dicotómicos (variables binarias) usando R

14

Tengo algunos datos dicotómicos, solo variables binarias, y mi jefe me pidió que realizara un análisis factorial utilizando la matriz de correlaciones tetracóricas. Anteriormente, he podido enseñarme a mí mismo cómo ejecutar diferentes análisis basados ​​en los ejemplos aquí y en el sitio de estadísticas de la UCLA y en otros sitios como este, pero parece que no puedo encontrar un paso a través de un ejemplo de análisis factorial en dicotomía datos (variables binarias) usando R.

Vi la respuesta de chl a una pregunta algo similar y también vi la respuesta de ttnphns , pero estoy buscando algo aún más detallado , un paso a través de un ejemplo con el que puedo trabajar.

¿Alguien aquí sabe de tal paso a través de un ejemplo de un análisis factorial en variables binarias usando R?

Actualización 2012-07-11 22: 03: 35Z

También debo agregar que estoy trabajando con un instrumento establecido, que tiene tres dimensiones, a lo que hemos agregado algunas preguntas adicionales y ahora esperamos encontrar cuatro dimensiones distintas. Además, nuestro tamaño de muestra es solo , y actualmente tenemos 19 artículos. Comparé nuestro tamaño de muestra y nuestro número de artículos con varios artículos de psicología y definitivamente estamos en el extremo inferior, pero queríamos probarlo de todos modos. Sin embargo, esto no es importante para el ejemplo paso a paso que estoy buscando y el ejemplo de Caracal a continuación se ve realmente increíble. Trabajaré a través de ellos usando mis datos a primera hora de la mañana.norte=15319

Eric Fail
fuente
1
Como FA podría no ser necesariamente la mejor opción, dependiendo de la pregunta que le interese, ¿podría decir más sobre el contexto de su estudio?
chl
@chl, gracias por responder a mi pregunta, estamos investigando la estructura de factores subyacente de algunas preguntas relacionadas con el TEPT. Estamos interesados ​​en 1) identificar algunos dominios (grupos) y 2) investigar cuánto se cargan las diferentes preguntas en cada dominio .
Eric Fail
1
Solo para estar seguro, (a) cuál es el tamaño de su muestra, (b) ¿se trata de un instrumento existente (ya validado) o de un cuestionario hecho a sí mismo?
chl
@chl, realmente aprecio tus preguntas. (a) Nuestro tamaño de muestra es , y actualmente tenemos 19 artículos. Comparé nuestro tamaño de muestra y nuestra cantidad de artículos con lo que pude encontrar en Journal of Traumatic Stress y definitivamente estamos en el extremo inferior, pero queríamos probarlo de todos modos. (b) Estamos utilizando un instrumento existente, pero con algunas preguntas hechas por nosotros mismos, ya que creemos que faltan . norte=153
Eric Fail
1
Ok, gracias por esto. Debería ser fácil configurar un ejemplo de trabajo con ilustración en R.
chl

Respuestas:

22

Supongo que el foco de la pregunta es menos en el lado teórico y más en el lado práctico, es decir, cómo implementar un análisis factorial de datos dicotómicos en R.

Primero, simulemos 200 observaciones de 6 variables, provenientes de 2 factores ortogonales. Tomaré un par de pasos intermedios y comenzaré con datos continuos normales multivariados que luego dicotomizaré. De esa manera, podemos comparar las correlaciones de Pearson con las correlaciones policóricas, y comparar las cargas de factores de datos continuos con las de datos dicotómicos y las cargas reales.

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+miXΛFmi iid, media 0, errores normales.

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

Haga el análisis factorial para los datos continuos. Las cargas estimadas son similares a las verdaderas cuando se ignora el signo 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       

Ahora vamos a dicotomizar los datos. Mantendremos los datos en dos formatos: como un marco de datos con factores ordenados y como una matriz numérica. hetcor()del paquetepolycor nos da la matriz de correlación policórica que luego usaremos para la 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

Ahora use la matriz de correlación policórica para hacer un FA regular. Tenga en cuenta que las cargas estimadas son bastante similares a las de los datos continuos.

> 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       

Puede omitir el paso de calcular la matriz de correlación policórica usted mismo y usar directamente fa.poly()desde el paquetepsych , que al final hace lo mismo. Esta función acepta los datos dicotómicos en bruto como una matriz numérica.

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

EDITAR: Para puntajes de factores, mire el paquete ltmque tiene unfactor.scores() función específica para datos de resultados politómicos. Se proporciona un ejemplo en esta página -> "Puntajes de factor - Estimaciones de habilidad".

Puede visualizar las cargas del análisis factorial usando factor.plot()y fa.diagram(), tanto del paquete psych. Por alguna razón, factor.plot()acepta solo el $facomponente del resultado de fa.poly(), no el objeto completo.

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

salida de factor.plot () y fa.diagram ()

El análisis paralelo y un análisis de "estructura muy simple" proporcionan ayuda para seleccionar la cantidad de factores. Nuevamente, el paquete psychtiene las funciones requeridas. vss()toma la matriz de correlación policórica como argumento.

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

El paquete también proporciona un análisis paralelo para la FA policlorica random.polychor.pa.

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

salida de fa.parallel.poly () y random.polychor.pa ()

Tenga en cuenta que las funciones fa()y fa.poly()proporcionan muchas más opciones para configurar la FA. Además, edité algunos de los resultados que ofrecen pruebas de bondad de ajuste, etc. La documentación para estas funciones (y paquetepsych en general) es excelente. Este ejemplo aquí solo tiene la intención de comenzar.

lince
fuente
Su ejemplo paso a paso se ve muy bien. Trabajaré a través de ellos utilizando mis datos en la mañana y me pondré en contacto con usted. Gracias por tomarse el tiempo para escribir esto. Si tiene algunas referencias teóricas, también me interesarían. Chl recomendó el libro de texto de Revelle para psicometría en R y definitivamente voy a echarle un vistazo. Gracias
Eric Fail
@caracal: ¿ psychpermite de alguna manera estimar los puntajes de los factores cuando se usan correlaciones poli / tetracóricas en lugar de las habituales Pearson r?
ttnphns
3
Lo siento, @caracal, no soy usuario de R. Por eso lo pregunto. Como no usó Pearson r original sino tetrachoric r, perdió el vínculo lineal-algebraico directo entre los datos binarios originales y la matriz de carga. Me imagino que en este caso se usaría algo especial (por ejemplo, basado en el enfoque EM) en lugar de la regresión clásica / Bartlett. Entonces, ¿se psychdebe al hecho de que estábamos tratando con r tetracórico, no r habitual, cuando calcula puntajes de factores, o no?
ttnphns
1
@EricFail A medida que se calculan las matrices de correlación policóricas a través de las correlaciones por pares, una matriz final definida no positiva se vuelve más común a medida que aumenta el número de variables, y el número de observaciones es fijo (ver esta discusión de MPlus ). Se utilizan funciones como nearcor()from sfsmisco cor.smooth()from psychpara este caso.
caracal
1
@ttnphns Lo siento, no entendí tu pregunta. ¡Buena pregunta! Originalmente asumido que algo así como MPlus apéndice técnico 11 se puso en práctica, pero mirando el código para psych's factor.scores(), este no es el caso. En cambio, los puntajes se calculan como en el caso continuo. Sin embargo, la factor.scores()función en el paquete ltmparece implementar los procedimientos correctos, vea este ejemplo -> "Puntajes de factores - Estimaciones de habilidad" y la página de ayuda.
caracal