PoLCA: Análisis de clase latente para variables politómicas

Ejemplo 1: frecuencias de celulares predichos a partir del modelo de clases latentes, tomado en http://dlinzer.github.io/poLCA.

library(scatterplot3d)
library(MASS)
library(poLCA)
data(gss82)
f <- cbind(PURPOSE,ACCURACY,UNDERSTA,COOPERAT)~1
gss.lc2 <- poLCA(f,gss82,nclass=2)
## Conditional item response (column) probabilities,
##  by outcome variable, for each class (row) 
##  
## $PURPOSE
##             Good Depends Waste of time
## class 1:  0.8953  0.0579        0.0468
## class 2:  0.2154  0.2066        0.5780
## 
## $ACCURACY
##           Mostly true Not true
## class 1:       0.6367   0.3633
## class 2:       0.0297   0.9703
## 
## $UNDERSTA
##             Good Fair/Poor
## class 1:  0.8327    0.1673
## class 2:  0.7422    0.2578
## 
## $COOPERAT
##           Interested Cooperative Impatient
## class 1:      0.8840      0.1043    0.0117
## class 2:      0.6478      0.2498    0.1024
## 
## Estimated class population shares 
##  0.8077 0.1923 
##  
## Predicted class memberships (by modal posterior prob.) 
##  0.8136 0.1864 
##  
## ========================================================= 
## Fit for 2 latent classes: 
## ========================================================= 
## number of observations: 1202 
## number of estimated parameters: 13 
## residual degrees of freedom: 22 
## maximum log-likelihood: -2783.268 
##  
## AIC(2): 5592.536
## BIC(2): 5658.729
## G^2(2): 79.33723 (Likelihood ratio/deviance statistic) 
## X^2(2): 93.25329 (Chi-square goodness of fit) 
## 

Valores ajustados de 4,94 para Cooperat = 1 y 0,76 para Cooperat = 2 también aparecieron en la emitida gss.lc2 $ predcell; podemos ahora vemos también que el valor ajustado para Cooperat = 3 es 0,16, cerca del valor observado de cero. — Para hacer una tabla de doble entrada, modificar la especificación del argumento fórmula para contener tanto una fila (COOPERAT) y una variable de columna (UNDERSTA), utilizando de nuevo la condición argumento para sostener fija los valores de las otras dos variables

poLCA.table(formula=COOPERAT~UNDERSTA,condition=list(PURPOSE=3,ACCURACY=1),lc=gss.lc2)
##                   Good Fair/Poor
## Interested  23.1977355 4.9401446
## Cooperative  3.2481178 0.7603666
## Impatient    0.5830962 0.1613173

Multiplicando este porcentaje por el número total de observaciones en el conjunto de datos, 1202, produce una frecuencia de células esperado de 408,1, como también se puede observar mediante la introducción de gss.lc2 $ predcell siguiente estimación del modelo.

Reordenación de las clases latentes. Debido a que las clases latentes son categorías no ordenadas, el orden numérico de la prevista clases latentes en la salida del modelo es arbitraria, y se determina únicamente por los valores de inicio del algoritmo EM. Si probs.start se establece en NULL (predeterminado) al llamar Polca, a continuación, la función genera los valores de partida al azar en cada ejecución. Esto significa que repite carreras de Polca normalmente producirán resultados con los mismos parámetros estimados (correspondiente a la misma el máximo diario de probabilidad), pero con etiquetas de clase latentes reordenados

The poLCA.reorder function takes as its first argument the list of starting values probs.start, and as its second argument a vector describing the desired reordering of the latent classes.

A continuación, ejecute PoLCA, una vez más, esta vez utilizando los valores iniciales reordenados en la llamada de función.

ejemplo 2: usando los datos de carcinoma de Agresti (2002, 542) constan de siete variables dicotómicas que representar las votaciones por siete patólogos de 118 desliza sobre la presencia o ausencia de carcinoma. El propósito del estudio de estos datos es el modelo de “acuerdo entre observadores” por examinar cómo los sujetos pueden ser divididos en grupos dependiendo de la consistencia de sus diagnósticos.

data(carcinoma)
f <- cbind(A,B,C,D,E,F,G)~1
lc3 <- poLCA(f,carcinoma,nclass=3,graphs=TRUE )

