Práctica dirigida: Análisis de Componentes Principales

Cargar datos

En esta práctica dirigida analizaremos si es viable reducir un inventario de participación política aplicado por el Instituto de Opinión Pública de la PUCP(IOP, 2012) en el marco del estudio Representación Política y Conflictos Sociales. Este inventario registra el nivel de involucramiento de los ciudadanos en diversas formas de participación política tanto formales/convencionales/no disruptivas (e.g.,buscar a un congresista para hacerle llegar una necesidad o demanda social) como informales/no convencionales/disruptivas(e.g., participación en protestas). La data y el cuestionario del estudio se pueden descargar del portal del IOP en el siguiente en-lace:

http://datos.pucp.edu.pe/dataverse/iop?q=&fq0=productionDate_s%3A%222012%22&types= dataverses%3Adatasets&sort=dateSort&order=desc

Carga de paquetes

Como la extensión en la que el IOP ha archivado la data del estudio es de SPSS(“.sav”), vamos a necesitar el paquete “foreign” para su importación.


library(foreign)

Luego importamos el archivo como “data.frame” y le colocamos el nombre “conflictos12”. Si cotejamos con el cuestionario del estudio, podemos ver que las variables de interés van desde la pregutna P74A hasta P74H.


conflictos12<-read.spss("IOP_1112_01_D.sav", to.data.frame=T, use.value.labels = F)

Inspeccionamos el nombre de las variables (“names”):


names(conflictos12)
##   [1] "NUM"      "SEXO"     "EDAD"     "P1A"      "P1A_OTRO" "P1B"     
##   [7] "P1B_OTRO" "P2"       "P3"       "P4A"      "P4B"      "P4C"     
##  [13] "P4D"      "P4E"      "P4F"      "P4G"      "P5"       "P6"      
##  [19] "P7A"      "P7B"      "P8A"      "P8B"      "P8C"      "P8D"     
##  [25] "P9A"      "P9B"      "P9C"      "P9D"      "P9E"      "P9F"     
##  [31] "P9G"      "P9H"      "P9I"      "P9J"      "P9K"      "P9L"     
##  [37] "P9M"      "P10"      "P11"      "P12A"     "P12B"     "P12C"    
##  [43] "P12D"     "P12E"     "P12F"     "P13A"     "P13B"     "P13C"    
##  [49] "P13D"     "P13E"     "P13F"     "P13G"     "P13H"     "P13I"    
##  [55] "P13J"     "P14A"     "P14ARC"   "P14B"     "P14BRC"   "P15"     
##  [61] "P15OTRO"  "P16"      "P17"      "P18A"     "P18B"     "P18C"    
##  [67] "P18D"     "P19"      "P20A"     "P20B"     "P20C"     "P20D"    
##  [73] "P21A"     "P21B"     "P21C"     "P21D"     "P21E"     "P21F"    
##  [79] "P22"      "P23"      "P24"      "P25A"     "P25B"     "P25C"    
##  [85] "P25D"     "P26A"     "P26B"     "P26C"     "P26D"     "P26E"    
##  [91] "P26F"     "P26G"     "P26H"     "P27A"     "P27B"     "P27C"    
##  [97] "P27D"     "P27E"     "P28A"     "P28B"     "P28C"     "P28D"    
## [103] "P29A"     "P29B"     "P29C"     "P29D"     "P30A"     "P30B"    
## [109] "P30C"     "P31A"     "P31B"     "P31C"     "P31D"     "P31E"    
## [115] "P32A"     "P32B"     "P32C"     "P32D"     "P32E"     "P33A"    
## [121] "P33B"     "P33C"     "P33D"     "P33E"     "P34A"     "P34B"    
## [127] "P34C"     "P34D"     "P34E"     "P34F"     "P35"      "P36"     
## [133] "P37"      "P38A"     "P38B"     "P38C"     "P38D"     "P38E"    
## [139] "P38F"     "P38G"     "P38H"     "P38I"     "P38J"     "P39A"    
## [145] "P39B"     "P39C"     "P39D"     "P39E"     "P39F"     "P39G"    
## [151] "P39H"     "P39I"     "P39J"     "P40A"     "P40B"     "P41A"    
## [157] "P41B"     "P41C"     "P42"      "P43"      "P44"      "P45"     
## [163] "P46"      "P47"      "P48"      "P49"      "P50"      "P51A"    
## [169] "P51AOTRO" "P51B"     "P51BOTRO" "P51C"     "P51COTRO" "P52"     
## [175] "P53"      "P54"      "P55A"     "P55B"     "P55C"     "P55D"    
## [181] "P55E"     "P56A"     "P56B"     "P56C"     "P56D"     "P57"     
## [187] "P58"      "P59"      "P60"      "P61"      "P62"      "P63"     
## [193] "P64"      "P65A"     "P65B"     "P65C"     "P66"      "P67"     
## [199] "P68"      "P69"      "P70"      "P71"      "P72"      "P73A"    
## [205] "P73B"     "P73C"     "P73D"     "P73E"     "P73F"     "P73G"    
## [211] "P74A"     "P74B"     "P74C"     "P74D"     "P74E"     "P74F"    
## [217] "P74G"     "P74H"     "P75A"     "P75"      "P76"      "P76OTRO" 
## [223] "P77"      "P77NAT"   "P77EXT"   "P78"      "P78OTRO"  "P79"     
## [229] "DG1"      "DG2"      "DG3A"     "DG3B"     "DG3C"     "DG3D"    
## [235] "DG3E"     "DG4"      "DG5"      "DG5OTRO"  "DG6"      "DG6COD"  
## [241] "DG7"      "DG8"      "DG9"      "URBRAL"   "CIUDAD"   "Región"  
## [247] "AMBITOS"  "UBIGEO"   "DOMINIO"  "NSE"      "NSEGrup"

