Introducción

En este documento el lector encontrará todos los pasos seguidos por el autor del articulo para realizar el análisis de datos necesario para comporbar las hipótesis de investigación. Por todos los pasos se hace referencia a la bases de datos inicial (base de datos en bruto), selección de variables, adecuación de variables, estimación de modelos.

Si usted detecta algún error, tiene alguna sugerencia o requiere mayor información puede enviar un correo electrónico a shlondon8@gmail.com

Bases de datos en bruto

Descargar las bases de datos correspondientes a los años 2011 y 2012, se encuentran en el siguiente sitio web http://www.gemconsortium.org/data/sets#baps. Descargar los siguientes archivos: GEM 2012 APS Global Individual Level Data y GEM 2011 APS Global Individual Level Data. Dichos archivos estan en formato .sav

El siguiente código permite leer o cargar dichas bases de datos, así como unirlas a partir de las variables necesarias para el análisis de datos.

#Libreria para leer archivos en formato .sav
library(foreign)

#Leer base de datos 2011
bdcompleta2011 <- read.spss("GEM 2011 APS Global - Individual Level Data.sav",
                            to.data.frame = TRUE)

#Leer base de datos 2012
bdcompleta2012 <- read.spss("GEM 2012 APS Global - Individual Level Data.sav",
                            to.data.frame = TRUE)

#Vector con las variables de interes
vec_sele <- c("futsup",
              "age","gender","GEMEDUC","GEMWORK3","GEMHHINC",
              "opport","suskill","fearfail",
              "nbgoodc","nbstatus","knowent","nbmedia","country")

#Se selecciona de cada base de datos las variables de interes
bdcompleta2011 <- bdcompleta2011[,vec_sele]
bdcompleta2012 <- bdcompleta2012[,vec_sele]

#Se unen las bases de datos
bd <- rbind.data.frame(bdcompleta2011,bdcompleta2012)

Si se mira el nombre de las columnas de la nueva base de datos luego de la unión, este corresponde a la abreviación otorgada por el proyecto GEM a cada una de las variables medidas, para mayor información visitar http://www.gemconsortium.org/about/news. Tener en cuenta la siguiente convención ya que se expresan las abreviaciónes de las variables de interés utilizadas en los modelos estimados del artículo:

Abreviacion Nombre_Variable
futsup IE
age EDAD
gender GENERO
GEMEDUC EDUCACION
GEMWORK3 ESTADOLABORAL
GEMHHINC INGRESO
opport OPORT
suskill CONFIANZA
fearfail MIEDOFRACASO
nbgoodc CARRERADESEABLE
nbstatus STATUS
knowent CONOCEROTROS
nbmedia DIVULGACION

Para consultar la definición operacional de cada una de las variables así como los diferentes niveles y el nivel referencia de las variables cualitativas visitar el sitio web http://rpubs.com/Sahlre/ModelosyVariables.

La unión anterior produce una base de datos con las siguientes dimensiones

## [1] 361115     14

351115 observaciones y 14 variables. Son 14 variables ya que hay 13 variables de interés y 1 que hace referencia al país.

Luego se seleccionan las observaciones que correspondan al país Colombia

#Elegir observaciones relativas a Colombia
bd <- bd[bd$country=="Colombia",]

#Dimensiones de la base de datos final
dim(bd)
## [1] 18845    14

De esta manera la base de datos final posee un total de 18845 registros u observaciones.

Transformación de variables

Algunas variables deben ser transformadas con el propósito de obtener los mismos resultados reflejados en el artículo. Por ejemplo si se estima algún modelo con las variables tal cual están en la base de datos final (bd) sería complicado obtener exactamente los mismos resultados expuestos en el artículo, esto se debe a que los niveles de las variables cualitativas estan ordenados, por defecto, alfabéticamente y es complicado que este orden generado automáticamente coincida con el orden deseado del investigador.

El siguiente código realiza las transformaciones necesarias

#Se organizan los niveles de las variables cualitativas GEMEDUC, GEMWORK Y GEMHINC
#para obtener los mismos resultados de los modelos logisticos multivariados
#impresos en el documento
bd$GEMEDUC <- factor(bd$GEMEDUC,
                     levels = c("SECONDARY DEGREE","NONE", "SOME SECONDARY", "POST SECONDARY",
                                "GRAD EXP"))

