Según la imputación en tres pasos ver presentación imputación.ppt Este es el ejercicio basado en los datos ENIGH 2012.

Cargar los datos desde la pagina Web de INEGI

url.zip<-"https://www.inegi.org.mx/contenidos/programas/enigh/tradicional/2012/microdatos/Tra_Concentrado_2012_concil_2010_csv.zip"
## para el caso de archivos más recientes por ejemplo, 2012 usar la siguiente ruta ## url.zip<-"https://www.inegi.org.mx/contenidos/programas/enigh/nc/2022/microdatos/enigh2022_ns_concentradohogar_csv.zip"

nombre_zip<-"Tra_Concentrado_2012_concil_2010_csv.zip" 

# para el caso 2022 el nombre del archivo es concentradohogar.csv

# crea un directorio "enigh_2012_datos" en la ruta actual de trabajo para que se #pueda guardar los datos. 
dir_unzip <- "enigh_2012_datos"
if (!dir.exists(dir_unzip)) {
  dir.create(dir_unzip)
}
 #descarga y descomprime  el archivo zip 
download.file(url.zip, destfile = nombre_zip, mode = "wb")
unzip(nombre_zip, exdir = dir_unzip)
#guarda la ruta donde se encuentra el archivo para despues leerlo
ruta_csv <- file.path(dir_unzip, "tra_concentrado_2012_concil_2010.csv") 
# caso 2022 concentradohogar.csv


#los datos con los que se trabajaran
data12<- read.csv(ruta_csv, encoding = "Latin-1", na.strings = c("", " "))
names(data12) # todas las variables que contiene el archivo 
file.remove(nombre_zip)
#los datos con los que se trabajaran
dir_unzip <- "enigh_2012_datos"
ruta_csv <- file.path(dir_unzip, "tra_concentrado_2012_concil_2010.csv")
data12<- read.csv(ruta_csv, encoding = "Latin-1", na.strings = c("", " "))
names(data12) # todas las variables que contiene el archivo 
##   [1] "folioviv"   "foliohog"   "ubica_geo"  "ageb"       "tam_loc"   
##   [6] "est_socio"  "est_dis"    "upm"        "factor_hog" "clase_hog" 
##  [11] "sexo_jefe"  "edad_jefe"  "educa_jefe" "tot_integ"  "hombres"   
##  [16] "mujeres"    "mayores"    "menores"    "p12_64"     "p65mas"    
##  [21] "ocupados"   "percep_ing" "perc_ocupa" "ing_total"  "ing_cor"   
##  [26] "ing_mon"    "trabajo"    "sueldos"    "horas_extr" "comisiones"
##  [31] "otra_rem"   "negocio"    "noagrop"    "industria"  "comercio"  
##  [36] "servicios"  "agrope"     "agricolas"  "pecuarios"  "reproducc" 
##  [41] "pesca"      "otros_trab" "rentas"     "utilidad"   "arrenda"   
##  [46] "transfer"   "jubilacion" "becas"      "donativos"  "remesas"   
##  [51] "bene_gob"   "otros_ing"  "gasto_nom"  "autoconsum" "remu_espec"
##  [56] "transf_esp" "transf_hog" "trans_inst" "estim_alqu" "percep_tot"
##  [61] "percep_mon" "retiro_inv" "prestamos"  "otras_perc" "erogac_nom"
##  [66] "gasto_tot"  "gasto_cor"  "gasto_mon"  "alimentos"  "ali_dentro"
##  [71] "cereales"   "carnes"     "pescado"    "leche"      "huevo"     
##  [76] "aceites"    "tuberculo"  "verduras"   "frutas"     "azucar"    
##  [81] "cafe"       "especias"   "otros_alim" "bebidas"    "ali_fuera" 
##  [86] "tabaco"     "vesti_calz" "vestido"    "calzado"    "vivienda"  
##  [91] "alquiler"   "pred_cons"  "agua"       "energia"    "limpieza"  
##  [96] "cuidados"   "utensilios" "enseres"    "salud"      "atenc_ambu"
## [101] "hospital"   "medicinas"  "transporte" "publico"    "foraneo"   
## [106] "adqui_vehi" "mantenim"   "refaccion"  "combus"     "comunica"  
## [111] "educa_espa" "educacion"  "esparci"    "paq_turist" "personales"
## [116] "cuida_pers" "acces_pers" "otros_gas"  "transf_gas" "erogac_tot"
## [121] "erogac_mon" "cuota_viv"  "mater_serv" "material"   "servicio"  
## [126] "deposito"   "prest_terc" "pago_tarje" "deudas"     "balance"   
## [131] "otras_erog" "smg"
#file.remove(nombre_zip)