Variables en la base. El inventario de participación política evalúa el nivel de involucramiento en participación política con una escala de respuesta en donde “1” significa “Lo he hecho”, “2” significa “Podría hacerlo” y “3” “Nunca lo haría”. La consigna al inicio del inventario solicita al participante responder sobre su participación en las siguientes formas de participación política:

Preparación de la data

Selección de variables. Ahora bien, vamos a extraer las columnas que corresponden a las variables de participación política. Para ello, vamos a utilizar el comando “names”: seleccionamos la columna con índice 1, debido a que tiene el identificador del participante en la encuesta, y las columnas con índice desde 211 hasta 218(P74A-P74H).


conflictos.s<-conflictos12[names(conflictos12)[c(1,211:218)]]

Recodificación de variables

Recodificamos 9 por “NA”, pero tenemos cuidado de no recodificar el 9 de la columna con el identificador de casos.


NUM <- conflictos.s[, 1] 
df <- conflictos.s[, 2:9] 
df[df==9] <- NA
df.p74 <- cbind(NUM, df)

1. Análisis preliminar descriptivo

Para organizar mejor los estadísticos descriptivos de las variables de interés, podemos utilizar el paquete “stargazer”. En este caso, dado que el tipo de variable es ordinal, es mejor utilizar la mediana.


library(stargazer)
stargazer(df.p74[-1], type="text", median=T)
## 
## ===================================================================
## Statistic   N   Mean  St. Dev.  Min  Pctl(25) Median Pctl(75)  Max 
## -------------------------------------------------------------------
## P74A      1,122 2.152  0.638   1.000  2.000   2.000   3.000   3.000
## P74B      1,138 2.395  0.685   1.000  2.000   3.000   3.000   3.000
## P74C      1,136 2.512  0.641   1.000  2.000   3.000   3.000   3.000
## P74D      1,121 2.778  0.480   1.000  3.000   3.000   3.000   3.000
## P74E      1,124 2.361  0.546   1.000  2.000   2.000   3.000   3.000
## P74F      1,134 2.189  0.551   1.000  2.000   2.000   3.000   3.000
## P74G      1,133 2.209  0.538   1.000  2.000   2.000   3.000   3.000
## P74H      1,103 2.790  0.446   1.000  3.000   3.000   3.000   3.000
## -------------------------------------------------------------------

Preguntas

2. Matriz de correlaciones


## TABLA DE CORRELACIONES

correla1 <- round(cor(df.p74[,-1], use = "complete.obs"),2)
correla1
##      P74A P74B P74C P74D P74E P74F P74G P74H
## P74A 1.00 0.45 0.42 0.29 0.39 0.38 0.42 0.27
## P74B 0.45 1.00 0.74 0.47 0.31 0.33 0.34 0.37
## P74C 0.42 0.74 1.00 0.55 0.30 0.29 0.34 0.41
## P74D 0.29 0.47 0.55 1.00 0.24 0.21 0.26 0.51
## P74E 0.39 0.31 0.30 0.24 1.00 0.50 0.53 0.26
## P74F 0.38 0.33 0.29 0.21 0.50 1.00 0.62 0.21
## P74G 0.42 0.34 0.34 0.26 0.53 0.62 1.00 0.30
## P74H 0.27 0.37 0.41 0.51 0.26 0.21 0.30 1.00

Calcule la matriz de correlaciones para los items de la escala de participación política y responda:

3. Análisis de componentes principales

Para completar el análisis de Componentes Principales, desarrolle los siguientes puntos:


library(psych)

