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
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
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
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
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")
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
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")