Muestras complejas con R

Una aproximación metodológica al uso de datos de encuestas en hogares / A Methodological Approach to Household-Surveys Data Usage

Julio César Martínez Sánchez

En esta sección se presenta el código en R para generar los cuadros del artículo: Una aproximación metodológica al uso de datos de encuestas en hogares .

1. Consideraciones iniciales

Para poder hacer las gráficas correspondientes se requieren los siguientes paquetes: data.table,foreign, questionr, survey, base.

Así, el primer paso es cargar las librerías que se van a utilizar

          library(data.table)
          library(foreign)
          library(questionr)
          library(survey)
          library(base)

Ahora se debe de cargar la base sdemt116.dbf, la cual está disponible en INEGI. Sin embargo, con el siguiente código se puede automatizar este proceso de tal manera que se puede descargar, descomprimir y cargar la base sdemt116.dbf a partir de un archivo temporal:

temporal <- tempfile()
download.file("http://www.beta.inegi.org.mx/contenidos/proyectos/enchogares/regulares/enoe/microdatos/enoe_15ymas/2016/2016trim1_dbf.zip",temporal)
files = unzip(temporal, list=TRUE)$Name
unzip(temporal, files=files[grepl("dbf",files)])
SDEMT116 <- data.frame(read.dbf("sdemt116.dbf"))

Antes de iniciar con el análisis conviene adecuar el formato de las variables que se van a utilizar. Para tener una mejor referencia las características de cada variable, se recomienda consultar la descripción de archivos, disponible en: FD_ENOE.

          v1 <- c("SEX","NIV_INS", "E_CON", "POS_OCU")
          for (n in 1:dim(as.array(v1))) {
            SDEMT116[,v1[n]] <-as.factor(SDEMT116[,v1[n]])
          }          

          v2 <- c("HRSOCUP","EDA", "R_DEF", "C_RES")
          for (n2 in 1:dim(as.array(v2))) {
            SDEMT116[,v2[n2]] <-as.numeric(as.character(SDEMT116[,v2[n2]]))
          }  

Se selecciona la población de referencia que es: población ocupada mayor de 15 años con entrevista completa y condición de residencia válida.

    SDEMT116$filtro<- 0
    SDEMT116$filtro[SDEMT116$CLASE2 == 1 & SDEMT116$EDA>=15 & SDEMT116$EDA<=98 & SDEMT116$R_DEF==0 & (SDEMT116$C_RES==1 | SDEMT116$C_RES==3)] <- 1
    SDEMT116$filtro <-as.numeric(SDEMT116$filtro)
    SD<-SDEMT116[which(SDEMT116$filtro==1),]

2. Simulaciones

Para mostrar el efecto del esquema de muestreo se suponen 4 escenarios:

  • Muestreo Aleatorio Simple
  • Muestreo por conglomerados
  • Muestreo Estratificado
  • Muestreo Estratificado y por Conglomerados

Las simulaciones se guardarán provisionalmente en dos listas: ST y Boot. Sin embargo, al final se crea una más denominada Simulacion, la cual tendrá los resultados de ambas simulaciones.

        ST = list()
        Boot = list()
        Simulacion=list()

2.1 Series de Taylor

          for (i in 1:4){
            options(survey.lonely.psu="adjust")
            if(i==1){ds<-svydesign(id=~1,weight=~1,data=SD)}
            if(i==2){ds<-svydesign(id=~UPM,weight=~FAC,data=SD)}
            if(i==3){ds<-svydesign(id=~1, strata=~EST_D, weight=~FAC, data=SD, nest=TRUE)}
            if(i==4){ds<-svydesign(id=~UPM, strata=~EST_D, weight=~FAC, data=SD, nest=TRUE)}
            svy<-round(svymean(~HRSOCUP, ds, deff=TRUE),2)
            cv<-round(data.frame(cv(svy)*100),digits=2)
            ST[[i]] <- data.frame(svy,cv) 
          }
          R1 = do.call(rbind, ST)
          colnames(R1)[4] <- "CV"
          row.names(R1)<-c("MAS","Conglomerados","Estratificado","Est/Cong")
          Simulacion$Taylor<-R1