bd$GEMWORK3 <- factor(bd$GEMWORK3,
                      levels = c("Retired students","Not working","Work:F-T, P-T"))

bd$GEMHHINC <- factor(bd$GEMHHINC,
                      levels = c("Middle 33%tile","Lowest 33%tile","Upper  33%tile"))

Estimación de modelos

A continuación se encuentra el código que permite estimar los cinco modelos del artículo. Al final se crea una tabla que se asemeja a la tabla 1 del articulo aunque con mayor cantidad de información.

#Libreria con la función lrm() que calcula más estadísticos de evaluación de un modelo de
#regresión logística que la función glm(). Esos estadísticos serán necesarios para la construcción del Valor p de log likelihood ??^2 test y del estadístico Nagelkerke

library(rms)

#Modelo 1
m1 <- lrm(futsup ~  age + gender + GEMEDUC + GEMWORK3 + GEMHHINC + #Variables socioeconómicas
                                   opport + suskill + fearfail + #Variables perceptuales
                                   nbgoodc + nbstatus + knowent + nbmedia, #Variables de entorno
          data = bd)

#Modelo 2
m2 <- lrm(futsup ~  gender*(age + GEMEDUC + GEMWORK3 + GEMHHINC), #Variables socioeconómicas
          data = bd)

#Modelo 3
m3 <- lrm(futsup ~ gender*(opport + suskill + fearfail),
          data = bd)

#Modelo 4
m4 <- lrm(futsup ~ gender*(nbgoodc + nbstatus + knowent + nbmedia), #Variables de entorno
          data = bd)

#Modelo 5
m5 <- lrm(futsup ~  gender*(age +GEMEDUC + GEMWORK3 + GEMHHINC +  #Variables socioeconómicas
                                    opport + suskill + fearfail + #Variables perceptuales
                                    nbgoodc + nbstatus + knowent + nbmedia), #Variables de entorno social
          data = bd)

Los códigos que se presentarán a continuación permiten recrear una versión similar de la tabla 1 del artículo ya que por ejemplo el nombre de las variables y sus niveles están en inglés. Aunque en esta ocasión la tabla contiene mayor cantidad de información: se adiciona el error estándar de cada coeficiente, así como el valor p asociado a cada coeficiente.

En esta primer parte se recrea la parte final de la tabla 1 que se refiere al intercepto, el tamaño de muestra, el valor p de la prueba log likelihood Chi cuadrado, y las medidas de bondad de ajuste Negelkerke y porcentaje de predicciones correctas.

#Modelo 1

        #Valor p de log likelihood ??^2 test 
        plog1 <- m1$stats["P"]

        #Intercepto
        inter1 <- m1$coefficients[1]

        #Grados de libertad de log likelihood ??^2 test 
        gl1 <- m1$stats["d.f."]

        #Negelkerke
        Neg1 <- m1$stats["R2"]

        #Tamaño de la muestra sobre la cual se estimo el modelo
        n1 <- m1$stats["Obs"]
        
#Modelo 2

        #Valor p de log likelihood ??^2 test 
        plog2 <- m2$stats["P"]
        
        #Intercepto
        inter2 <- m2$coefficients[1]

        #Grados de libertad de log likelihood ??^2 test 
        gl2 <- m2$stats["d.f."]

        #Negelkerke
        Neg2 <- m2$stats["R2"]

        #Tamaño de la muestra sobre la cual se estimo el modelo
        n2 <- m2$stats["Obs"]
        
#Modelo 3

        #Valor p de log likelihood ??^2 test 
        plog3 <- m3$stats["P"]
        
        #Intercepto
        inter3 <- m3$coefficients[1]

        #Grados de libertad de log likelihood ??^2 test 
        gl3 <- m3$stats["d.f."]

        #Negelkerke
        Neg3 <- m3$stats["R2"]

        #Tamaño de la muestra sobre la cual se estimo el modelo
        n3 <- m3$stats["Obs"]
        
