pacman::p_load(tidyverse, #Conjunto de paquetes, sobre todo dplyr y ggplot2
car, #Para recodificar
haven,
summarytools, #Para descriptivos
sjmisc,
kableExtra,
psych # para Alfa de Chronbach
)
options(scipen = 999) # para desactivar notacion cientifica
rm(list = ls()) # para limpiar el entorno de trabajoPráctico 04. Índices y estandarización de coeficientes
Métodos estadísticos para Ciencias Sociales III
Presentación
Para el taller práctico de hoy utilizaremos la base de datos del Estudio Longitudinal Social de Chile, realizado por el Centro de estudios del conflicto y la cohesión social COES.
El Estudio Longitudinal Social del Chile ELSOC, único en Chile y América Latina, consiste en encuestar a casi 3.000 chilenos, anualmente, a lo largo de una década. ELSOC ha sido diseñado para evaluar la manera cómo piensan, sienten y se comportan los chilenos en torno a un conjunto de temas referidos al conflicto y la cohesión social en Chile. La población objetivo son hombres y mujeres entre 15 y 75 años de edad, tiene una representación de la población nacional urbana, donde se obtuvo una muestra original de 2927 casos en el año 2016 y mantiene 1728 en 2022, además de una muestra de refresco en 2018.
Objetivo general
El objetivo de este ejercicio del práctico es revisar el proceso de construcción y validación de escalas en R.
Cargar base de datos
load(url("https://dataverse.harvard.edu/api/access/datafile/7245118")) #Cargar base de datosVisualización de datos
dim(elsoc_long_2016_2022.2)[1] 18035 750
Debido a la naturaleza longitudinal de ELSOC, la base de datos contiene 18035 casos (las mismas personas durante 6 años) y 750 variables (las mismas variables en 6 periodos distintos). Por lo tanto, para simplificar el proceso de análisis de este práctico trabajaremos solo con los casos y variables de quienes participaron en la primera ola (2016)
Datos y variables
Para el ejercicio de escalas, utilizaremos nuevamente la base de datos de ELSOC (que ya se enceuntra cargada), específicamente el módulo de Salud y Bienestar. De este módulo utilizaremos un concepto en particular llamado Estado de ánimo: sintomatología depresiva con los ítems:
- Frecuencia: Poco interés o alegría
- Frecuencia: Decaimiento, pesadez o desesperanza
- Frecuencia: Dificultad para dormir o exceso de sueño
- Frecuencia: Cansancio o sensación de falta de energía
- Frecuencia: Apetito disminuido o aumentado
- Frecuencia: Dificultad para concentrarse
- Frecuencia: Mala opinión de sí mismo
- Frecuencia: Enlentecimiento físico
- Frecuencia: Pensamiento de muerte o dañarse
Esta escala tiene solamente una dimensión, por lo que no es necesario crear objetos que contengan a cada dimensión (como vimos la clase pasada).
Filtrar base de datos
Filtraremos la base de datos para quedarnos con las observaciones correspondientes solamente a la ola 1, y además seleccionaremos los ítems de interés.
data <- elsoc_long_2016_2022.2 %>% filter(ola==1) %>% # seleccionamos solo los casos de la ola 1
select(s11_01,s11_02,s11_03,s11_04,s11_05,s11_06,s11_07,s11_08,s11_09, # items sintomatologia depresiva
edad=m0_edad, educacion=m01, sexo=m0_sexo)
head(data) s11_01 s11_02 s11_03 s11_04 s11_05 s11_06 s11_07 s11_08 s11_09 edad educacion
1 5 3 3 5 4 3 3 3 1 64 2
2 2 2 3 2 3 4 3 4 2 60 4
3 2 2 3 3 4 5 4 1 2 26 4
4 1 3 3 1 1 2 3 5 1 51 8
5 1 1 1 2 1 3 1 2 1 69 5
6 1 1 1 1 1 1 1 1 1 62 4
sexo
1 2
2 2
3 2
4 1
5 1
6 1
table(data$s11_01)
-999 -888 1 2 3 4 5
5 1 1279 1196 158 192 96
table(data$s11_02)
-999 -888 1 2 3 4 5
5 1 1302 1316 135 120 48
table(data$s11_03)
-999 -888 1 2 3 4 5
3 1 1336 1014 179 265 129
table(data$s11_04)
-999 -888 1 2 3 4 5
1 1 887 1414 223 261 140
Estos ítems cuentan con las mismas categorías de respuesta: (1) Nunca, (2) Algunos dias, (3) Mas de la mitad de los dias, (4) Casi todos los dias, y (5) Todos los dias. Además de los valores codificados como -888 y -999.
Recodificar
Recodificamos los valores -888 y -999 en NA y eliminamos los NAs.
data <- data %>%
set_na(., na = c(-888, -999)) %>%
na.omit()Dejamos la categoría ‘nunca’ como 0
data$s11_01 <- car::recode(data$s11_01, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_02 <- car::recode(data$s11_02, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_03 <- car::recode(data$s11_03, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_04 <- car::recode(data$s11_04, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_05 <- car::recode(data$s11_05, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_06 <- car::recode(data$s11_06, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_07 <- car::recode(data$s11_07, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_08 <- car::recode(data$s11_08, "1=0; 2=1; 3=2; 4=3; 5=4")
data$s11_09 <- car::recode(data$s11_09, "1=0; 2=1; 3=2; 4=3; 5=4")table(data$s11_01)
0 1 2 3 4
1271 1181 156 186 92
table(data$s11_02)
0 1 2 3 4
1294 1297 131 116 48
Análisis
Estimar correlación
Dado que la escala tiene solamente una dimensión, estimaremos la correlación de toda la escala.
cor(data) s11_01 s11_02 s11_03 s11_04 s11_05
s11_01 1.00000000 0.48504817 0.373507612 0.37238515 0.35747220
s11_02 0.48504817 1.00000000 0.499207684 0.55516195 0.42270447
s11_03 0.37350761 0.49920768 1.000000000 0.55914972 0.48589865
s11_04 0.37238515 0.55516195 0.559149723 1.00000000 0.51695542
s11_05 0.35747220 0.42270447 0.485898653 0.51695542 1.00000000
s11_06 0.30479866 0.41382370 0.390184411 0.45852671 0.41189753
s11_07 0.30149647 0.42444887 0.368800199 0.40338354 0.36905674
s11_08 0.30064883 0.39355621 0.349148546 0.39395276 0.35729659
s11_09 0.23404645 0.38776342 0.302209221 0.33274694 0.30439518
edad -0.03974520 0.07253636 -0.007570438 0.02045750 -0.05117849
educacion -0.05751038 -0.16265198 -0.066216488 -0.09496293 -0.05024246
sexo 0.10036699 0.15831204 0.145790309 0.17974363 0.13350208
s11_06 s11_07 s11_08 s11_09 edad
s11_01 0.30479866 0.30149647 0.30064883 0.23404645 -0.039745201
s11_02 0.41382370 0.42444887 0.39355621 0.38776342 0.072536357
s11_03 0.39018441 0.36880020 0.34914855 0.30220922 -0.007570438
s11_04 0.45852671 0.40338354 0.39395276 0.33274694 0.020457502
s11_05 0.41189753 0.36905674 0.35729659 0.30439518 -0.051178495
s11_06 1.00000000 0.42906242 0.42286090 0.34470826 0.021310378
s11_07 0.42906242 1.00000000 0.50622725 0.50642014 -0.023775207
s11_08 0.42286090 0.50622725 1.00000000 0.45608105 0.103270629
s11_09 0.34470826 0.50642014 0.45608105 1.00000000 0.052067774
edad 0.02131038 -0.02377521 0.10327063 0.05206777 1.000000000
educacion -0.10259505 -0.12051828 -0.12873924 -0.12604407 -0.346956015
sexo 0.13918921 0.07148001 0.07286352 0.06858853 0.060628303
educacion sexo
s11_01 -0.05751038 0.10036699
s11_02 -0.16265198 0.15831204
s11_03 -0.06621649 0.14579031
s11_04 -0.09496293 0.17974363
s11_05 -0.05024246 0.13350208
s11_06 -0.10259505 0.13918921
s11_07 -0.12051828 0.07148001
s11_08 -0.12873924 0.07286352
s11_09 -0.12604407 0.06858853
edad -0.34695602 0.06062830
educacion 1.00000000 -0.08940531
sexo -0.08940531 1.00000000
Podemos observar que todas las correlaciones son positivas, por lo que no quedaron ítems invertidos.
Estimar consistencia interna
Alfa de Chronbach
Primero, estimaremos la consistencia interna de cada dimensión con un Alfa de Chronbach.
psych::alpha(data)Some items ( educacion ) were negatively correlated with the first principal component and
probably should be reversed.
To do this, run the function again with the 'check.keys=TRUE' option
Reliability analysis
Call: psych::alpha(x = data)
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.013 0.77 0.8 0.22 3.4 0.015 4.9 1.3 0.3
95% confidence boundaries
lower alpha upper
Feldt -0.04 0.01 0.07
Duhachek -0.02 0.01 0.04
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
s11_01 -0.0029 0.75 0.78 0.21 3.0 0.0138 0.055 0.30
s11_02 -0.0188 0.73 0.76 0.20 2.7 0.0141 0.049 0.23
s11_03 -0.0154 0.73 0.77 0.20 2.8 0.0136 0.051 0.23
s11_04 -0.0204 0.73 0.76 0.20 2.7 0.0137 0.049 0.23
s11_05 -0.0070 0.74 0.77 0.20 2.8 0.0136 0.052 0.23
s11_06 -0.0131 0.74 0.77 0.20 2.8 0.0139 0.053 0.23
s11_07 -0.0038 0.74 0.77 0.20 2.8 0.0140 0.051 0.23
s11_08 -0.0187 0.74 0.77 0.20 2.8 0.0143 0.053 0.23
s11_09 -0.0039 0.75 0.78 0.21 2.9 0.0144 0.054 0.30
edad 0.6956 0.80 0.82 0.26 4.0 0.0088 0.045 0.35
educacion 0.1217 0.82 0.83 0.29 4.4 0.0126 0.031 0.35
sexo 0.0061 0.78 0.81 0.24 3.5 0.0147 0.056 0.35
Item statistics
n raw.r std.r r.cor r.drop mean sd
s11_01 2886 0.18 0.584 0.5277 0.12 0.84 1.01
s11_02 2886 0.32 0.727 0.7210 0.27 0.73 0.85
s11_03 2886 0.25 0.688 0.6669 0.19 0.91 1.13
s11_04 2886 0.29 0.735 0.7314 0.23 1.09 1.07
s11_05 2886 0.20 0.666 0.6352 0.14 0.80 1.07
s11_06 2886 0.26 0.662 0.6252 0.20 0.59 0.96
s11_07 2886 0.21 0.663 0.6390 0.16 0.41 0.80
s11_08 2886 0.32 0.661 0.6307 0.27 0.42 0.85
s11_09 2886 0.24 0.604 0.5592 0.21 0.21 0.61
edad 2886 0.93 0.135 0.0019 -0.11 46.04 15.30
educacion 2886 -0.25 -0.054 -0.2092 -0.37 5.26 2.20
sexo 2886 0.14 0.319 0.1906 0.11 1.60 0.49
data2 <- dplyr::select(data, s11_01,s11_02,s11_03,s11_04,s11_05,s11_06,s11_07,s11_08,s11_09)
psych::alpha(data2)
Reliability analysis
Call: psych::alpha(x = data2)
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.85 0.86 0.85 0.4 6.1 0.0039 0.67 0.64 0.39
95% confidence boundaries
lower alpha upper
Feldt 0.85 0.85 0.86
Duhachek 0.85 0.85 0.86
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
s11_01 0.85 0.85 0.85 0.42 5.8 0.0041 0.0050 0.41
s11_02 0.83 0.84 0.83 0.39 5.1 0.0046 0.0062 0.37
s11_03 0.84 0.84 0.83 0.40 5.3 0.0045 0.0058 0.40
s11_04 0.83 0.84 0.83 0.39 5.1 0.0047 0.0051 0.39
s11_05 0.84 0.84 0.84 0.40 5.4 0.0044 0.0065 0.39
s11_06 0.84 0.84 0.84 0.40 5.4 0.0044 0.0072 0.39
s11_07 0.84 0.84 0.83 0.40 5.3 0.0044 0.0065 0.39
s11_08 0.84 0.84 0.84 0.40 5.4 0.0043 0.0067 0.40
s11_09 0.85 0.85 0.84 0.42 5.7 0.0042 0.0051 0.41
Item statistics
n raw.r std.r r.cor r.drop mean sd
s11_01 2886 0.62 0.61 0.53 0.49 0.84 1.01
s11_02 2886 0.74 0.74 0.71 0.66 0.73 0.85
s11_03 2886 0.73 0.70 0.66 0.62 0.91 1.13
s11_04 2886 0.77 0.75 0.72 0.67 1.09 1.07
s11_05 2886 0.71 0.69 0.63 0.59 0.80 1.07
s11_06 2886 0.68 0.68 0.62 0.57 0.59 0.96
s11_07 2886 0.67 0.70 0.65 0.58 0.41 0.80
s11_08 2886 0.66 0.68 0.62 0.56 0.42 0.85
s11_09 2886 0.58 0.63 0.56 0.50 0.21 0.61
Non missing response frequency for each item
0 1 2 3 4 miss
s11_01 0.44 0.41 0.05 0.06 0.03 0
s11_02 0.45 0.45 0.05 0.04 0.02 0
s11_03 0.46 0.35 0.06 0.09 0.04 0
s11_04 0.31 0.48 0.08 0.09 0.05 0
s11_05 0.51 0.33 0.05 0.07 0.04 0
s11_06 0.63 0.26 0.05 0.05 0.03 0
s11_07 0.72 0.21 0.03 0.03 0.01 0
s11_08 0.73 0.19 0.03 0.03 0.02 0
s11_09 0.86 0.10 0.02 0.01 0.01 0
data <- data %>%
rowwise() %>%
mutate(sintomatologia_depresiva = sum(s11_01,s11_02,s11_03,s11_04,s11_05,s11_06,s11_07,s11_08,s11_09))
summary(data$sintomatologia_depresiva) Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 2.000 5.000 5.991 8.000 36.000
Estandarización de variables
data <- data %>%
select(sintomatologia_depresiva, edad, educacion, sexo) Descriptivos
sjmisc::descr(data,
show = c("label","range", "mean", "sd", "NA.prc", "n"))%>% # Selecciona estadísticos
kable(.,"markdown") # Esto es para que se vea bien en quarto| var | label | n | NA.prc | mean | sd | range | |
|---|---|---|---|---|---|---|---|
| 4 | sintomatologia_depresiva | sintomatologia_depresiva | 2886 | 0 | 5.991338 | 5.7511293 | 36 (0-36) |
| 1 | edad | edad | 2886 | 0 | 46.040540 | 15.3004147 | 70 (18-88) |
| 2 | educacion | educacion | 2886 | 0 | 5.257796 | 2.1950156 | 9 (1-10) |
| 3 | sexo | sexo | 2886 | 0 | 1.601178 | 0.4897408 | 1 (1-2) |
Estandarización
data_std = data.frame(scale(data))sjmisc::descr(data_std,
show = c("label","range", "mean", "sd", "NA.prc", "n"))%>% # Selecciona estadísticos
kable(.,"markdown") # Esto es para que se vea bien en quarto| var | label | n | NA.prc | mean | sd | range | |
|---|---|---|---|---|---|---|---|
| 4 | sintomatologia_depresiva | sintomatologia_depresiva | 2886 | 0 | 0 | 1 | 6.26 (-1.04-5.22) |
| 1 | edad | edad | 2886 | 0 | 0 | 1 | 4.58 (-1.83-2.74) |
| 2 | educacion | educacion | 2886 | 0 | 0 | 1 | 4.1 (-1.94-2.16) |
| 3 | sexo | sexo | 2886 | 0 | 0 | 1 | 2.04 (-1.23-0.81) |
Estimar regresiones
reg <- lm(sintomatologia_depresiva ~ educacion + edad + sexo, data=data)
reg_std <- lm(sintomatologia_depresiva ~ educacion + edad + sexo, data=data_std)sjPlot::tab_model(list(reg, reg_std),
show.ci=FALSE,
show.se = TRUE,
p.style = "stars",
dv.labels = c("Modelo lineal", "Modelo estandarizado"),
string.pred = "Predictores",
string.est = "β")| Modelo lineal | Modelo estandarizado | |||
| Predictores | β | std. Error | β | std. Error |
| (Intercept) | 5.44 *** | 0.62 | -0.00 | 0.02 |
| educacion | -0.37 *** | 0.05 | -0.14 *** | 0.02 |
| edad | -0.02 * | 0.01 | -0.04 * | 0.02 |
| sexo | 1.99 *** | 0.21 | 0.17 *** | 0.02 |
| Observations | 2886 | 2886 | ||
| R2 / R2 adjusted | 0.049 / 0.048 | 0.049 / 0.048 | ||
| * p<0.05 ** p<0.01 *** p<0.001 | ||||
Ejercicio
- Interprete los coeficientes
Modelo lineal (coeficientes no estandarizados)
Intercepto (5.44, p < 0.001): Cuando todas las variables independientes (educación, edad, sexo) valen 0, el puntaje esperado en sintomatología depresiva es 5.44. Como las escalas de las variables predictores pueden no tener un 0 “realista”, el intercepto no suele ser de interés sustantivo aquí, pero es necesario en el modelo.
Educación (β = -0.37, p < 0.001): Cada incremento en el nivel educativo se asocia con una disminución de 0.37 puntos en sintomatología depresiva, en promedio y controlando por edad y sexo. Es un efecto negativo y estadísticamente significativo con un 99,9% de confianza
Edad (β = -0.02, p < 0.05): Por cada año adicional de edad, los síntomas depresivos disminuyen en 0.02 puntos, controlando por educación y sexo. Efecto estadísticamente significativo con un 95% de confianza
Sexo (β = 1.99, p < 0.001): Pertenecer a la categoría ‘mujeres’ se asocia con un aumento promedio de 1.99 puntos en sintomatología depresiva respecto al grupo de referencia (hombres), controlando por educación y edad. Efecto estadísticamente significativo con un 99,9% de confianza
Modelo estandarizado
Intercepto (-0.00, ns): No tiene interpretación relevante en el modelo estandarizado, ya que todas las variables fueron centradas en media cero.
Educación (β = -0.14, p < 0.001): Un aumento de una desviación estándar en educación se asocia con una disminución de 0.14 desviaciones estándar en sintomatología depresiva. Es un efecto negativo y estadísticamente significativo con un 99,9% de confianz
Edad (β = -0.04, p < 0.05): Cada desviación estándar adicional en edad se asocia con 0.04 desviaciones estándar menos en síntomas depresivos. Efecto estadísticamente significativo con un 95% de confianza
Sexo (β = 0.17, p < 0.001): Ser mujer aumenta en 0.17 desviaciones estándar la sintomatología depresiva respecto a hombres, en promedio. Efecto estadísticamente significativo con un 99,9% de confianza
R² = 0.049 (ajustado 0.048): El modelo explica aproximadamente un 5% de la varianza en sintomatología depresiva. Esto indica que, aunque los predictores son significativos, la mayor parte de la variación en los síntomas se explica por otros factores no incluidos.
- ¿Qué diferencias hay entre un modelo y otro?
- Escala de los coeficientes
En el modelo lineal (no estandarizado), los coeficientes están en las unidades originales de las variables. Ejemplo: un año más de edad equivale a -0.02 puntos en síntomas depresivos.
En el modelo estandarizado, los coeficientes están expresados en desviaciones estándar, lo que permite comparar directamente la magnitud de los efectos. Ejemplo: un aumento de 1 desviación estándar en educación equivale a -0.14 desviaciones estándar en síntomas depresivos.
- Interpretación del intercepto
En el modelo lineal, el intercepto tiene un valor “real” (5.44), aunque no siempre interpretable si los predictores no toman valor 0 en la práctica.
En el modelo estandarizado, el intercepto suele quedar cercano a 0 y no tiene interpretación sustantiva, porque las variables se centraron en la media.
- Comparabilidad de predictores
En el modelo lineal no puedes comparar directamente la magnitud de educación, edad y sexo, ya que cada uno tiene escalas distintas.
En el modelo estandarizado sí puedes hacerlo: se observa, por ejemplo, que sexo (β=0.17) y educación (β=-0.14) tienen un peso mayor que edad (β=-0.04).
- Bondad de ajuste
El R² se mantiene idéntico (0.049), porque estandarizar las variables no cambia el poder explicativo del modelo, solo la escala de los coeficientes.
- ¿Qué ventajas o desventajas tiene trabajar con un modelo estandarizado?
- Ventajas
Comparabilidad entre predictores: permite identificar cuáles variables tienen mayor peso relativo sobre la variable dependiente.
Neutraliza escalas distintas: útil cuando se combinan variables con diferentes unidades (años, niveles, categorías dummy, etc.).
Facilita la interpretación en términos relativos: por ejemplo, puedes decir que el sexo tiene un efecto mayor que la edad.
- Desventajas
Pérdida de interpretación sustantiva: los coeficientes dejan de estar en las unidades originales, por lo que no puedes decir “un año más de edad reduce 0.02 puntos en síntomas”.
Intercepto poco informativo: al centrar y escalar, el intercepto no tiene sentido práctico.
En variables dicotómicas (como sexo), la interpretación en desviaciones estándar puede ser menos intuitiva que en unidades originales.
Dificultad para comunicar los resultados.