pca1 <- principal(df.p74[, -1], nfactors = 8, rotate = "none")
pca1
## Principal Components Analysis
## Call: principal(r = df.p74[, -1], nfactors = 8, rotate = "none")
## Standardized loadings (pattern matrix) based upon correlation matrix
##       PC1   PC2   PC3   PC4   PC5   PC6   PC7   PC8 h2       u2 com
## P74A 0.67  0.12 -0.33  0.64 -0.05  0.14  0.02 -0.02  1 -2.2e-16 2.7
## P74B 0.76 -0.32 -0.37 -0.17 -0.05 -0.21  0.06  0.33  1  1.0e-15 2.7
## P74C 0.76 -0.40 -0.27 -0.19  0.01 -0.12 -0.05 -0.36  1  7.8e-16 2.6
## P74D 0.64 -0.49  0.25 -0.09  0.15  0.50 -0.07  0.07  1  1.1e-15 3.5
## P74E 0.65  0.45  0.12 -0.01  0.59 -0.14  0.03  0.01  1  8.9e-16 3.0
## P74F 0.64  0.54  0.04 -0.24 -0.24  0.18  0.38 -0.05  1 -6.7e-16 3.5
## P74G 0.69  0.48  0.13 -0.10 -0.24 -0.03 -0.46  0.03  1  6.7e-16 3.1
## P74H 0.59 -0.33  0.60  0.23 -0.15 -0.29  0.12 -0.01  1  2.2e-16 3.6
## 
##                        PC1  PC2  PC3  PC4  PC5  PC6  PC7  PC8
## SS loadings           3.66 1.35 0.78 0.60 0.51 0.46 0.38 0.25
## Proportion Var        0.46 0.17 0.10 0.08 0.06 0.06 0.05 0.03
## Cumulative Var        0.46 0.63 0.72 0.80 0.86 0.92 0.97 1.00
## Proportion Explained  0.46 0.17 0.10 0.08 0.06 0.06 0.05 0.03
## Cumulative Proportion 0.46 0.63 0.72 0.80 0.86 0.92 0.97 1.00
## 
## Mean item complexity =  3.1
## Test of the hypothesis that 8 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0 
##  with the empirical chi square  0  with prob <  NA 
## 
## Fit based upon off diagonal values = 1

pca2 <- principal(df.p74[, -1], nfactors = 2, rotate = "none")
pca2
## Principal Components Analysis
## Call: principal(r = df.p74[, -1], nfactors = 2, rotate = "none")
## Standardized loadings (pattern matrix) based upon correlation matrix
##       PC1   PC2   h2   u2 com
## P74A 0.67  0.12 0.46 0.54 1.1
## P74B 0.76 -0.32 0.67 0.33 1.3
## P74C 0.76 -0.40 0.74 0.26 1.5
## P74D 0.64 -0.49 0.65 0.35 1.9
## P74E 0.65  0.45 0.62 0.38 1.8
## P74F 0.64  0.54 0.70 0.30 1.9
## P74G 0.69  0.48 0.71 0.29 1.8
## P74H 0.59 -0.33 0.46 0.54 1.6
## 
##                        PC1  PC2
## SS loadings           3.66 1.35
## Proportion Var        0.46 0.17
## Cumulative Var        0.46 0.63
## Proportion Explained  0.73 0.27
## Cumulative Proportion 0.73 1.00
## 
## Mean item complexity =  1.6
## Test of the hypothesis that 2 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.09 
##  with the empirical chi square  548.01  with prob <  9.1e-109 
## 
## Fit based upon off diagonal values = 0.95

4. Rotación de componentes


pca3 <- principal(df.p74[, -1], nfactors = 2, rotate = "varimax")
pca3
## Principal Components Analysis
## Call: principal(r = df.p74[, -1], nfactors = 2, rotate = "varimax")
## Standardized loadings (pattern matrix) based upon correlation matrix
##       RC1  RC2   h2   u2 com
## P74A 0.41 0.54 0.46 0.54 1.9
## P74B 0.77 0.28 0.67 0.33 1.3
## P74C 0.83 0.22 0.74 0.26 1.1
## P74D 0.80 0.07 0.65 0.35 1.0
## P74E 0.17 0.77 0.62 0.38 1.1
## P74F 0.11 0.83 0.70 0.30 1.0
## P74G 0.19 0.82 0.71 0.29 1.1
## P74H 0.66 0.16 0.46 0.54 1.1
## 
##                        RC1  RC2
## SS loadings           2.61 2.40
## Proportion Var        0.33 0.30
## Cumulative Var        0.33 0.63
## Proportion Explained  0.52 0.48
## Cumulative Proportion 0.52 1.00
## 
## Mean item complexity =  1.2
## Test of the hypothesis that 2 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.09 
##  with the empirical chi square  548.01  with prob <  9.1e-109 
## 
## Fit based upon off diagonal values = 0.95