## Conditional item response (column) probabilities,
##  by outcome variable, for each class (row) 
##  
## $A
##            Pr(1)  Pr(2)
## class 1:  0.0000 1.0000
## class 2:  0.9427 0.0573
## class 3:  0.4872 0.5128
## 
## $B
##            Pr(1)  Pr(2)
## class 1:  0.0191 0.9809
## class 2:  0.8621 0.1379
## class 3:  0.0000 1.0000
## 
## $C
##            Pr(1)  Pr(2)
## class 1:  0.1425 0.8575
## class 2:  1.0000 0.0000
## class 3:  1.0000 0.0000
## 
## $D
##            Pr(1)  Pr(2)
## class 1:  0.4138 0.5862
## class 2:  1.0000 0.0000
## class 3:  0.9424 0.0576
## 
## $E
##            Pr(1)  Pr(2)
## class 1:  0.0000 1.0000
## class 2:  0.9449 0.0551
## class 3:  0.2494 0.7506
## 
## $F
##            Pr(1)  Pr(2)
## class 1:  0.5236 0.4764
## class 2:  1.0000 0.0000
## class 3:  1.0000 0.0000
## 
## $G
##            Pr(1)  Pr(2)
## class 1:  0.0000 1.0000
## class 2:  1.0000 0.0000
## class 3:  0.3693 0.6307
## 
## Estimated class population shares 
##  0.4447 0.3736 0.1817 
##  
## Predicted class memberships (by modal posterior prob.) 
##  0.4322 0.3729 0.1949 
##  
## ========================================================= 
## Fit for 3 latent classes: 
## ========================================================= 
## number of observations: 118 
## number of estimated parameters: 23 
## residual degrees of freedom: 95 
## maximum log-likelihood: -293.705 
##  
## AIC(3): 633.41
## BIC(3): 697.1357
## G^2(3): 15.26171 (Likelihood ratio/deviance statistic) 
## X^2(3): 20.50335 (Chi-square goodness of fit) 
## 

Modelos de regresión con clase latente

Ejemplo 3: con una variables usando los datos de las elecciones de los encuestados al público Estudio Nacional de Elecciones de América 2000 se les hizo encuesta de opinión para evaluar qué tan bien una serie de rasgos-morales, el cuidar, conocedores, buenas líder, deshonestos, y inteligentes descrito candidatos a la presidencia Al Gore y George W. Bush. Cada pregunta tiene cuatro opciones posibles: (1) muy bien; (2) bastante bien; (3) no demasiado bien; y (4) no así en absoluto.

Un enfoque teórico razonable podría suponer que hay tres clases latentes de encuesta encuestados: los partidarios de Gore, partidarios de Bush, y los que son más o menos neutro. Sangre partidarios tenderán a responder favorablemente a Gore y desfavorable hacia Bush, con siendo a la inversa en el caso de los partidarios de Bush. Aquellos en el grupo neutral no tendrá fuertes opiniones acerca de uno u otro candidato. Podríamos esperar, además, que caer en una de estos tres grupos es una función de la identificación partidista de cada individuo, con su compromiso Demócratas más propensos a favorecer a Gore, los republicanos más comprometidos que puedan favorecer a Bush, y partidarios menos intensas que tienden a ser indiferentes. Podemos investigar esta hipótesis utilizando un modelo de regresión de clases latentes.

Comience por la carga de los datos de las elecciones en la memoria, y la especificación de un modelo con 12 manifiesta variables y PARTY como la variable concomitante solitario. Se codifica la variable PARTIDO a través de siete categorías, de demócrata fuerte a 1 al republicano fuerte en 7. Las personas que Consideremos en primer lugar los propios independientes están en 3-4-5 en la escala. A continuación, estimar el modelo de regresión de clases latentes y asignar esos resultados a objetar nes.party. Una llamada a la comando poLCA.reorder, con una posterior re-estimación del modelo, asegura que el tres clases latentes se asignan las mismas etiquetas de categoría en cada serie

data(election)
f.party <- cbind(MORALG,CARESG,KNOWG,LEADG,DISHONB,INTELB)~PARTY

nes.party <-poLCA(f.party,election,nclass=3,verbose=F)