2.2 Bootstrap

          for (j in 1:4){
            if(j==1){boot<-svydesign(id=~1,weight=~1, data=SD, nest=TRUE)}
            if(j==2){boot<-svydesign(id=~UPM,weight=~FAC, data=SD, nest=TRUE)}
            if(j==3){boot<-svydesign(id=~1,strata=~EST_D,weight=~FAC, data=SD, nest=TRUE)}
            if(j==4){boot<-svydesign(id=~UPM,strata=~EST_D,weight=~FAC, data=SD, nest=TRUE)}
            boot_design<-as.svrepdesign (boot,type="bootstrap",replicates=100)
            svy<-round(svymean(~HRSOCUP, boot_design, deff=TRUE),2)
            cv<-round(data.frame(cv(svy)*100),digits=2)
            dat<-data.frame(svy,cv)
            Boot[[j]] <- dat
          }
          R2 = do.call(rbind, Boot)
          colnames(R2)[4] <- "CV"
          row.names(R2)<-c("MAS","Conglomerados","Estratificado","Est/Cong")
          Simulacion$Bootstrap<-R2

Debido a la naturaleza del Boostrap, se requiere una gran cantidad de memoria RAM por lo que la simulación puede tardar.

2.3 Tabulado

          SD2<-SD[which(SD$SEX == 2),]
          tb<-svydesign(id=~UPM, strata=~EST_D, weight=~FAC, data=SD2, nest=TRUE)
          options(survey.lonely.psu="adjust")
          svy<-round(svytotal(~factor(CS_P13_1), tb, deff=TRUE), digits = 2)
          cv<-round(data.frame(cv(svy)*100),digits=2)
          R3<-data.frame(svy,cv);colnames(R3)[4] <- "CV"
          Simulacion$Tabulado<-R3 

2.4 Resultados

Finalmente, el resultado del cálculo de la media vía series de Taylor y Boostrap, así como el tabulado se pueden visualizar de manera general

  Simulacion

O bien, por separado

Simulacion$Taylor
Simulacion$Bootstrap
Simulacion$Tabulado

3. Modelos de regresión lineal

3.1 Series de Taylor

                ds_enoe<-svydesign(id=~UPM, strata=~EST_D, weight=~FAC, data=SD, nest=TRUE)
                options(survey.lonely.psu="adjust")
                glmsvy1 <- svyglm(HRSOCUP~SEX+NIV_INS+E_CON+POS_OCU+EDA, design=ds_enoe)
                summary(glmsvy1, df.resid = degf(ds_enoe))
                glmsvy2 <- glm(HRSOCUP~SEX+NIV_INS+E_CON+POS_OCU+EDA, data=SD)
                summary(glmsvy2)

3.2 Bootstrap

                boot_design<-as.svrepdesign (ds_enoe, type="bootstrap",replicates=100)
                options(survey.lonely.psu="adjust")
                glmsvy3 <- svyglm(HRSOCUP~SEX+NIV_INS+E_CON+POS_OCU+EDA, design=boot_design)
                summary(glmsvy3, df.resid = degf(boot_design))
                confint(glmsvy3, level = 0.95, method = c("Wald"))

4. Simulación de réplicas para el método Boostrap

Para generar la gráfica 2 se generó el siguiente código:

i=100
m1<-sample(S$HRSOCUP,size=length(S$HRSOCUP)*i,replace=TRUE)
m2 <- apply(matrix(m1,i,length(S$HRSOCUP)),1,mean)
g2 = ggplot( data.frame(m2),aes(m2) ) +
  geom_histogram(aes(y=..density..),binwidth=(diff(range(m2))/30)) +
  geom_density(color="red")+xlab("Promedio")+ylab("Frecuencia")
plot(g2)
Para mayor referencia, se recomienda consultar el documento de Bret Larget