#Modelo 4

        #Valor p de log likelihood ??^2 test 
        plog4 <- m4$stats["P"]
        
        #Intercepto
        inter4 <- m4$coefficients[1]

        #Grados de libertad de log likelihood ??^2 test 
        gl4 <- m4$stats["d.f."]

        #Negelkerke
        Neg4 <- m4$stats["R2"]

        #Tamano de la muestra sobre la cual se estimo el modelo
        n4 <- m4$stats["Obs"]
        
#Modelo 5

        #Valor p de log likelihood ??^2 test 
        plog5 <- m5$stats["P"]
        
        #Intercepto
        inter5 <- m5$coefficients[1]

        #Grados de libertad de log likelihood ??^2 test 
        gl5 <- m5$stats["d.f."]

        #Negelkerke
        Neg5 <- m5$stats["R2"]

        #Tamano de la muestra sobre la cual se estimo el modelo
        n5 <- m5$stats["Obs"]
        
#Para el porcentaje de predicciones correctas se estiman nuevamente los cinco
#modelos con la función glm esto con el proposito de utilizar la función 
#predict que permite calcular de forma eficiente las predicciones de un modelo
#a partir de una base de datos dada.
        
#Estos modelos serán utilizados para generar la estimación, error estándar y valor p
#de cada uno de los coeficientes de los cinco modelos
        
#Modelo 1 con la función glm
m1glm <- glm(futsup ~ age + gender + GEMEDUC + GEMWORK3 + GEMHHINC + #Variables socioeconómicas
                  opport + suskill + fearfail + #Variables perceptuales
                  nbgoodc + nbstatus + knowent + nbmedia, #Variables de entorno
          family = "binomial",
          data = bd)
#Porcentaje general de predicciones correctas.
bdnuevo <- bd[,c("age","gender", "GEMEDUC", "GEMWORK3", "GEMHHINC",
                 "opport","suskill","fearfail",
                 "nbgoodc", "nbstatus", "knowent", "nbmedia")]
bdnuevo$futsupP <- predict(m1glm,newdata=bdnuevo,type = "response")
bdnuevo$futsup <- bd$futsup
bdnuevo$futsupP2 <- ifelse(bdnuevo$futsupP >= 0.5, "Yes", "No")
d <- round(xtabs(~ futsupP2 + futsup, data = bdnuevo)/13371,4)
ppcm1 <-(d[1,1] + d[2,2])*100

#Modelo 2 con la función glm
m2glm <- glm(futsup ~ gender*(age + GEMEDUC + GEMWORK3 + GEMHHINC),#Variables socioeconómicas
             family = "binomial", 
             data = bd)

#Porcentaje general de predicciones correctas.
bdnuevo <- bd[,c("age","gender", "GEMEDUC", "GEMWORK3", "GEMHHINC")]
bdnuevo$futsupP <- predict(m2glm,newdata=bdnuevo,type = "response")
bdnuevo$futsup <- bd$futsup
bdnuevo$futsupP2 <- ifelse(bdnuevo$futsupP >= 0.5, "Yes", "No")
d <- round(xtabs(~ futsupP2 + futsup, data = bdnuevo)/15087,4)
ppcm2 <- (d[1,1] + d[2,2])*100

#Modelo 3 con la función glm
m3glm <- glm(futsup ~ gender*(opport + suskill + fearfail),  #Variables perceptuales
          family = "binomial",
          data = bd)

#Porcentaje general de predicciones correctas.
bdnuevo <- bd[,c("gender","opport","suskill","fearfail")]
bdnuevo$futsupP <- predict(m3glm,newdata=bdnuevo,type = "response")
bdnuevo$futsup <- bd$futsup
bdnuevo$futsupP2 <- ifelse(bdnuevo$futsupP >= 0.5, "Yes", "No")
d <- round(xtabs(~ futsupP2 + futsup, data = bdnuevo)/15053,4)
ppcm3 <- (d[1,1] + d[2,2])*100

#Modelo 4 con la función glm
m4glm <- glm(futsup ~ gender*(nbgoodc + nbstatus + knowent + nbmedia), #Variables de entorno
          family = "binomial",
          data = bd)

