5.3 Tablas cruzadas.

Una tabla de contingencia o tablas cruzadas es una herramienta muy utilizada en el análisis de encuestas de hogares puesto que, está conformada por al menos dos filas y dos columnas y representa información de variables categóricos en términos de conteos de frecuencia. Estas tablas tienen el objetivo de representar de manera resumida, la relación entre diferentes variables categóricas.

una tabla de contingencia se asume como un arreglo bidimensional de \(r=1,\ldots,R\) filas y \(c=1,\ldots,C\) columnas. Cabe resaltar que, Las tablas cruzadas o de contingencia no se limitan a dos dimensiones, también se pueden incluir una tercera variable o más, es decir, \(l=1,\ldots,L\) subtablas basadas en las categorías de una tercera variable.

Para efectos de ilustración y facilitación de los ejemplos y conceptos teóricos, en esta sección de trabajarán, en su mayoría con tablas \(2\times2\). Gráficamente, estas tablas se construyen con frecuencias no estimadas como se muestra a continuación:

Variable 2 Variable 1 Marginal fila
0 1
0 \(n_{00}\) \(n_{01}\) \(n_{0+}\)
1 \(n_{10}\) \(n_{11}\) \(n_{1+}\)
Marginal columna \(n_{+0}\) \(n_{+1}\) \(n_{++}\)

A continuación, se muestra la tabla de doble entrada con las frecuencias estimadas o ponderadas:

Variable 2 Variable 1 Marginal fila
0 1
0 \(\hat{N}_{00}\) \(\hat{N}_{01}\) \(\hat{N}_{0+}\)
1 \(n_{10}\) \(n_{11}\) \(n_{1+}\)
Marginal columna \(n_{+0}\) \(n_{+1}\) \(n_{++}\)

donde, por ejemplo, la frecuencia ponderada o estimada en la celda (0, 1) está dada por \(\hat{N}_{01}={ \sum_{h=1}^{H}\sum_{\alpha=1}^{\alpha_{h}}\sum_{i\in\left(0,1\right)}^{n_{h\alpha}}}\omega_{h\alpha i}\). Las proporciones estimadas a partir de estas frecuencias muestrales ponderadas, se obtienen de la siguiente manera \(p_{rc}=\frac{\hat{N}_{rc}}{\hat{N}_{++}}\).

Estimación de proporciones para variables binarias

La estimación de una sola proporción, \(\pi\), para una variable de respuesta binaria requiere solo una extensión directa del estimador de razón mostrado en secciones anteriores. Como lo menciona Heeringa, S. G. (2017) Al recodificar las categorías de respuesta originales en una sola variable indicadora \(y_{i}\) con valores posibles de 1 y 0 (por ejemplo, sí = 1, no = 0), el estimador de la media de la razón estima la proporción o prevalencia, \(\pi\), de “1” en la población está dada por:

\[ p = \frac{{ \sum_{h=1}^{H}\sum_{\alpha=1}^{\alpha_{h}}\sum_{i\in\left(0,1\right)}^{n_{h\alpha}}}\omega_{h\alpha i}I\left(y_{i}=1\right)}{{ \sum_{h=1}^{H}\sum_{\alpha=1}^{\alpha_{h}}\sum_{i\in\left(0,1\right)}^{n_{h\alpha}}}\omega_{h\alpha i}} = \frac{\hat{N}_{1}}{\hat{N}} \]

Aplicando Linealización de Taylor (TSL) al estimador de razón de \(\pi\) genera el siguiente estimador para la varianza:

\[ v\left(p\right) \dot{=} \frac{V\left(\hat{N}_{1}\right)+p^{2}V\left(\hat{N}\right)-2\,p\,cov\left(\hat{N}_{1},\hat{N}\right)}{\hat{N}^{2}} \]

Como es bien sabido en la literatura especializada, cuando la proporción de interés estimada está cerca de 0 o 1, los límites del intervalo de confianza estándar basados en el diseño de muestreo pueden ser menores que 0 o superiores a 1. Lo cual no tendría interpretación por la naturaleza del parámetro. Es por lo anterior que, para solventar este problema se puede realizar cálculos alternativos de IC basados en el diseño de muestreo para las proporciones como lo proponen Wilson modificado (Rust y Hsu, 2007; Dean y Pagano, 2015). El intervalo de confianza utilizando la transformación \(Logit\left(p\right)\) está dado por:

\[ IC\left[logit\left(p\right)\right] = \left\{ ln\left(\frac{p}{1-p}\right)\pm\frac{t_{1-\alpha/2,\,gl}se\left(p\right)}{p\left(1-p\right)}\right\} \]

Por tanto, el intervalo de confianza para \(p\) sería:

\[ IC\left(p\right) = \left\{ \frac{exp\left[ln\left(\frac{p}{1-p}\right)\pm\frac{t_{1-\alpha/2,\,gl}se\left(p\right)}{p\left(1-p\right)}\right]}{1+exp\left[ln\left(\frac{p}{1-p}\right)\pm\frac{t_{1-\alpha/2,\,gl}se\left(p\right)}{p\left(1-p\right)}\right]}\right\} \]

Ahora bien, si se el interés es estimar proporciones para variables multinomiales. El estimador es el siguiente:

\[ p_{k} = \frac{{ \sum_{h=1}^{H}\sum_{\alpha=1}^{\alpha_{h}}\sum_{i=1}^{n_{h\alpha}}}\omega_{h\alpha i}I\left(y_{i}=k\right)}{{ \sum_{h=1}^{H}\sum_{\alpha=1}^{\alpha_{h}}\sum_{i=1}^{n_{h\alpha}}}\omega_{h\alpha i}} = \frac{\hat{N}_{k}}{\hat{N}} \]

A continuación, siguiendo con la base de ejemplo, se estima la proporción de hombres y mujeres en pobreza y no pobreza junto con su error estándar e intervalos de confianza.

prop_sexo_zona <- diseno %>% 
                  group_by(pobreza,Sex) %>%
                  summarise(prop = survey_prop(vartype = c("se", "ci"))) %>% 
                  data.frame()

prop_sexo_zona
##   pobreza    Sex      prop    prop_se  prop_low  prop_upp
## 1       0 Female 0.5291800 0.01242026 0.5045356 0.5536829
## 2       0   Male 0.4708200 0.01242026 0.4463171 0.4954644
## 3       1 Female 0.5236123 0.01586237 0.4921512 0.5548870
## 4       1   Male 0.4763877 0.01586237 0.4451130 0.5078488

Como se puede observar, el 52.3% de las mujeres y el 47.6% son pobres. Generando intervalos de confianza al 95% de (49.2%, 55.5%) para las mujeres y (44.5%, 50.7%) para los hombres.

En la librería survey existe una alternativa para estimar tablas de contingencias y es utilizando la función svyby como se muestra a continuación:

tab_Sex_Pobr <- svyby(formula = ~Sex, by =  ~pobreza, design = diseno, FUN = svymean)
tab_Sex_Pobr
##   pobreza SexFemale   SexMale se.SexFemale se.SexMale
## 0       0 0.5291800 0.4708200   0.01242026 0.01242026
## 1       1 0.5236123 0.4763877   0.01586237 0.01586237

Como se pudo observar, los argumentos que requiere la función son definir la variable a la cual se desea estimar (formula), las categorías por la cual se desea estimar (by), el diseño muestral (desing) y el parámetro que se desea estimar (FUN). Para la estimación de los intervalos de confianza se utiliza la función confint como sigue:

Para la estimación de los intervalos de confianza utilizar la función confint.

confint(tab_Sex_Pobr) %>% as.data.frame()
##                 2.5 %    97.5 %
## 0:SexFemale 0.5048367 0.5535232
## 1:SexFemale 0.4925226 0.5547019
## 0:SexMale   0.4464768 0.4951633
## 1:SexMale   0.4452981 0.5074774

Los cuales coinciden con los generados anteriormente usando la funicón group_by.

Otro análisis de interés relacionado con tablas de doble entrada en encuestas de hogares es estimar el porcentaje de desempleados por sexo.