probs.start <-poLCA.reorder(nes.party$probs.start,order(nes.party$P,decreasing=T))

nes.party <- poLCA(f.party,election,nclass=3,probs.start=probs.start)
## Conditional item response (column) probabilities,
##  by outcome variable, for each class (row) 
##  
## $MORALG
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.1889       0.7141         0.0951            0.0020
## class 2:            0.0764       0.3685         0.3507            0.2044
## class 3:            0.7394       0.2446         0.0043            0.0116
## 
## $CARESG
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0643       0.7267         0.1834            0.0255
## class 2:            0.0178       0.1552         0.5081            0.3190
## class 3:            0.6207       0.3227         0.0414            0.0152
## 
## $KNOWG
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.1775       0.7690         0.0514            0.0021
## class 2:            0.0951       0.5483         0.2715            0.0851
## class 3:            0.7971       0.1845         0.0045            0.0138
## 
## $LEADG
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0361       0.7509         0.2129            0.0001
## class 2:            0.0124       0.1203         0.5747            0.2926
## class 3:            0.6558       0.3097         0.0271            0.0074
## 
## $DISHONB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0263       0.2160         0.5196            0.2381
## class 2:            0.0295       0.0875         0.3380            0.5450
## class 3:            0.0863       0.2781         0.3826            0.2529
## 
## $INTELB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0961       0.5941         0.2370            0.0728
## class 2:            0.2814       0.6078         0.0888            0.0220
## class 3:            0.2059       0.4230         0.2545            0.1166
## 
## Estimated class population shares 
##  0.416 0.3755 0.2085 
##  
## Predicted class memberships (by modal posterior prob.) 
##  0.42 0.3764 0.2036 
##  
## ========================================================= 
## Fit for 3 latent classes: 
## ========================================================= 
## 2 / 1 
##             Coefficient  Std. error  t value  Pr(>|t|)
## (Intercept)    -3.24495     0.28296  -11.468         0
## PARTY           0.71818     0.05823   12.334         0
## ========================================================= 
## 3 / 1 
##             Coefficient  Std. error  t value  Pr(>|t|)
## (Intercept)     0.67793     0.18860    3.595         0
## PARTY          -0.55549     0.07308   -7.601         0
## ========================================================= 
## number of observations: 1400 
## number of estimated parameters: 58 
## residual degrees of freedom: 1342 
## maximum log-likelihood: -8699.645 
##  
## AIC(3): 17515.29
## BIC(3): 17819.46
## X^2(3): 13897.64 (Chi-square goodness of fit) 
## 

Dado que las variables manifiestas se introducen como factores, las etiquetas de factores aparecen ahora en la salida de las probabilidades de respuesta de clase condicional estimados. El examen de estas probabilidades, nos puede confirmar que el modelo ha encontrado que separan los tres grupos como se esperaba, con 27% en el grupo a favor-Gore, el 34% en el grupo a favor-Bush, y el 39% en el grupo neutral. Este ejemplo también ilustra un defecto de la \(\chi^2\) bondad del ajuste estadístico, que es calculado para ser más de 34,5 mil millones. Con sólo 1.300 observaciones, pero casi 17 millones de células en la tabla de clasificación cruzada observado (es decir, cuatro respuestas a cada uno de 12 preguntas, o 412 células), la gran mayoría de las células contendrán cero casos. Para los modelos de este tipo, utilizando el \(\chi^2\) estadística para evaluar el ajuste del modelo no se aconseja. Además de la información emitida por el modelo básico, la salida Polca ahora también incluye los \(\beta\) coeficientes estimados r en las covariables, y sus errores estándar.

pidmat <- cbind(1,c(1:7))

exb <- exp(pidmat %*% nes.party$coeff)
matplot(c(1:7),(cbind(1,exb)/(1+rowSums(exb))),
main="Party ID as a predictor of candidate affinity class",
xlab="Party ID: strong Democratic (1) to strong Republican (7)",
ylab="Probability of latent class membership",
ylim=c(0,1),type="l",lwd=3,col=1)

text(5.9,0.35,"Other")

text(5.4,0.7,"Bush affinity")

text(1.8,0.6,"Gore affinity")

Ejemplo 4: con múltiples covariables

f.3cov <- cbind(MORALB,CARESB,KNOWB,LEADB,DISHONB,INTELB)~PARTY*AGE