#Porcentaje general de predicciones correctas.
bdnuevo <- bd[,c("gender", "nbgoodc", "nbstatus", "knowent", "nbmedia")]
bdnuevo$futsupP <- predict(m4glm,newdata=bdnuevo,type = "response")
bdnuevo$futsup <- bd$futsup
bdnuevo$futsupP2 <- ifelse(bdnuevo$futsupP >= 0.5, "Yes", "No")
d <- round(xtabs(~ futsupP2 + futsup, data = bdnuevo)/15968,4)
ppcm4 <- (d[1,1] + d[2,2])*100

#Modelo 5 con la función glm
m5glm <- glm(futsup ~  gender*(age +GEMEDUC + GEMWORK3 + GEMHHINC +  #Variables socioeconómicas
                                   opport + suskill + fearfail + #Variables perceptuales
                                  nbgoodc + nbstatus + knowent + nbmedia), #Variables de entorno social
          family = "binomial",
          data = bd)

#Porcentaje general de predicciones correctas.
bdnuevo <- bd[,c("age","gender", "GEMEDUC", "GEMWORK3", "GEMHHINC",
                 "opport","suskill","fearfail",
                 "nbgoodc", "nbstatus", "knowent", "nbmedia")]
bdnuevo$futsupP <- predict(m5glm,newdata=bdnuevo,type = "response")
bdnuevo$futsup <- bd$futsup
bdnuevo$futsupP2 <- ifelse(bdnuevo$futsupP >= 0.5, "Yes", "No")
d <- round(xtabs(~ futsupP2 + futsup, data = bdnuevo)/13371,4)
ppcm5 <- (d[1,1] + d[2,2])*100

#Se crea tabla con el intercepto, Tamaño de la muestra, prueba log likelihood Chi cuadrada y las medidas de bondad de ajuste Negelkerke y Porcentaje de predicciones correctas
tabla1 <- data.frame(Estadisticos = 
                            c("Intercepto",
                              "Tamaño Muestra", 
                              "Valor p test Likelihood Chi^2 (g.l.)", 
                              "Negelkerke", 
                              "% de predicciones correctas"),
                    Modelo1 = c(as.character(round(exp(inter1),2)),
                                as.character(n1),
                                paste(as.character(round(plog1,3)),"(",
                                      as.character(gl1), ")"),
                                as.character(round(Neg1,3)),
                                as.character(round(ppcm1,2))),
                    Modelo2 = c(as.character(round(exp(inter2),2)),
                                as.character(n2),
                                paste(as.character(round(plog2,3)),"(",
                                      as.character(gl2), ")"),
                                as.character(round(Neg2,3)),
                                as.character(round(ppcm2,2))),
                    Modelo3 = c(as.character(round(exp(inter3),2)),
                                as.character(n3),
                                paste(as.character(round(plog3,3)),"(",
                                      as.character(gl3), ")"),
                                as.character(round(Neg3,3)),
                                as.character(round(ppcm3,2))),
                    Modelo4 = c(as.character(round(exp(inter4),2)),
                                as.character(n4),
                                paste(as.character(round(plog4,3)),"(",
                                      as.character(gl4), ")"),
                                as.character(round(Neg4,3)),
                                as.character(round(ppcm4,2))),
                    Modelo5 = c(as.character(round(exp(inter5),2)),
                                as.character(n5),
                                paste(as.character(round(plog5,3)),"(",
                                      as.character(gl5), ")"),
                                as.character(round(Neg5,3)),
                                as.character(round(ppcm5,2)))
                    )
#Libreria para crear una agradable tabla en Rmarkdown
library(knitr)
kable(tabla1)
Estadisticos Modelo1 Modelo2 Modelo3 Modelo4 Modelo5
Intercepto 1.04 2.12 0.69 0.78 1.1
Tamaño Muestra 13371 15087 15053 15968 13371
Valor p test Likelihood Chi^2 (g.l.) 0 ( 17 ) 0 ( 19 ) 0 ( 7 ) 0 ( 9 ) 0 ( 33 )
Negelkerke 0.116 0.06 0.083 0.034 0.12
% de predicciones correctas 67.8 64.14 65.05 61.36 67.49