tab_Sex_Ocupa <- svyby(formula = ~Sex,  by = ~Employment,
                       design = diseno, FUN = svymean)
tab_Sex_Ocupa
##            Employment SexFemale   SexMale se.SexFemale se.SexMale
## Unemployed Unemployed 0.2726730 0.7273270   0.05351318 0.05351318
## Inactive     Inactive 0.7703406 0.2296594   0.02340005 0.02340005
## Employed     Employed 0.4051575 0.5948425   0.01851986 0.01851986

De la anterior salida se puede observar que, el 27.2% de las mujeres y el 72.7% de los hombres están desempleados con errores estándares para estas estimaciones de 5.3% para mujeres y hombres. cuyos intervalos de confianza se calculan a continuación:

confint(tab_Sex_Ocupa) %>% as.data.frame()
##                          2.5 %    97.5 %
## Unemployed:SexFemale 0.1677891 0.3775570
## Inactive:SexFemale   0.7244773 0.8162038
## Employed:SexFemale   0.3688592 0.4414557
## Unemployed:SexMale   0.6224430 0.8322109
## Inactive:SexMale     0.1837962 0.2755227
## Employed:SexMale     0.5585443 0.6311408

Si ahora el objetivo es estimar la pobreza, pero por las distintas regiones que se tienen en la base de datos. Primero, dado que la variable pobreza es de tipo numérica, es necesario convertirla en factor y luego realizar la estimación con la función svyby.

tab_region_pobreza <- svyby(formula = ~as.factor(pobreza),  by = ~Region, 
                            design =  diseno, FUN = svymean)
tab_region_pobreza
##              Region as.factor(pobreza)0 as.factor(pobreza)1
## Norte         Norte           0.6410318           0.3589682
## Sur             Sur           0.6561536           0.3438464
## Centro       Centro           0.6346152           0.3653848
## Occidente Occidente           0.5991839           0.4008161
## Oriente     Oriente           0.5482079           0.4517921
##           se.as.factor(pobreza)0 se.as.factor(pobreza)1
## Norte                 0.05547660             0.05547660
## Sur                   0.04348901             0.04348901
## Centro                0.07858599             0.07858599
## Occidente             0.04670473             0.04670473
## Oriente               0.08849644             0.08849644

De lo anterior se puede concluir que, en la región Norte, el 35% de las personas están en estado de pobreza mientras que en el sur es el 34%. La pobreza más alta se tiene en la región oriente con un 45% de pobres. Los errores estándares de las estimaciones.

Prueba de independencia \(\chi^{2}\)

Esta prueba es una de las más utilizadas para determinar si no existe asociación o independencia entre dos variables de tipo cualitativa. En otras palabras, que dos variables sean independientes significa que una no depende de la otra, ni viceversa.

A modo de ejemplificar la técnica, para una tabla de \(2\times2\), la prueba \(\chi^{2}\) de personas se define como:

\[ \chi^{2} = n_{++}\sum_{r}\sum_{c}\frac{\left(p_{rc}-\hat{\pi}_{rc}\right)^{2}}{\hat{\pi}_{rc}} \]

donde, \(\hat{\pi}_{rc}=\frac{n_{r+}}{n_{++}}\,\frac{n_{+c}}{n_{++}}\,p_{r+}\,p_{+c}\).

Para realizar la prueba de independencia \(\chi^{2}\) en R, se utilizará la función svychisq del paquete srvyr. Esta función requiere que se definan las variables de interés (formula) y requiere que se le defina el diseño muestral (desing). Ahora, para ejemplificar el uso de esta función tomaremos la base de datos de ejemplo y se probará si la pobreza es independiente del sexo. A continuación, se presentan los códigos computacionales:

svychisq(formula = ~Sex + pobreza, design = diseno, statistic="F")
## 
##  Pearson's X^2: Rao & Scott adjustment
## 
## data:  NextMethod()
## F = 0.056464, ndf = 1, ddf = 119, p-value = 0.8126

Dado que el p-valor es superior al nivel de significancia 5% se puede concluir que, con una confianza del 95% y basado en la muestra, la pobreza no depende del sexo de las personas.

En este mismo sentido, si se desea saber si el desempleo está relacionado con el sexo, se realiza la prueba de hipótesis \(\chi^{2}\) como sigue:

svychisq(formula = ~Sex + Employment, 
         design = diseno,  statistic="F")
## 
##  Pearson's X^2: Rao & Scott adjustment
## 
## data:  NextMethod()
## F = 62.251, ndf = 1.6865, ddf = 200.6978, p-value < 2.2e-16

Concluyendo que, con una confianza del 95% y basado en la muestra se rechaza la hipótesis nula, es decir, no se puede afirmar que las variables sexo y desempleo sean independiente.

Si en el análisis ahora se quiere verificar que la pobreza de las personas es independiente de las regiones establecidas en la base de datos, se realiza de la siguiente manera:

svychisq(formula = ~Region + pobreza, 
         design = diseno,  statistic="F")
## 
##  Pearson's X^2: Rao & Scott adjustment
## 
## data:  NextMethod()
## F = 0.48794, ndf = 3.0082, ddf = 357.9731, p-value = 0.6914

Concluyendo que, con una confianza del 95% y basado en la muestra hay independencia entre la pobreza y la región. Lo anterior implica que, no existe relación lineal entre las personas en estado de pobreza por región.

Razón de odds

Como lo menciona Monroy, L. G. D. (2018) La traducción más aproximada del término odds es “la ventaja”, en términos de probabilidades es la posibilidad de que un evento ocurra con relación a que no ocurra, es decir, es un número que expresa cuánto más probable es que se produzca un evento frente a que no se produzca. También se puede utilizar para cuantificar la asociación entre los niveles de una variable y un factor categórico (Heeringa, S. G. 2017).

Suponga que se desea calcular la siguiente razón de odds.

\[ \frac{\frac{P(Sex = Female \mid pobreza = 0 )}{P(Sex = Female \mid pobreza = 1 )}}{ \frac{P(Sex = Male \mid pobreza = 1 )}{P(Sex = Male \mid pobreza = 0 )} } \]

El procedimiento para realizarlo en R sería, primero estimar las proporciones de la tabla cruzada entre las variables sexo y pobreza:

tab_Sex_Pobr <- svymean(x = ~interaction (Sex, pobreza), design = diseno, 
                        se=T, na.rm=T, ci=T, keep.vars=T)

tab_Sex_Pobr %>%  as.data.frame()
##                                        mean         SE
## interaction(Sex, pobreza)Female.0 0.3218703 0.01782709
## interaction(Sex, pobreza)Male.0   0.2863733 0.01768068
## interaction(Sex, pobreza)Female.1 0.2051285 0.01659697
## interaction(Sex, pobreza)Male.1   0.1866279 0.01778801

Luego, se realiza el contraste dividiendo cada uno de los elementos de la expresión mostrada anteriormente:

svycontrast(stat = tab_Sex_Pobr, 
contrasts = quote((`interaction(Sex, pobreza)Female.0`/`interaction(Sex, pobreza)Female.1`) /(`interaction(Sex, pobreza)Male.0`/ `interaction(Sex, pobreza)Male.1`)))
##           nlcon     SE
## contrast 1.0226 0.0961

Obtiendo que, se estima que el odds de las mujeres que no están en estado de pobreza es 1.02 comparandolo con el odds de los hombres. En otras palabras, se estima que las probabilidades de que las mujeres no estén en estado de pobreza sin tener en cuenta ninguna otra variable de la encuesta es cera de 2% mayor que las probabilidades de los hombres.

Diferencia de proporciones en tablas de contingencias

Como lo menciona Heeringa, S. G. (2017) las estimaciones de las proporciones de las filas en las tablas de doble entrada son, de hecho, estimaciones de subpoblaciones en las que la subpoblación se define por los niveles de la variable factorial. Ahora bien, si el interés se centra en estimar diferencias de las proporciones de las categorías entre dos niveles de una variable factorial, se pueden utilizando contrastes.

A manera de ejemplo, se requiere estimar ahora, el contraste de proporciones de mujeres en estado de pobreza versus los hombres en esta misma condición (\(\hat{p}_F - \hat{p}_M\)). Para ellos, primero, estimemos la proporción de hombres y mujeres en estado de pobreza como se ha mostrado en capítulos anteriores:

(tab_sex_pobreza <- svyby(formula = ~pobreza, by = ~Sex, 
                          design = diseno , svymean, na.rm=T,
                          covmat = TRUE, vartype = c("se", "ci")))
##           Sex   pobreza         se      ci_l      ci_u
## Female Female 0.3892389 0.03159581 0.3273123 0.4511656
## Male     Male 0.3945612 0.03662762 0.3227724 0.4663501

Ahora bien, para calcular la estimación de la diferencia de proporciones junto con sus errores estándares, se realizarán los siguientes pasos:

  • Paso 1: Calcular la diferencia de estimaciones
0.3892 - 0.3946          
## [1] -0.0054

Con la función vcov se obtiene la matriz de covarianzas:

library(kableExtra)
vcov(tab_sex_pobreza)%>% data.frame() %>% 
  kable(digits = 10,
        format.args = list(scientific = FALSE))
Female Male
Female 0.0009982953 0.0009182927
Male 0.0009182927 0.0013415823
  • Paso 2: El cálculo del error estándar es:
sqrt(0.0009983 + 0.0013416 - 2*0.0009183)
## [1] 0.02243435

Ahora bien, aplicando la función svycontrast se puede obtener la estimación de la diferencia de proporciones anterior:

svycontrast(tab_sex_pobreza,
            list(diff_Sex = c(1, -1))) %>%
  data.frame()
##              contrast   diff_Sex
## diff_Sex -0.005322297 0.02243418

De lo que se concluye que, la diferencia entre las proporciones de mujeres y hombres en estado de pobreza es -0.005 (-0.5%) con una desviación estándar de 0.022.

Otro ejercicio de interés en un análisis de encuestas de hogares es verificar la diferencia del desempleo por sexo. Al igual que el ejemplo anterior, se inicia con la estimación del porcentaje de desempleados por sexo:

tab_sex_desempleo <- svyby(formula = ~desempleo, by = ~Sex, 
                           design  = diseno %>% filter(!is.na(desempleo)) , 
                           FUN     = svymean, na.rm=T, covmat = TRUE,
                           vartype = c("se", "ci"))
tab_sex_desempleo
##           Sex  desempleo          se       ci_l       ci_u
## Female Female 0.02168620 0.005580042 0.01074952 0.03262288
## Male     Male 0.06782601 0.012161141 0.04399062 0.09166141

Para calcular la estimación de la diferencia de proporciones junto con sus errores estándares, se realizarán los siguientes pasos:

  • Paso 1: Diferencia de las estimaciones
0.02169 - 0.06783   
## [1] -0.04614

Estimación de la matriz de covarianza:

vcov(tab_sex_desempleo) %>% data.frame() %>% 
  kable(digits = 10,
        format.args = list(scientific = FALSE))
Female Male
Female 0.0000311369 0.0000208130
Male 0.0000208130 0.0001478933
  • Paso 2: Estimación del error estándar.
sqrt(0.00003114  + 0.00014789 - 2*0.00002081)
## [1] 0.0117222

Siguiendo el ejemplo anterior, utilizando la función svycontrast se tiene que:

svycontrast(tab_sex_desempleo,
            list(diff_Sex = c(-1, 1))) %>%
  data.frame()
##            contrast   diff_Sex
## diff_Sex 0.04613982 0.01172195

de lo que se concluye que, la estimación del contraste es 0.04 (4%) con un error estándar de 0.011.

Otro ejercicio que se puede realizar en una encuesta de hogares es ahora estimar la proporción de desempleados por región. Para la realización de este ejercicio, se seguirán los pasos de los dos ejemplos anteriores:

tab_region_desempleo <- svyby(formula =  ~desempleo, by = ~Region, 
                              design  = diseno %>% filter(!is.na(desempleo)) , 
                              FUN     = svymean, na.rm=T, covmat = TRUE,
                              vartype = c("se", "ci"))
tab_region_desempleo
##              Region  desempleo         se        ci_l       ci_u
## Norte         Norte 0.04877722 0.02002293 0.009532997 0.08802144
## Sur             Sur 0.06563877 0.02375124 0.019087202 0.11219034
## Centro       Centro 0.03873259 0.01240317 0.014422832 0.06304235
## Occidente Occidente 0.03996523 0.01229650 0.015864529 0.06406592
## Oriente     Oriente 0.02950231 0.01256905 0.004867428 0.05413719

Ahora, el interés es realizar los contrastes siguientes para desempleo:

\(\hat{p}_{Norte} - \hat{p}_{Centro} = 0.01004\), \(\hat{p}_{Sur} - \hat{p}_{Centro} = 0.02691\)
\(\hat{p}_{Occidente} - \hat{p}_{Oriente} = 0.01046\)

Escrita de forma matricial sería:

\[ \left[\begin{array}{ccccc} 1 & 0 & -1 & 0 & 0\\ 0 & 1 & -1 & 0 & 0\\ 0 & 0 & 0 & 1 & -1 \end{array}\right] \]

La matriz de varianzas y covarianzas es:

vcov(tab_region_desempleo)%>%
  data.frame() %>% 
  kable(digits = 10,
        format.args = list(scientific = FALSE))

Por tanto, la varianza estimada está dada por:

sqrt(0.0002981 + 0.0002884 - 2*0)
## [1] 0.02421776
sqrt(0.0001968 + 0.0002884 - 2*0)
## [1] 0.02202726
sqrt(0.0001267 + 0.0004093 - 2*0)
## [1] 0.02315167

Usando la función svycontrast, la estimación de los contrastes sería:

svycontrast(tab_region_desempleo, list(
                             Norte_sur = c(1, 0, -1, 0, 0),
                             Sur_centro = c(0, 1, -1, 0, 0),
                             Occidente_Oriente = c(0, 0, 0, 1, -1))) %>% data.frame()
##                     contrast         SE
## Norte_sur         0.01004463 0.02355327
## Sur_centro        0.02690618 0.02679477
## Occidente_Oriente 0.01046292 0.01758365

Por último, repitiendo el contraste anterior y los pasos para resolverlo, pero ahora utilizando la variable pobreza se tiene:

tab_region_pobreza <- svyby(formula = ~pobreza, by = ~Region, 
                            design = diseno %>% filter(!is.na(desempleo)) , 
                            FUN = svymean, na.rm=T, covmat = TRUE,
                            vartype = c("se", "ci"))
tab_region_pobreza
##              Region   pobreza         se      ci_l      ci_u
## Norte         Norte 0.3262813 0.04800361 0.2321959 0.4203666
## Sur             Sur 0.2946736 0.04794292 0.2007072 0.3886400
## Centro       Centro 0.3233923 0.07211854 0.1820426 0.4647421
## Occidente Occidente 0.3673286 0.04400234 0.2810856 0.4535716
## Oriente     Oriente 0.3870632 0.09160150 0.2075276 0.5665989

El interés se centra en realizar los contrastes siguientes para pobreza:

\(\hat{p}_{Norte} - \hat{p}_{Centro}\), \(\hat{p}_{Sur}-\hat{p}_{Centro}\)
\(\hat{p}_{Occidente}-\hat{p}_{Oriente}\)

Escrita de forma matricial es:

\[ \left[\begin{array}{ccccc} 1 & 0 & -1 & 0 & 0\\ 0 & 1 & -1 & 0 & 0\\ 0 & 0 & 0 & 1 & -1 \end{array}\right] \]

Y, utilizando la función svycontrast se obtiene:

svycontrast(tab_region_pobreza, list(
                Norte_sur = c(1, 0, -1, 0, 0),
                Sur_centro = c(0, 1, -1, 0, 0),
                Occidente_Oriente = c(0, 0, 0, 1, -1))) %>% data.frame()
##                       contrast         SE
## Norte_sur          0.002888908 0.08663389
## Sur_centro        -0.028718759 0.08660027
## Occidente_Oriente -0.019734641 0.10162205