El siguiente código es para obtener el vector de valores de ingresos y factores de expansión

 muestra<-data12$ing_cor
 fac<-data12$factor # aveces el factor de expansión tiene el nombre "factor_hog"
 total_ingreso <-sum(muestra*fac) # 
 tot_hog<-sum(fac) 
 print(paste("total del ingreso de la muestra: ",total_ingreso,sep=""))
## [1] "total del ingreso de la muestra: 1203202597623.71"
 print(paste("total de hogares en la población: ",tot_hog,sep=""))
## [1] "total de hogares en la población: 31559379"

Se quitan los valores menores a 2000 y se redistribuye la población

w<-c()
w<-which(muestra<2000)
if(length(w)==0)
{muestra<-muestra} else 
{muestra<-muestra[-w]
 fac<-fac[-w]
}
fquitados<-tot_hog-sum(fac)  ## re-austar los valores de expansión 
coci<-fquitados/length(fac)
nfac<-(fac+coci)
fac<-nfac  ## nuevos factores ajustados 
w<-order(muestra)
muestra<-muestra[w]
fac<-fac[w]
head(fac) # los nuevos factores de expansión 
## [1] 1967.884 6202.884 2484.884 2854.884 1730.884 3189.884

Algunos datos obtenidos del ingreso del año 2012

El valor estimado del vector de parámetros de la función GG sin restricciones ( obtenido antes)

library(alabama)
## Cargando paquete requerido: numDeriv
library(gamlss)
## Warning: package 'gamlss' was built under R version 4.4.3
## Cargando paquete requerido: splines
## Cargando paquete requerido: gamlss.data
## 
## Adjuntando el paquete: 'gamlss.data'
## The following object is masked from 'package:datasets':
## 
##     sleep
## Cargando paquete requerido: gamlss.dist
## Warning: package 'gamlss.dist' was built under R version 4.4.3
## Cargando paquete requerido: nlme
## Cargando paquete requerido: parallel
##  **********   GAMLSS Version 5.4-22  **********
## For more on GAMLSS look at https://www.gamlss.com/
## Type gamlssNews() to see new features/changes/bug fixes.
xGGsin<-c(25084.35679,0.805540247,-0.199996903)
xGGsin
## [1] 25084.3567900     0.8055402    -0.1999969

El valor del vector estimado del parámetro de la función GG con restricciones ( obtenido antes)

xGGcon<-c(29580.06446, 1.068264447, -0.47753398)
xGGcon
## [1] 29580.064460     1.068264    -0.477534

Algunos datos importantes del 2012

a=min(muestra)
b<-max(muestra)
tot_hog<-sum(fac) # total de hogares 
p=0.999999 #Para el caso del ajuste a nivel nacional para algún año de interés nos interesa: el promedio de ingresos declarado al SAT por el millonesimo percentil(.999999) que corresponde los 32 más ricos, y el ingreso del treintaidosavo más rico.
mean_Sat_anual<- 1624174001.00 # promedio del ingreso de los 32 más ricos anual                   
mean_sat<-mean_Sat_anual/4 # trimestralizado 2012
qi<-177965502 # ingreso del 32 del top-32 más ricos ya trimestralizado
prom<- mean_sat # promedio del ingreeso de los 32 más ricos según SAT 2012 trimestralizado
prom<-prom*0.000001
idan<-  11635413   # valor de IDAN del 2012 
tot_cn<-idan *1000000 # se multiplica por 1 millón  
ci<-c(tot_cn/4/tot_hog)  # promedio de ingreso por hogar según CN

funciones truncadas

GGtrunc_max<-function(x, m=muestra,w=fac,a=min(muestra),b=max(muestra))
{
  fi <- c()
  mu<-x[1]
  sigma<-x[2]
  nu<-x[3]
  Fa<-pGG(a, mu, sigma, nu) ## devuelve probabilidad F(x)
  Fb<-pGG(b, mu, sigma, nu)
  fi <- (w*(dGG(m, mu, sigma, nu,log=TRUE)-log(Fb-Fa)))
 sumaf <- -1*sum( fi )
 #sumaf <- sum( fi )
  return( sumaf )
}

hin<-function(x)
{
  h <- rep(NA, 2)
  h[1]<-x[1]
  h[2]<-x[2]
  h
}

valor inicial para obtener

theta<-c(25084.35679,0.805540247,-0.199996903) # valor inicial para empezar la optimizacion 2012
ansGGsin <- constrOptim.nl(par=theta, fn=GGtrunc_max,hin=hin) 
## Min(hin):  0.8055402 
## par:  25084.36 0.8055402 -0.1999969 
## fval:  359727156 
## Min(hin):  0.8007333 
## par:  24802 0.8007333 -0.2434864 
## fval:  359723467 
## Min(hin):  0.8007593 
## par:  24802 0.8007593 -0.2434856 
## fval:  359723467 
## Min(hin):  0.8007593 
## par:  24802 0.8007593 -0.2434856 
## fval:  359723467
parsin<-ansGGsin$par  # parámetro sin restricciones para función truncada 

Las probabilidades truncadas de la muestra

parsin # parámetro de la vesión truncada
## [1] 24802.0001781     0.8007593    -0.2434856
# las probabilidades de la muestra
pp<-pGG(muestra, mu=parsin[1],sigma=parsin[2], nu=parsin[3],lower.tail = TRUE, log.p = FALSE)
head(pp)
## [1] 0.0001848681 0.0002047245 0.0002221342 0.0002316695 0.0006235241
## [6] 0.0006291202

ingreso imputado

xGGcon<-c(29580.06446, 1.068264447, -0.47753398)  # con restricciones 2012
# anteriormente para el 2012
qq<-qGG(pp, mu=xGGcon[1],sigma=xGGcon[2], nu=xGGcon[3],lower.tail = TRUE, log.p = FALSE)
head(qq) #" valores imputados"
## [1] 1740.019 1770.855 1796.147 1809.395 2172.274 2176.060

Obtención de algunos valores importantes del truncamiento

#limites
par<-xGGcon
aprima<-min(qq) # valor mínimo ingreso  de la función sin restricciones truncada 
bprima<-max(qq) # valor max de ingreso  de la función sin restricciones truncada 
fa<-min(pp)   # probabilidad función sin restricciones truncada para aprima
fb<-max(pp)   # probabilidad función sin restricciones truncada para bprima
# integral x*f(x)
n<-length(qq)

promedio_ingreso_aprima<-integrate(function(x) x*dGG(x=x, mu=par[1], sigma=par[2],nu=par[3]), 
          lower=0, upper=aprima)$v  # note los limites 

promedio_ingreso_aprima_bprima<-integrate(function(x) x*dGG(x=x, mu=par[1], sigma=par[2],nu=par[3]), 
          lower=aprima, upper= bprima)$v  # note los limites

promedio_ingreso_bprima<-integrate(function(x) x*dGG(x=x, mu=par[1], sigma=par[2],nu=par[3]), 
          lower=bprima, upper= 1000000000000)$v   # note los limites
ingreso_muestra<-sum(muestra*fac)
ingreso_muestra
## [1] 1.204045e+12
hogares_0_aprima<-fa*tot_hog
hogares_0_aprima
## [1] 5834.323
hogares_aprima_bprima<-(fb-fa)*tot_hog
hogares_aprima_bprima
## [1] 31550479
hogares_bprima_<-(1-fb)*tot_hog
hogares_bprima_
## [1] 3065.88
total_ingreso_aprima<-(promedio_ingreso_aprima/fa)*hogares_0_aprima
total_ingreso_aprima_bprima<-(promedio_ingreso_aprima_bprima/(fb-fa))*hogares_aprima_bprima
total_ingreso_bprima<-(promedio_ingreso_bprima/(1-fb))*hogares_bprima_