Cómo analizar la ENVIPE en Stata

De acuerdo con el INEGI, a nivel nacional 73% percibe a su estado como “inseguro”, pero si uno analiza la base de datos, la cifra es 68%.¿Por qué existen esas diferencias?

[También revisa Cómo analizar la ENVIPE en R]
La Encuesta Nacional de Victimización y Percepción sobre Seguridad Pública (ENVIPE) del INEGI es una fuente de datos muy valiosa para los expertos en seguridad pública. Sin embargo, es común que al analizar la base de datos de la encuesta, algunos no puedan replicar los resultados que proporciona el INEGI. Por poner un ejemplo, de acuerdo a los tabulados del INEGI, a nivel nacional 24.5% de los individuos percibe a su estado como “seguro” y 73.2% como “inseguro”; pero si uno realiza un tabulado directamente de la base de datos, los porcentajes son 29.3% y 68%, respectivamente.¿Por qué existe esa discrepancia?

La razón es que la ENVIPE es una encuesta recolectada a través de un diseño muestral complejo. A diferencia de lo que asumen las herramientas estadísticas más comunes, las observaciones de la encuesta no tienen la misma probabilidad de selección ni son independientes. Omitir el diseño de la muestra puede arrojar estimaciones sesgadas y subestimar la varianza de los estimadores de interés.

El INEGI advierte que el análisis de la ENVIPE “es responsabilidad exclusiva del usuario”, pero la gran mayoría de las personas con sólidas habilidades para análisis de datos no están necesariamente familiarizados con estimaciones para muestras complejas.

Mi propósito en este post es presentar algunos fragmentos de código en Stata para replicar dos tablas de los Tabulados Básicos del INEGI. El código puede servir de referencia para otros análisis. El post presenta tres ejemplos: uno sobre percepción de seguridad, otro sobre incidencia, prevalencia y tazas del delito de secuestro, y el último sobre estimación de homicidios. El primer ejemplo hace estimaciones de proporciones a nivel individual para subpoblaciones (entidades federativas). Los otros dos tratan sobre estimaciones a nivel del hogar para totales, y razones. En mi opinión, estos ejemplos cubren los aspectos más generales para poder analizar prácticamente cualquier pregunta de la encuesta.

Como en cualquier análisis, es conveniente que el lector tenga nociones sobre el análisis de muestras complejas. Algunos textos introductorios son:

Ejemplo 1: Percepción de inseguridad en los estados

La tabla de abajo muestra las estimaciones a nivel estatal del número (“absolutos”) y porcentaje (“relativos”) de individuos que perciben a su estado como seguro o inseguro. Como se observa en la primera fila de la tabla, a nivel nacional 24.5% percibe a su estado como seguro y 73.2% como inseguro.

V_percepcion_seguridad_2015 5.10

Tabla 1. Percepción de inseguridad por entidad federativa

Ahora analicemos la base de datos disponible en este link. Primero carguemos los datos en Stata :

import delimited using "TPer_Vic2.txt", delimit(",") case(preserve) clear

Ahora tabulemos las respuestas de la pregunta sobre percepción de seguridad (AP4_3_3; véase el documento sobre la estructura de la base de datos). Como se observa, los porcentajes son distintos a los de la Tabla 1: 29.3% se siente seguro y 68% inseguro.

. proportion AP4_3_3

Proportion estimation               Number of obs    =   84507

--------------------------------------------------------------
             | Proportion   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
AP4_3_3      |
           1 |   .2926148   .0015651      .2895568    .2956917
           2 |    .679991   .0016047      .6768377     .683128
           9 |   .0273942   .0005615      .0263149    .0285165
-------------------------------------------------------------- 

La diferencia radica en que los tabulados del INEGI incorporan las características del diseño muestral de la encuesta. Para fines de estimación, las más importantes son:

  • Conglomerado: La variable UPM_DIS identifica el conglomerado o unidad primaria de muestreo.
  • Estrato: La variable EST_DIS identifica el estrato al que pertenece la unidad primaria de muestreo.
  • Ponderador a nivel individual: La variable FAC_ELE contiene el factor de expansión (ponderador) que incorpora la probabilidad de selección del individuo y ajuste por no-respuesta, omisión de delitos y proyección de la población. De acuerdo con la metodología de la encuesta, este ponderador es “requerido para estimar resultados de las preguntas de percepción de la seguridad pública y la victimización de la población de 18 años y más.”

Estas variables son incorporadas al análisis con el comando svyset:

. svyset UPM_DIS [pw=FAC_ELE], strata(EST_DIS)

      pweight: FAC_ELE
          VCE: linearized
  Single unit: missing
     Strata 1: EST_DIS
         SU 1: UPM_DIS
        FPC 1: 

Luego, se pueden obtener los estimadores con el comando svy: proportion. Como se observa abajo, los porcentajes son iguales a los de la Tabla 1.

. svy: proportion AP4_3_3
(running proportion on estimation sample)

Survey: Proportion estimation

Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  80913163
                                  Design df        =     11488

--------------------------------------------------------------
             |             Linearized
             | Proportion   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
AP4_3_3      |
           1 |   .2445935   .0022365      .2402362     .249004
           2 |   .7320874    .002322      .7275114    .7366143
           9 |   .0233191   .0007557      .0218829    .0248472
--------------------------------------------------------------

También podemos obtener el número “absoluto” de individuos que consideran seguro o inseguro a su estado con el comando svy: total. De nuevo, como se observa en la tabla de abajo, las cifras coinciden con las de la Tabla 1:

. tab AP4_3_3, gen(seguro)

. svy: total seguro1 seguro2
(running total on estimation sample)

Survey: Total estimation

Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  80913163
                                  Design df        =     11488

--------------------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
     seguro1 |   1.98e+07   190069.3      1.94e+07    2.02e+07
     seguro2 |   5.92e+07     322330      5.86e+07    5.99e+07
--------------------------------------------------------------

. matlist r(table), format(%12.0g)

             |      seguro1       seguro2 
-------------+----------------------------
           b |     19790834      59235506 
          se |  190069.3452   322330.0285 
           t |  104.1242815   183.7728439 
      pvalue |            0             0 
          ll |  19418265.68   58603684.18 
          ul |  20163402.32   59867327.82 
          df |        11488         11488 
        crit |  1.960170506   1.960170506 
       eform |            0             0 

Para obtener el porcentaje y número absoluto de individuos por estado, es necesario hacer inferencias para subpoblaciones con la opción over:

gen EDO = substr(ID_PER,1,2)
destring EDO, replace
svy: proportion AP4_3_3, over(EDO) noheader
svy: total seguro1 seguro2, over(EDO) noheader

Así, por ejemplo, el output de abajo muestra –por estado– la proporción de individuos que se sienten seguros, inseguros, o rechazaron contestar la pregunta. Como se observa abajo, los porcentajes coinciden con los de la Tabla 1:

. svy: proportion AP4_3_3, over(EDO) noheader
(running proportion on estimation sample)
--------------------------------------------------------------
             |             Linearized
        Over | Proportion   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
_prop_1      |
           1 |   .5464177   .0133832      .5200795    .5724985
           2 |   .4314004   .0124181      .4072431    .4558886
           3 |    .367508    .010744      .3467118    .3888092
           4 |   .4223809   .0134805      .3962025    .4490028
           5 |   .2182016    .011454      .1965828    .2414834
...
          28 |   .1100333   .0062888      .0982977    .1229789
          29 |   .3961376    .014045      .3689618    .4239702
          30 |    .176024   .0083221      .1603007    .1929351
          31 |   .6514118   .0114016      .6287433    .6734152
          32 |   .1547415   .0082993      .1391625    .1717166
-------------+------------------------------------------------
_prop_2      |
           1 |   .4317832   .0134627      .4056113    .4583417
           2 |   .5324062   .0122022      .5084317     .556232
           3 |   .6182497    .011814      .5948394    .6411233
           4 |   .5367231   .0130754      .5110186    .5622339
           5 |   .7492093   .0121426      .7246657    .7722526
...
          28 |   .8690114   .0068209      .8550523     .881812
          29 |    .591885   .0139531      .5642768    .6189253
          30 |   .8054067   .0089782      .7872027    .8224047
          31 |   .3381246    .011265      .3164077    .3605459
          32 |   .8088744   .0095183      .7895189    .8268405
-------------+------------------------------------------------
_prop_3      |
           1 |   .0217991   .0041863      .0149399    .0317062
           2 |   .0361934   .0039541      .0291928    .0447952
           3 |   .0142423   .0030787      .0093125    .0217246
           4 |    .040896   .0050514      .0320648    .0520287
           5 |   .0325891   .0043583      .0250474    .0423029
...
          28 |   .0209553   .0026407       .016359    .0268079
          29 |   .0119774   .0023923      .0080905    .0176983
          30 |   .0185694   .0026109      .0140869    .0244428
          31 |   .0104636   .0020174      .0071657     .015256
          32 |    .036384   .0050467       .027687     .047679
--------------------------------------------------------------

Ahora repliquemos la Tabla 1. Los únicos datos que nos faltan incluir es el total de la población mayor de 18 años por estado. Para hacerlo, podemos sumar el ponderador individual por estado creando una variable que toma el valor 1 para todas las observaciones. Luego, podemos elaborar una tabla que es idéntica a la del INEGI con el comando tabstat:

. gen uno = 1
. tabstat uno seguro1 seguro2 [aw=FAC_ELE], stats(mean sum) by(EDO)

Summary statistics: mean, sum
  by categories of: EDO 

     EDO |       uno   seguro1   seguro2
---------+------------------------------
       1 |         1  .5464177  .4317832
         |    826776    451765    356988
---------+------------------------------
       2 |         1  .4314004  .5324062
         |   2324817   1002927   1237747
---------+------------------------------
       3 |         1   .367508  .6182497
         |    513401    188679    317410
---------+------------------------------
       4 |         1  .4223809  .5367231
         |    609644    257502    327210
---------+------------------------------
       5 |         1  .2182016  .7492093
         |   1931814    421525   1447333
---------+------------------------------
...
---------+------------------------------
      28 |         1  .1100333  .8690114
         |   2405118    264643   2090075
---------+------------------------------
      29 |         1  .3961376   .591885
         |    834657    330639    494021
---------+------------------------------
      30 |         1   .176024  .8054067
         |   5472670    963321   4407725
---------+------------------------------
      31 |         1  .6514118  .3381246
         |   1424466    927914    481647
---------+------------------------------
      32 |         1  .1547415  .8088744
         |    992468    153576    802782
---------+------------------------------
   Total |         1  .2445935  .7320874
         |  8.09e+07  1.98e+07  5.92e+07
----------------------------------------

Ejemplo 2: Estimación de secuestro

El segundo ejemplo trata sobre la estimación de la incidencia y prevalencia del delito de secuestro. La Tabla de abajo muestra los resultados del INEGI:

secuestro_2015

Tabla 2. Hogares, victimas y número de secuestros (ENVIPE, 2015)

Comencemos por cargar la base de datos en Stata:

import delimited using "TPer_Vic2.txt", delimit(",") case(preserve) clear

La estimación del delito de secuestro es un poco compleja. Primero, el encuestador pregunta al individuo seleccionado si algún miembro del hogar fue secuestrado antes de 2014.  Luego le pregunta si un miembro del hogar fue secuestrado durante 2014. Naturalmente, esta última pregunta es la de interés; el propósito de la pregunta previa es reducir la tendencia del informante a reportar delitos que ocurrieron antes del periodo de referencia (telescopeo). Luego, el encuestador verifica con una serie de preguntas si las víctimas de secuestro efectivamente vivían y compartían los alimentos en el hogar donde se realizó la entrevista. Podemos usar esta serie de preguntas para construir nuestra medición validada del número de delitos de secuestro, el número de víctimas de secuestro, y el número de hogares donde hubo al menos una víctima de secuestro:

*6.12 ¿Cuántas veces sufrió el secuestro la (NÚMERO ORDINAL) víctima del hogar?
local varlist AP6_12_1 AP6_12_2 AP6_12_3 AP6_12_4 AP6_12_5 AP6_12_6 AP6_12_7
egen secuestros = rowtotal(`varlist')
gen hogares = 0
replace hogares = 1 if secuestros > 0
generate victimas = 0
foreach var of varlist `varlist' {
	replace victimas = victimas + 1 if !mi(`var')
}

Luego, declaramos el diseño muestral con la función svydesign como en la sección anterior. Sin embargo, utilizaremos un ponderador distinto: FAC_HOG. De acuerdo con el documento metodológico de la encuesta, éste es el “ponderador que se utiliza para estimar resultados de las preguntas que se refieren a los hogares y la población en general“.

*Ponderador y diseno
svyset UPM_DIS [pw=FAC_HOG], strata(EST_DIS)

Luego, obtenemos nuestros estimadores de interés. Nótese que son idénticos a las cifras de la Tabla 2 (en amarillo):

. svy: total secuestros, level(90)
Survey: Total estimation
Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  32505399
                                  Design df        =     11488
--------------------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     [90% Conf. Interval]
-------------+------------------------------------------------
  secuestros |     102883      10199      86105.78    119660.2
--------------------------------------------------------------

. estat cv
------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     CV (%)
-------------+----------------------------------
  secuestros |     102883      10199     9.91321
------------------------------------------------

. svy: total hogares, level(90)
Survey: Total estimation
Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  32505399
                                  Design df        =     11488
--------------------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     [90% Conf. Interval]
-------------+------------------------------------------------
     hogares |      88523   8740.971      74144.22    102901.8
--------------------------------------------------------------

. estat cv
------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     CV (%)
-------------+----------------------------------
     hogares |      88523   8740.971     9.87424
------------------------------------------------

. svy: total victimas, level(90)
Survey: Total estimation
Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  32505399
                                  Design df        =     11488
--------------------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     [90% Conf. Interval]
-------------+------------------------------------------------
    victimas |      99747   10070.48      83181.19    116312.8
--------------------------------------------------------------

. estat cv
------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     CV (%)
-------------+----------------------------------
    victimas |      99747   10070.48      10.096
------------------------------------------------

Podemos hacer un ejercicio similar para estimar la tasa de hogares víctimas de secuestro (columna azul en la Tabla 2):

. gen uno = 1/100000

. svy: ratio hogares uno, level(90)
(running ratio on estimation sample)

Survey: Ratio estimation

Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  32505399
                                  Design df        =     11488

     _ratio_1: hogares/uno

--------------------------------------------------------------
             |             Linearized
             |      Ratio   Std. Err.     [90% Conf. Interval]
-------------+------------------------------------------------
    _ratio_1 |   272.3332    26.8885       228.102    316.5644
--------------------------------------------------------------

. estat cv
     _ratio_1: hogares/uno

------------------------------------------------
             |             Linearized
             |      Ratio   Std. Err.     CV (%)
-------------+----------------------------------
    _ratio_1 |   272.3332    26.8885     9.87338
------------------------------------------------    

Ejemplo 3: Estimación de Homicidios

En 2013 el INEGI reportó la estimación del número de homicidios a partir de los datos de la ENVIPE, pero ha dejado de hacerlo para la ENVIPE 2014 y 2015. Sin embargo, podemos hacerlo de manera similar a la estimación de secuestro con las siguientes líneas de código:

*Leer datos
import delimited using "TPer_Vic2.txt", delimit(",") case(preserve) clear

*Calcular número de homicidios y hogares victima
local varlist AP6_21_1 AP6_21_2 AP6_21_3 AP6_21_4 AP6_21_5 AP6_21_6 AP6_21_7
recode `varlist' (1=1) (else=0)
egen homicidios = rowtotal(`varlist')
gen hogares = 0
replace hogares = 1 if homicidios > 0

*Disenio muestral
svyset UPM_DIS [pw=FAC_HOG], strata(EST_DIS)

*Estimacion
svy: total homicidios, level(95)
svy: total hogares, level(95)

Como se observa, el número estimado de homicidios es 24,917 su intervalo de confianza (95%) es 14,475-35,359. La estimación del número de hogares con al menos una víctima de homicidio es 22,824 (14,567-31,080).

. svy: total homicidios, level(95)

Survey: Total estimation
Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  32505399
                                  Design df        =     11488
--------------------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
  homicidios |      24917   5326.913      14475.34    35358.66
--------------------------------------------------------------

. svy: total hogares, level(95)

Survey: Total estimation
Number of strata =     238        Number of obs    =     84507
Number of PSUs   =   11726        Population size  =  32505399
                                  Design df        =     11488
--------------------------------------------------------------
             |             Linearized
             |      Total   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
     hogares |      22824   4212.182       14567.4     31080.6
--------------------------------------------------------------

One thought on “Cómo analizar la ENVIPE en Stata

  1. Pingback: Cómo analizar la ENVIPE en R | Políticamente Correcto

Leave a Reply