Y en esta última parte se recrea la parte inicial de la tabla 1, donde están los coeficientes estimados de cada uno de los cinco modelos. Se adiciona el intercpeto en esta ocación para que el usuario observe la significancia estadística de dicho parámetro ya que en la tabla recreada en la primera parte no se proporcionó. Tener en cuenta las siguientes abreviaciones C = Coeficiente, EE = Error Estándar, P = Valor P, M1 = Modelo 1, M2 = Modelo 2, M3 = Modelo 3, M4 = Modelo 4, M5 = Modelo 5, entonces la abreviación CM1 hace referencia a los coeficientes del Modelo 1.

tabla2 <- data.frame(Parametros = row.names(as.data.frame(m5glm$coefficients)),
                     CM1 = c(as.character(round(exp(as.data.frame(summary(m1glm)$coef)$Estimate),2)),rep("",16)),
                     EEM1 = c(as.character(round(as.data.frame(summary(m1glm)$coef)$Std,2)),rep("",16)),
                     PM1 = c(as.character(round(as.data.frame(summary(m1glm)$coef)$Pr,2)),rep("",16)),
                     CM2 = c(as.character(round(exp(as.data.frame(summary(m2glm)$coef)$Estimate),2))[1:11],
                                rep("",7),
                                as.character(round(exp(as.data.frame(summary(m2glm)$coef)$Estimate),2))[12:20],
                                rep("",7)),
                     EEM2 = c(as.character(round(as.data.frame(summary(m2glm)$coef)$Std,2))[1:11],
                                rep("",7),
                                as.character(round(as.data.frame(summary(m2glm)$coef)$Std,2))[12:20],
                                rep("",7)),
                     PM2 = c(as.character(round(as.data.frame(summary(m2glm)$coef)$Pr,2))[1:11],
                                rep("",7),
                                as.character(round(as.data.frame(summary(m2glm)$coef)$Pr,2))[12:20],
                                rep("",7)),
                     CM3 = c(as.character(round(exp(as.data.frame(summary(m3glm)$coef)$Estimate),2))[1:2],
                                rep("",9),
                                as.character(round(exp(as.data.frame(summary(m3glm)$coef)$Estimate),2))[3:5],
                                rep("",13),
                                as.character(round(exp(as.data.frame(summary(m3glm)$coef)$Estimate),2))[6:8],
                                rep("",4)),
                     EEM3 = c(as.character(round(as.data.frame(summary(m3glm)$coef)$Std,2))[1:2],
                                rep("",9),
                                as.character(round(as.data.frame(summary(m3glm)$coef)$Std,2))[3:5],
                                rep("",13),
                                as.character(round(as.data.frame(summary(m3glm)$coef)$Std,2))[6:8],
                                rep("",4)),
                     PM3 = c(as.character(round(as.data.frame(summary(m3glm)$coef)$Pr,2))[1:2],
                                rep("",9),
                                as.character(round(as.data.frame(summary(m3glm)$coef)$Pr,2))[3:5],
                                rep("",13),
                                as.character(round(as.data.frame(summary(m3glm)$coef)$Pr,2))[6:8],
                                rep("",4)),
                     CM4 = c(as.character(round(exp(as.data.frame(summary(m4glm)$coef)$Estimate),2))[1:2],
                             rep("",12),
                             as.character(round(exp(as.data.frame(summary(m4glm)$coef)$Estimate),2))[3:6],
                             rep("",12),
                             as.character(round(exp(as.data.frame(summary(m4glm)$coef)$Estimate),2))[7:10]),
                     EEM4 = c(as.character(round(as.data.frame(summary(m4glm)$coef)$Std,2))[1:2],
                             rep("",12),
                             as.character(round(as.data.frame(summary(m4glm)$coef)$Std,2))[3:6],
                             rep("",12),
                             as.character(round(as.data.frame(summary(m4glm)$coef)$Std,2))[7:10]),
                     PM4 = c(as.character(round(as.data.frame(summary(m4glm)$coef)$Pr,2))[1:2],
                             rep("",12),
                             as.character(round(as.data.frame(summary(m4glm)$coef)$Pr,2))[3:6],
                             rep("",12),
                             as.character(round(as.data.frame(summary(m4glm)$coef)$Pr,2))[7:10]),
                     CM5 = as.character(round(exp(as.data.frame(summary(m5glm)$coef)$Estimate),2)),
                     EEM5 = as.character(round(as.data.frame(summary(m5glm)$coef)$Std,2)),
                     PM5 = as.character(round(as.data.frame(summary(m5glm)$coef)$Pr,2)))