nes.3cov <- poLCA(f.3cov,election,nclass=3,verbose=F)
probs.start <- poLCA.reorder(nes.3cov$probs.start,order(nes.3cov$P,decreasing=T))
nes.3cov <- poLCA(f.3cov,election,nclass=3,probs.start=probs.start, graphs=TRUE )

## Conditional item response (column) probabilities,
##  by outcome variable, for each class (row) 
##  
## $MORALB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0938       0.7646         0.1399            0.0017
## class 2:            0.0684       0.2902         0.4556            0.1858
## class 3:            0.6896       0.2978         0.0090            0.0035
## 
## $CARESB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0210       0.5345         0.3888            0.0558
## class 2:            0.0094       0.0611         0.4120            0.5174
## class 3:            0.4136       0.5144         0.0601            0.0120
## 
## $KNOWB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0585       0.7952         0.1440            0.0023
## class 2:            0.0345       0.2379         0.4771            0.2504
## class 3:            0.5716       0.4284         0.0000            0.0000
## 
## $LEADB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0653       0.7704         0.1522            0.0121
## class 2:            0.0216       0.1739         0.5319            0.2726
## class 3:            0.6299       0.3610         0.0091            0.0000
## 
## $DISHONB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0079       0.1447         0.5150            0.3324
## class 2:            0.1194       0.3203         0.3998            0.1605
## class 3:            0.0174       0.0507         0.1811            0.7508
## 
## $INTELB
##           1 Extremely well 2 Quite well 3 Not too well 4 Not well at all
## class 1:            0.0942       0.8245         0.0804            0.0009
## class 2:            0.0821       0.2458         0.4653            0.2068
## class 3:            0.6066       0.3934         0.0000            0.0000
## 
## Estimated class population shares 
##  0.4927 0.2934 0.2139 
##  
## Predicted class memberships (by modal posterior prob.) 
##  0.4943 0.2884 0.2173 
##  
## ========================================================= 
## Fit for 3 latent classes: 
## ========================================================= 
## 2 / 1 
##             Coefficient  Std. error  t value  Pr(>|t|)
## (Intercept)     1.41172     0.48579    2.906     0.004
## PARTY          -0.57250     0.15202   -3.766     0.000
## AGE            -0.00584     0.00952   -0.613     0.540
## PARTY:AGE       0.00090     0.00307    0.294     0.769
## ========================================================= 
## 3 / 1 
##             Coefficient  Std. error  t value  Pr(>|t|)
## (Intercept)    -4.16860     0.76477   -5.451     0.000
## PARTY           0.53726     0.14501    3.705     0.000
## AGE             0.02818     0.01433    1.966     0.050
## PARTY:AGE      -0.00259     0.00275   -0.941     0.347
## ========================================================= 
## number of observations: 1408 
## number of estimated parameters: 62 
## residual degrees of freedom: 1346 
## maximum log-likelihood: -8314.55 
##  
## AIC(3): 16753.1
## BIC(3): 17078.6
## X^2(3): 9602.375 (Chi-square goodness of fit) 
## 
strdems <- cbind(1,1,c(18:80),(c(18:80)*1))
exb.strdems <- exp(strdems %*% nes.3cov$coeff)
matplot(c(18:80),(cbind(1,exb.strdems)/(1+rowSums(exb.strdems))),
                  main="Age and candidate affinity for strong Democrats",
                  xlab="Age",ylab="Probability of latent class membership",
                  ylim=c(0,1),type="l",col=1,lwd=3)
text(50,0.3,"Other")
text(50,0.05,"Bush affinity")
text(50,0.7,"Gore affinity")

figura 3, derecha

strreps <- cbind(1,7,c(18:80),(c(18:80)*7))
exb.strreps <- exp(strreps %*% nes.3cov$coeff)
matplot(c(18:80),(cbind(1,exb.strreps)/(1+rowSums(exb.strreps))),
                  main="Age and candidate affinity for strong Republicans",
                  xlab="Age",ylab="Probability of latent class membership",
                  ylim=c(0,1),type="l",col=1,lwd=3)
text(50,0.18,"Other")
text(50,0.9,"Bush affinity")
text(50,0.05,"Gore affinity")