Para terminar, realice una rotación de Componentes Principales que le permita interpretar mejor los componentes rotados

Puntajes de componentes extraídos

Con el siguiente comando podemos calcular los puntajes para cada uno de los componentes: PC1, Participación política no convencional y PC2, participacón política convencional. Y luego, los añadimos a la base original:


puntajes.pc1 <- as.data.frame(pca3$scores)
dfp74.2 <- cbind(df.p74, puntajes.pc1)
conflictos12.b <- merge(conflictos12, dfp74.2[c(1,10,11)], by = "NUM")

Ahora, podemos graficar la distribucion de la densidad de ambos componentes:


library(ggplot2)

curva.rc1 <- ggplot(conflictos12.b, aes(RC1)) +
geom_density(fill="green", alpha=0.2) +
ggtitle("Distribución de RC1: Part. no convencional") + theme_bw()
curva.rc1

curva.rc2 <- ggplot(conflictos12.b, aes(RC2)) +
geom_density(fill="green", alpha=0.2) +
ggtitle("Distribución de RC2: Part. convencional") + theme_bw()
curva.rc2

___

Perfil de la protesta

Para perfilar a los ciudadanos que se involucran en participación política, planteamos algunas variables:

Antes le colocamos las etiquetas a las variables de interés (e.g., “AMBITOS”)

__

conflictos12.b$AMBITOS.f<-factor(conflictos12.b$AMBITOS)
levels(conflictos12.b$AMBITOS.f)<-c("Lima-Callao","Interior urbano","Interior rural")

__

Estadísticos descriptivos

Podemos calcular algunos estadísticos descriptivos por ámbito:

library(Rmisc)
## Loading required package: lattice
## Loading required package: plyr
tab1 <- summarySE(data = conflictos12.b, measurevar = "RC1", groupvars = "AMBITOS.f",na.rm=T)
tab1
##         AMBITOS.f   N        RC1        sd         se         ci
## 1     Lima-Callao 406  0.4221646 0.7160224 0.03553559 0.06985724
## 2 Interior urbano 450 -0.2513173 1.0681735 0.05035418 0.09895914
## 3  Interior rural 162 -0.2756418 1.0709963 0.08414542 0.16617106

ANOVA DE UN FACTOR

Para saber si estas diferencias son estadísticamente significativas, podemos realizar un contraste estadístico con la prueba ANOVA.


anova1 <- aov(conflictos12.b$RC1~conflictos12.b$AMBITOS.f)
summary(anova1)
##                            Df Sum Sq Mean Sq F value Pr(>F)    
## conflictos12.b$AMBITOS.f    2  112.9   56.45   63.34 <2e-16 ***
## Residuals                1015  904.6    0.89                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 185 observations deleted due to missingness

Contrastes Post-hoc


TukeyHSD(anova1)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = conflictos12.b$RC1 ~ conflictos12.b$AMBITOS.f)
## 
## $`conflictos12.b$AMBITOS.f`
##                                       diff        lwr        upr     p adj
## Interior urbano-Lima-Callao    -0.67348190 -0.8251548 -0.5218090 0.0000000
## Interior rural-Lima-Callao     -0.69780649 -0.9037244 -0.4918886 0.0000000
## Interior rural-Interior urbano -0.02432458 -0.2273509  0.1787017 0.9573463

Análisis de regresión múltiple

Podemos analizar, ahora, en un modelo de regresión lineal, el impacto de la zona de residencia (“AMBITOS.f”), junto con la variable “EDAD” que ya se conoce que tiene un impacto en el nivel de involucramiento en participación política no convencional:


m1 <- lm(RC1 ~ AMBITOS.f + EDAD, data = conflictos12.b)
summary(m1)
## 
## Call:
## lm(formula = RC1 ~ AMBITOS.f + EDAD, data = conflictos12.b)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5976 -0.5131  0.1979  0.6798  1.5859 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               0.263350   0.089388   2.946  0.00329 ** 
## AMBITOS.fInterior urbano -0.671210   0.064523 -10.403  < 2e-16 ***
## AMBITOS.fInterior rural  -0.697473   0.087587  -7.963 4.48e-15 ***
## EDAD                      0.004053   0.001944   2.085  0.03732 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9425 on 1014 degrees of freedom
##   (185 observations deleted due to missingness)
## Multiple R-squared:  0.1148, Adjusted R-squared:  0.1121 
## F-statistic: 43.82 on 3 and 1014 DF,  p-value: < 2.2e-16

Ejercicio 1

Realice el msimo procedimiento pero con el segundo componente rotado: