Preparación de los datos

Importamos nuestra BDD ISSP 2012

library(haven)
data <- read_sav("C:/Users/alvar/OneDrive/Escritorio/Analisis Estadistico Avanzado UDC/ISSP 2012 copia.sav")

Definimos nuestras variables para el ACP, y eliminamos sus valores perdidos:

myvars <- c("ES_V5", "ES_V6", "ES_V7", "ES_V8", "ES_V9", "ES_V10", "ES_V11",
            "ES_V17", "ES_V18", "ES_V19", "ES_V20")

data <- data[!is.na(data$ES_V5), ]
data <- data[!is.na(data$ES_V6), ]
data <- data[!is.na(data$ES_V7), ]
data <- data[!is.na(data$ES_V8), ]
data <- data[!is.na(data$ES_V9), ]
data <- data[!is.na(data$ES_V10), ]
data <- data[!is.na(data$ES_V11), ]
data <- data[!is.na(data$ES_V17), ]
data <- data[!is.na(data$ES_V18), ]
data <- data[!is.na(data$ES_V19), ]
data <- data[!is.na(data$ES_V20), ]

summary(data[, myvars])
##      ES_V5           ES_V6           ES_V7           ES_V8      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.000  
##  Median :2.000   Median :2.000   Median :2.000   Median :3.000  
##  Mean   :2.173   Mean   :2.498   Mean   :2.346   Mean   :2.748  
##  3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:3.000  
##  Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000  
##      ES_V9           ES_V10          ES_V11          ES_V17     
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:2.000   1st Qu.:1.000   1st Qu.:3.000   1st Qu.:1.000  
##  Median :3.000   Median :2.000   Median :3.000   Median :2.000  
##  Mean   :2.609   Mean   :1.681   Mean   :3.216   Mean   :1.896  
##  3rd Qu.:3.000   3rd Qu.:2.000   3rd Qu.:4.000   3rd Qu.:2.000  
##  Max.   :4.000   Max.   :4.000   Max.   :4.000   Max.   :4.000  
##      ES_V18          ES_V19          ES_V20    
##  Min.   :1.000   Min.   :1.000   Min.   :1.00  
##  1st Qu.:2.000   1st Qu.:2.000   1st Qu.:2.00  
##  Median :2.000   Median :2.000   Median :2.00  
##  Mean   :2.282   Mean   :2.234   Mean   :2.35  
##  3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:3.00  
##  Max.   :4.000   Max.   :4.000   Max.   :4.00

Aplicación de la función policórica (psych)

Calculamos la matriz policórica con la función polychoric del paquete psych. Recordad que usamos esta función porque nuestros datos son de tipo ordinal. En caso de estar utilizando variables de tipo categórico, es más recomendable usar la función tetrachoric de este mismo paquete (psych)

library(psych)
## Warning: package 'psych' was built under R version 4.2.3
data.poly <- as.data.frame(data[,myvars])
r <- polychoric(data.poly)
View(r$rho)
#Creamos objeto Matriz Policórica
Matriz <- r$rho

Adecuación del modelo: KMO y Barlett

Comprobamos la adecuación del modelo factorial con el estadístico KMO y el test de esfericidad de Barlett

KMO(Matriz)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = Matriz)
## Overall MSA =  0.8
## MSA for each item = 
##  ES_V5  ES_V6  ES_V7  ES_V8  ES_V9 ES_V10 ES_V11 ES_V17 ES_V18 ES_V19 ES_V20 
##   0.85   0.82   0.82   0.86   0.75   0.79   0.82   0.76   0.93   0.73   0.71
cortest.bartlett(Matriz)
## Warning in cortest.bartlett(Matriz): n not specified, 100 used
## $chisq
## [1] 480.4297
## 
## $p.value
## [1] 3.11273e-69
## 
## $df
## [1] 55

Decidimos cuántos factores extraer con el criterio de raíz latente

Calculamos los autovalores de cada factor que es posible extraer y se decide extraer 4 factores atendiendo al criterio de raíz latente

autovalores <- eigen(Matriz)
round(autovalores$values,2)
##  [1] 4.26 1.45 1.24 1.07 0.73 0.55 0.53 0.41 0.38 0.32 0.07

Modelamos nuestro APC con rotación Varimax

Especificamos la matriz de datos sobre la que calcular el modelo, el número de factores a extraer, y el método de rotación:

Modelo <- pca(Matriz, nfactors = 4, rotate = "varimax")

Cargas factoriales y comunalidades

Vemos las cargas factoriales y las comunalidades de nuestras variables originales con los 4 factores extraídos. Ambos estadísticos son objetos ya creados dentro del Modelo.

#Observamos las cargas factoriales 
print(Modelo$loadings, digits = 2)
## 
## Loadings:
##        RC1   RC2   RC3   RC4  
## ES_V5   0.22 -0.75        0.15
## ES_V6  -0.12  0.81  0.15      
## ES_V7  -0.13  0.81  0.11      
## ES_V8  -0.25  0.40  0.66      
## ES_V9        -0.16  0.83      
## ES_V10       -0.27 -0.34  0.66
## ES_V11 -0.34  0.33  0.67 -0.22
## ES_V17  0.14              0.86
## ES_V18  0.80 -0.22            
## ES_V19  0.90 -0.14 -0.18  0.14
## ES_V20  0.91 -0.15 -0.22      
## 
##                 RC1  RC2  RC3  RC4
## SS loadings    2.57 2.34 1.82 1.29
## Proportion Var 0.23 0.21 0.17 0.12
## Cumulative Var 0.23 0.45 0.61 0.73
#Observamos las comunalidades
print(Modelo$communality, digits = 2)
##  ES_V5  ES_V6  ES_V7  ES_V8  ES_V9 ES_V10 ES_V11 ES_V17 ES_V18 ES_V19 ES_V20 
##   0.64   0.70   0.69   0.66   0.71   0.63   0.72   0.77   0.70   0.88   0.91

Puntuaciones factoriales

Calculamos las puntuaciones factoriales con la función factor.scores()

Puntuaciones <- factor.scores(data.poly, Modelo)

Para terminar, hacemos el merge de las puntuaciones calculadas con nuestra BDD original

Puntuaciones.factoriales <- Puntuaciones$scores
ISSP_2012_poly <- cbind(data,Puntuaciones.factoriales)  
#Usamos write_sav para exportar en formato .sav nuestra BDD con las puntuaciones polycóricas
write_sav(ISSP_2012_poly,"ISSP_2012_poly.sav")