En una investigación de fenómenos sociales complejos trabajamos con un número importante de variables e indicadores que buscan representar una serie de fenómenos sociales a través de datos cuantitativos. En situaciones nos encontramos con varios indicadores que están correlacionados entre sí.
Un desafío para el análisis es cómo resumir la interrelación que existe entre varios indicadores del mismo fenómeno social. Para ello se utilizan técnicas de reducción de dimensiones como el análisis de componentes principales o el análisis factorial exploratorio.
En esta lección utilizaremos como referencia el texto:
Kabacoff, Robert I. 2011. R in Action: Data Analysis and Graphics with R. Shelter Island, NY: Manning.
El ACP es una técnica de reducción de datos que transforma un número importante de variables correlacionadas en un conjunto más reducido de variables no correlacionadas que se llaman componentes principales (Kabacoff 2011: 331). Por ejemplo, podemos tener un conjunto de 11 ítems que buscan medir actitudes machistas y/u homofóbicas en una encuesta, que podríamos reducir en un número más pequeño de componentes principales - por ejemplo 2 - que reflejan diferentes dimensiones del machismo y la homofobia, pero que a su vez retienen la mayor cantidad posible de información de las variables o indicadores iniciales.
De acuerdo con Kabacoff (2011: 332), el AFE es un conjunto de métodos diseñados para descubrir la estructura latente que subyace a un conjunto de variables. Busca un reducido conjunto de constructos subyacentes o latentes que explican la relación entre variables manifiestas u observadas. Por ejemplo, una serie de actitudes hacia el uso de la violencia contra la mujer, la distribución de las tareas domésticas o los roles de hombres y mujeres en la vida social, pueden explicarse por una cultura o creencias subyacentes de tipo machista y patrialcal.
Fuente: Kabakoff 2011: 332.
En esta lección utilizaremos los datos de la encuesta nacional sobre roles de género realizada por el IOP - PUCP en el 2012. En informe respectivo puede verse en el siguiente enlace: Genero PUCP 2012
La base de datos, ficha técnica y cuestionario pueden descargase desde el siguiente enlace: BD Genero 2012
En dicha encuesta se aplicó una batería de preguntas en una escala de tipo Lickert para medir actitudes la violencia de género y la homofobia, tal y como puede verse en la siguiente diapositiva.
A continuación podemos ver los estadísticos descriptivos de las variables correspondientes a las preguntas P51A - P51K. Para ello, previamente se ha recodificado las respuestas NS/NR como NA:
##
## Estadísticos Descriptivos
## ================================================================
## Statistic N Mean St. Dev. Min Pctl(25) Median Pctl(75) Max
## ----------------------------------------------------------------
## P51A 1,192 3.29 0.55 1.00 3.00 3.00 4.00 4.00
## P51B 1,199 3.33 0.53 1.00 3.00 3.00 4.00 4.00
## P51C 1,186 3.27 0.65 1.00 3.00 3.00 4.00 4.00
## P51D 1,140 2.80 0.71 1.00 2.00 3.00 3.00 4.00
## P51E 1,158 2.55 0.74 1.00 2.00 3.00 3.00 4.00
## P51F 1,161 2.59 0.73 1.00 2.00 3.00 3.00 4.00
## P51G 1,126 2.39 0.76 1.00 2.00 2.00 3.00 4.00
## P51H 1,137 2.26 0.77 1.00 2.00 2.00 3.00 4.00
## P51I 1,131 2.30 0.78 1.00 2.00 2.00 3.00 4.00
## P51J 1,055 2.79 0.72 1.00 2.00 3.00 3.00 4.00
## P51K 1,135 2.84 0.79 1.00 2.00 3.00 3.00 4.00
## ----------------------------------------------------------------
La matriz de correlaciones nos permite tener una primera impresión de la interrelación que existe entre las variables:
## P51A P51B P51C P51D P51E P51F P51G P51H P51I P51J P51K
## P51A 1
## P51B 0.75 1
## P51C 0.57 0.64 1
## P51D 0.26 0.26 0.29 1
## P51E 0.16 0.15 0.15 0.49 1
## P51F 0.19 0.22 0.2 0.47 0.62 1
## P51G 0.12 0.13 0.13 0.37 0.47 0.58 1
## P51H 0.1 0.1 0.06 0.34 0.39 0.49 0.73 1
## P51I 0.07 0.1 0.09 0.34 0.38 0.45 0.67 0.85 1
## P51J 0.2 0.24 0.21 0.41 0.41 0.54 0.49 0.42 0.44 1
## P51K -0.01 -0.03 -0.01 -0.05 -0.08 -0.07 -0.1 -0.03 -0.04 -0.05 1
De acuerdo con Kabacoff (2011: 333-334), los pasos para realizar un ACP o AFE son:
El objetivo del ACP es reemplazar un conjunto grande de variables correlacionadas por otro grupo más pequeño de variables no correlacionadas, conservando la mayor cantidad posible de información de las variables originales. Las variables resultantes se llaman componentes principales y son una combinación lineal de las variables originales, así el primer componente será la combinación ponderada de las K variables observadas que dan cuenta de la mayor cantidad de la varianza en el conjunto original de variables:
\[ PC_1 = a_1X_1 + a_2X_2 + ... + a_kX_k\]
El segundo componente principal será lo mismo, bajo la restricción de que sea ortogonal o no correlacionada con el primer componente.
Teóricamente se puede extraer tantos componentes como variables hay en nuestra matriz de datos (en nuestro ejemplo son 11 ítems). Sin embargo el objetivo es reducir los datos, para ello se pueden emplear diferentes criterios (Kabacoff 2011: 335):
El criterio más común utiliza los autovalores
Los autovalores o eigenvalues son un elemento central del análisis de transformaciones lineares. Se utilizan en el álgebra matricial para reescalar vectores en una matriz de datos o en un espacio multimensional.
En el ACP cada componente es representado por un autovalor que reescala la matriz de correlaciones, estandarizando la cantidad de la varianza de la matriz a una unidad por cada variable que forma parte del conjunto de datos.
En nuestro ejemplo tenemos una matriz de 11 x 11 variables, por lo que la suma de los autovalores o eigenvalues debe ser igual a 11. Si un componente tiene un autovalor mayor a 1 significa que captura una cantidad de la varianza mayor que una variable original, lo que nos permite reducir las dimensiones de esa matriz de datos.
Lo primero que vamos a hacer pedir una “solución” de componentes principales, considerando tantos componentes como variables tenemos en nuestro conjunto de datos (11 variables). Nos fijaremos en primer lugar en los pesos de cada componente, que equivalen a los autovalores o eigenvalues y que en conjunto suman 11.
Nos interesa seleccionar componentes que “pesen” más que una variable única (eigenvalue > 1), y que expliquen la mayor proporción posible de la varianza compartida.
Una forma de ver gráficamente el peso de cada componente principal es usar un gráfico de eigenvalues. Allí notaremos rápidamente cuáles son los componentes que tienen un autovalor mayor a 1.
Analizando el gráfico y la tabla observamos que hay dos componentes principales que tienen autovalores cláramente mayores a 1. El PC1 captura el 38% de la varianza común, mientras que el PC2 el 20%, es decir, dos componentes principales representan el 58% de la varianza colectiva. El PC3 tiene un autovalor ligeramente mayor a 1, por lo que apenas equivale a poco más de una variable individual original.
A partir de este primer análisis notamos que podríamos resumir las 11 variables originales en dos Componentes Principales que capturan el 58% de la varianza del conjunto.
A continuación observamos la matriz de componentes principales no rotados. La matriz muestra la correlación que existe entre cada ítem y los componentes extraídos:
##
## Loadings:
## PC1 PC2
## P51A 0.372 0.767
## P51B 0.427 0.766
## P51C 0.406 0.716
## P51D 0.631 0.143
## P51E 0.674
## P51F 0.770
## P51G 0.784 -0.332
## P51H 0.748 -0.419
## P51I 0.734 -0.398
## P51J 0.714
## P51K -0.123
##
## PC1 PC2
## SS loadings 4.168 2.166
## Proportion Var 0.379 0.197
## Cumulative Var 0.379 0.576
Las rotaciones son un conjunto de técnicas matemáticas que transforman la matriz de pesos de los componentes en una que sea más facilmente interpretable y haciendo que los componentes extraídos sean lo más diferenciados o “puros” posibles (Kabacoff 2011: 339-340).
Hay diferentes métodos de rotación. Los de tipo ortogonal buscan “separar” lo más posible los componentes extraídos evitando que estén correlacionados entre sí. Otros métodos de rotación oblicua permiten que los componentes tengan algún nivel de correlación. Uno de los métodos más utilizados de rotación ortogonal es la rotación varimax, que es la que emplearemos en nuestro ejemplo.
Obsérvese en el resultado siguiente como la rotación hace que el peso de las variables se afirme más en un componente que en otro.
## Principal Components Analysis
## Call: principal(r = df.p51[, -1], nfactors = 2, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
## RC1 RC2 h2 u2 com
## P51A 0.04 0.85 0.726 0.27 1.0
## P51B 0.09 0.87 0.769 0.23 1.0
## P51C 0.09 0.82 0.678 0.32 1.0
## P51D 0.52 0.38 0.419 0.58 1.8
## P51E 0.65 0.19 0.461 0.54 1.2
## P51F 0.73 0.25 0.597 0.40 1.2
## P51G 0.85 0.00 0.726 0.27 1.0
## P51H 0.85 -0.09 0.735 0.27 1.0
## P51I 0.83 -0.08 0.697 0.30 1.0
## P51J 0.67 0.26 0.510 0.49 1.3
## P51K -0.13 -0.02 0.017 0.98 1.0
##
## RC1 RC2
## SS loadings 3.86 2.48
## Proportion Var 0.35 0.23
## Cumulative Var 0.35 0.58
## Proportion Explained 0.61 0.39
## Cumulative Proportion 0.61 1.00
##
## Mean item complexity = 1.1
## Test of the hypothesis that 2 components are sufficient.
##
## The root mean square of the residuals (RMSR) is 0.08
## with the empirical chi square 862.56 with prob < 3.5e-159
##
## Fit based upon off diagonal values = 0.95
Para interpretar los resultados debemos fijarnos en la matriz de pesos de componentes rotados y analizar cuáles de las variables están más asociadas a cada uno de los componentes.
La variable P51K queda como algo “descolgada” de las demás.
Veamos los items originales para interpretar mejor nuestros resultados:
RC1 : P51D, P51E, P51F, P51G, P51H, P51I, P51J
Las funciones del R nos permiten calcular un puntaje en los componentes principales extraídos para cada individuo de nuestra base de datos. Es como si le asignáramos un puntaje en la dimensión de “homofobia” y en la de “violencia de género” a cada entrevistado de la encuesta.
Como las opciones de respuesta de los ítems originales van del 1 (“Muy de acuerdo”) al 4 (“Muy en desacuerdo”), en el caso de:
Los puntajes en cada componente se calculan en unidades estándar (valores Z de la curva normal).
El calcular los puntajes de los componentes principales nos permite utilizarlos como variables cuantitativas para realizar diversos tipos de análisis descriptivos y multivariables, por ejemplo:
## Df Sum Sq Mean Sq F value Pr(>F)
## genero12.b$region1 2 21.3 10.65 10.76 2.41e-05 ***
## Residuals 916 907.2 0.99
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 284 observations deleted due to missingness
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = genero12.b$RC2 ~ genero12.b$region1)
##
## $`genero12.b$region1`
## diff lwr upr p adj
## Resto Urbano-Lima -0.316506413 -0.4876927 -0.14532017 0.0000470
## Rural-Lima -0.311340188 -0.5314508 -0.09122957 0.0026852
## Rural-Resto Urbano 0.005166226 -0.2089232 0.21925564 0.9982323
##
## =====================================================
## Dependent variable:
## ---------------------------------
## RC1 RC2
## (1) (2)
## -----------------------------------------------------
## sumaNSE 0.002 (0.004) 0.013*** (0.004)
## educ 0.008 (0.020) 0.045* (0.020)
## EDAD -0.007** (0.002) -0.006** (0.002)
## sexMujer 0.281*** (0.065) 0.277*** (0.064)
## region1Resto Urbano -0.157* (0.077) -0.197* (0.076)
## region1Rural -0.331** (0.113) 0.052 (0.111)
## Constant 0.182 (0.165) -0.448** (0.162)
## -----------------------------------------------------
## Observations 919 919
## R2 0.054 0.093
## Adjusted R2 0.048 0.087
## =====================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
## CARGA DE DATOS
library(foreign)
genero12 <- read.spss("https://www.dropbox.com/s/kjva39yh3dzb07r/IOP_1212_01_B.sav?dl=1",
to.data.frame = T, use.value.labels = F)
## SELECCIÓN Y RECODIFICACIÓN DE VARIABLES DE ANÁLISIS
## Preguntas P51A - P51K
## Recodificiar 9 por NA
genero.s <- genero12[, c(1,108:118)]
NRO <- genero.s[, 1]
df <- genero.s[, 2:12]
df[df==9] <- NA
df.p51 <- cbind(NRO, df)
## TABLA DE ESTADÍSTICOS DESCRIPTIVOS
library(stargazer)
stargazer(df.p51[, -1], type = "text", median = TRUE, title = "Estadísticos Descriptivos",
digits = 2)
## TABLA DE CORRELACIONES
correla1 <- round(cor(df.p51[,-1], use = "complete.obs"),2)
correla1
## Análisis de componentes principales no rotados (1)
library(psych)
pca1 <- principal(df.p51[, -1], nfactors = 11, rotate = "none")
pca1
## Gráfico de eigenvalues
vac <- as.data.frame(t(pca1$Vaccounted))
vac$PC <- row.names(vac)
colnames(vac) <- c("ss_load", "prop.var", "cum.var", "prop.exp", "cum.prop", "PC")
ggplot(vac, aes(x = reorder(PC, -ss_load), y = ss_load), group = 1) +
geom_bar(stat = "identity", fill = "grey", colour = "black") +
geom_line(aes(group = 1)) + geom_point() + geom_hline(yintercept = 1, color = "red") +
xlab("Componentes Principales") + ylab("Eigenvalues") +
ggtitle("Componentes principales: Gráfico de eigenvalues") +
theme_bw()
## Análisis de componentes principales no rotados (2)
pca2 <- principal(df.p51[, -1], nfactors = 2, rotate = "none")
pca2
## Análisis de componentes principales con rotación varimax
pca3 <- principal(df.p51[, -1], nfactors = 2, rotate = "varimax")
pca3
library(psych)
KMO(df.p51[,-1])
## Cálculo y distribución de puntajes de componentes extraídos
puntajes.pc1 <- as.data.frame(pca3$scores)
dfp51.2 <- cbind(df.p51, puntajes.pc1)
genero12.b <- merge(genero12, dfp51.2, by = "NRO")
curva.rc1 <- ggplot(genero12.b, aes(RC1)) +
geom_density(fill="green", alpha=0.2) +
ggtitle("Distribución de RC1: Homofobia") + theme_bw()
curva.rc2 <- ggplot(genero12.b, aes(RC2)) +
geom_density(fill="green", alpha=0.2) +
ggtitle("Distribución de RC2: Violencia de género") + theme_bw()
grid.arrange(curva.rc1, curva.rc2, ncol=2)
## Recodificación de variables en la base de datos
genero12.b$sex <- factor(genero12.b$SEXO, labels = c("Hombre", "Mujer"))
genero12.b$region1 <- factor(genero12.b$Ambito,
labels = c("Lima", "Resto Urbano", "Rural"))
genero12.b$educ <- genero12.b$P48
genero12.b$educ[genero12.b$educ == 99] <- NA
## Gráfico de cajas
ggplot(genero12.b, aes(x=sex, y=RC1)) + geom_boxplot() +
ggtitle("Índice de actitudes hacia la homosexualidad según sexo del entrevistado") +
xlab("Sexo del entrevistado") + ylab("Indice de actitudes hacia la homosexualidad")+ theme_bw()
## Análisis de la varianza
library(Rmisc)
tab1 <- summarySE(data = genero12.b, measurevar = "RC2", groupvars = "region1",
na.rm=T)
ggplot(tab1, aes(x = region1, y=RC2)) + geom_point() +
geom_errorbar(aes(ymin = RC2-ci, ymax=RC2+ci), width = .5) +
xlab("Ambito de residencia") + ylab("Indice Violencia de Género") +
ggtitle("Índice de actitudes hacia la violencia de género, según ámbito de residencia, media e IC al 95%") + theme_bw()
anova1 <- aov(genero12.b$RC2~genero12.b$region1)
summary(anova1)
TukeyHSD(anova1)
## Análisis de regresión
m1 <- lm(RC1 ~ sumaNSE + educ + EDAD + sex + region1, data = genero12.b)
m2 <- lm(RC2 ~ sumaNSE + educ + EDAD + sex + region1, data = genero12.b)
stargazer(m1, m2, type = "text", single.row = TRUE,
omit.stat=c("ser","f"),
star.cutoffs = c(0.05, 0.01, 0.001))