#Libreria para crear una agradable tabla en Rmarkdown
library(knitr)
kable(tabla2)
Parametros CM1 EEM1 PM1 CM2 EEM2 PM2 CM3 EEM3 PM3 CM4 EEM4 PM4 CM5 EEM5 PM5
(Intercept) 1.04 0.12 0.74 2.12 0.12 0 0.69 0.06 0 0.78 0.08 0 1.1 0.16 0.55
genderMale 0.97 0 0 1 0.17 1 1.35 0.08 0 1.47 0.12 0 1.02 0.23 0.93
age 1.23 0.04 0 0.98 0 0 0.97 0 0
GEMEDUCNONE 0.97 0.07 0.66 0.83 0.08 0.03 0.93 0.1 0.43
GEMEDUCSOME SECONDARY 1.05 0.06 0.45 1.14 0.08 0.08 1.16 0.09 0.09
GEMEDUCPOST SECONDARY 0.88 0.05 0.01 0.99 0.06 0.85 0.94 0.07 0.33
GEMEDUCGRAD EXP 0.81 0.09 0.02 0.78 0.12 0.04 0.77 0.14 0.05
GEMWORK3Not working 1.31 0.09 0 1.18 0.1 0.1 1.08 0.11 0.5
GEMWORK3Work:F-T, P-T 1.54 0.08 0 1.9 0.1 0 1.41 0.11 0
GEMHHINCLowest 33%tile 0.83 0.06 0 0.86 0.07 0.03 0.86 0.08 0.05
GEMHHINCUpper 33%tile 0.99 0.04 0.82 0.96 0.05 0.45 0.94 0.06 0.27
opportYes 1.46 0.04 0 1.5 0.05 0 1.41 0.06 0
suskillYes 2.17 0.04 0 2.48 0.05 0 2.32 0.06 0
fearfailYes 0.86 0.04 0 0.76 0.05 0 0.79 0.06 0
nbgoodcYes 1.28 0.06 0 1.43 0.08 0 1.44 0.09 0
nbstatusYes 1.04 0.05 0.4 0.94 0.05 0.27 0.99 0.06 0.85
knowentYes 1.27 0.04 0 1.79 0.05 0 1.26 0.06 0
nbmediaYes 1.07 0.04 0.08 1.11 0.05 0.04 1.08 0.06 0.21
genderMale:age 1 0 0.8 1 0 0.73
genderMale:GEMEDUCNONE 1.19 0.13 0.18 1.15 0.14 0.32
genderMale:GEMEDUCSOME SECONDARY 0.84 0.11 0.12 0.81 0.13 0.09
genderMale:GEMEDUCPOST SECONDARY 0.88 0.09 0.13 0.87 0.09 0.13
genderMale:GEMEDUCGRAD EXP 1.04 0.16 0.8 1.09 0.18 0.64
genderMale:GEMWORK3Not working 2.09 0.16 0 1.88 0.18 0
genderMale:GEMWORK3Work:F-T, P-T 1.18 0.14 0.22 1.21 0.15 0.22
genderMale:GEMHHINCLowest 33%tile 0.94 0.11 0.58 0.88 0.13 0.32
genderMale:GEMHHINCUpper 33%tile 1.17 0.08 0.05 1.12 0.09 0.17
genderMale:opportYes 1.09 0.08 0.26 1.07 0.09 0.44
genderMale:suskillYes 0.79 0.07 0 0.86 0.08 0.06
genderMale:fearfailYes 1.19 0.07 0.02 1.21 0.08 0.02
genderMale:nbgoodcYes 0.88 0.11 0.22 0.8 0.12 0.08
genderMale:nbstatusYes 1.21 0.08 0.02 1.11 0.09 0.27
genderMale:knowentYes 0.91 0.07 0.22 1.02 0.09 0.81
genderMale:nbmediaYes 0.97 0.07 0.63 1 0.08 0.95