0. Definición del ambiente de trabajo.

Al comenzar siempre es importante establecer el idioma adecuado para que el programa reconozca caractreres especiales. En el caso de definir al idioma español, la instrucción a utilizar es:

Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/C"
Sys.setenv(LANG = "spa")

También es importante instalar las librerías que se utilizarán posteriormente, que serán: tidyverse y descr.

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.3     ✓ purrr   0.3.4
## ✓ tibble  3.1.0     ✓ dplyr   1.0.5
## ✓ tidyr   1.1.3     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(descr)

Además es muy relevante establecer la ubicación del directorio de trabajo, con el fin que el programa identifique el archivo del que extraerá y, también, guardará la información solicitada.

getwd() ##directorio actual
## [1] "/Users/gustavo/Dropbox/R/Rmarkdown"
setwd("/Users/Gustavo/Dropbox/R") ##Esta permite cambiar y definir el directorio deseado
list.files() ##Esta permite enlistar los archivos dentro del directorio
##  [1] "_f33dc7a6f28c9f1b7593f7d02d195d31_intro_to_data_Coursera.html"
##  [2] "~$datos_morena_frag.xlsx"                                     
##  [3] "~$ia_ponencia_morena.docx"                                    
##  [4] "~$morena_nueva_encuesta_2020.xlsx"                            
##  [5] "200613COVID19MEXICO.csv"                                      
##  [6] "api13.1.dta"                                                  
##  [7] "apilog.dta"                                                   
##  [8] "autoestima.csv"                                               
##  [9] "avgpm25.csv"                                                  
## [10] "Base Voto x Mujeres Experimento 1 copia.csv"                  
## [11] "base_alternancias.csv"                                        
## [12] "Base_datos_Informe_Pais.xlsx"                                 
## [13] "base_municipios_final_datos_01.csv"                           
## [14] "base_voto_mujeres_2012_2018.csv"                              
## [15] "base_votos_2015_2018.csv"                                     
## [16] "Bertrand_data.dta"                                            
## [17] "Card and Krueger (1994).dta"                                  
## [18] "Clase 2 DGAPA.xlsx"                                           
## [19] "Clase 4 DGAPA.xlsx"                                           
## [20] "Componente principal SPP.jpeg"                                
## [21] "Concentrado_Elecciones_Federales_1976_2018 copia.csv"         
## [22] "concentrado.csv"                                              
## [23] "concentradohogar 1.dta"                                       
## [24] "concentradohogar.dta"                                         
## [25] "concentradohogardia3.dta"                                     
## [26] "conejos.csv"                                                  
## [27] "Copia de factorial 3x2x2.csv"                                 
## [28] "copia_semillas.csv"                                           
## [29] "cuadro_latino.csv"                                            
## [30] "Curso Intro a R I y II"                                       
## [31] "curso_data_ibero"                                             
## [32] "data_clientelismo.csv"                                        
## [33] "data_clientelismo.dta"                                        
## [34] "datos_2_fac_aleat.csv"                                        
## [35] "datos_computos_distritos_diputado.txt"                        
## [36] "datos_covid1.txt"                                             
## [37] "datos_covid2.csv"                                             
## [38] "datos_covid3.xlsx"                                            
## [39] "datos_gc.csv"                                                 
## [40] "datos_morena_frag.xlsx"                                       
## [41] "datos_repeticiones.csv"                                       
## [42] "datos_telas.csv"                                              
## [43] "datosgen.txt"                                                 
## [44] "Dee.dta"                                                      
## [45] "diccionario_datos_covid19"                                    
## [46] "Diferencia_votos_DIP_FED_2015.csv"                            
## [47] "diminish.txt"                                                 
## [48] "ENCOVID_19_abril"                                             
## [49] "encuesta_abierta_morena_2020.xlsx"                            
## [50] "Encuesta_Gea.dta"                                             
## [51] "encuesta_nina_w_ 2016"                                        
## [52] "enpol_sec_5_6.csv"                                            
## [53] "enpol_sec7_1.csv"                                             
## [54] "enpol_sec8_9_10.csv"                                          
## [55] "experim_azucar.csv"                                           
## [56] "figura1pulpo.csv"                                             
## [57] "guia_ponencia_morena.docx"                                    
## [58] "ICI_2018.xlsx"                                                
## [59] "idh_mpio_2000_2005.csv"                                       
## [60] "idh_mpio_2000_2005.xls"                                       
## [61] "indices_spp_subnacional_1980_2018.xlsx"                       
## [62] "jerarquico_cruzado.csv"                                       
## [63] "Latinobarometro_2018_Esp_Spss_v20190303.sav"                  
## [64] "Latinobarometro_2018_Esp_Stata_v20190303.dta"                 
## [65] "Latinobarometro2016Esp_v20170205.dta"                         
## [66] "mediciones_repetidas.csv"                                     
## [67] "Mi_Exportación.xlsx"                                          
## [68] "modelo_jerarquico.csv"                                        
## [69] "morena_nueva_encuesta_2020.xlsx"                              
## [70] "morena-bd-integrada-estimación-empresas.xlsx"                 
## [71] "NES96.dta"                                                    
## [72] "partylevel_20130907.csv"                                      
## [73] "presid06computo.dta"                                          
## [74] "Principal Component Analysis R Program and Output.pdf"        
## [75] "rdrobust_senate.dta"                                          
## [76] "resultados_diputadosfederales_2018.csv"                       
## [77] "Rmarkdown"                                                    
## [78] "rubiaprom.csv"                                                
## [79] "scripts"                                                      
## [80] "SDEMT319_10.dta"                                              
## [81] "sdemt319_10.sav"                                              
## [82] "SDEMT319.dta"                                                 
## [83] "Tabasco_votos_dip_loc_2018_dif.csv"                           
## [84] "tarea_hipertension.csv"                                       
## [85] "TiposErrores.png"                                             
## [86] "Voto electronico.csv"                                         
## [87] "voto_cand_socioec_2012.csv"                                   
## [88] "voto_cand_socioec_2015.csv"                                   
## [89] "voto_cand_socioec_2018.csv"                                   
## [90] "votos_diputados_2015.csv"                                     
## [91] "votos_mujeres_2012_2018_copia.csv"                            
## [92] "votos_mujeres_2012_2018.csv"

Una vez establecido el directorio de trabajo, se debe cargar la base de datos o data frame en el ambiente del programa del que se analizará la información. Para ello habrá que “cargar” la información sobre los pacientes infectados por COVID-19 reportados por la Secretaría de Salud del gobierno federal mexicano.

datos_covid <- read.csv("/Users/Gustavo/Dropbox/R/200613COVID19MEXICO.csv", header = TRUE) #ruta de acceso a los datos, 'header = TRUE' en caso de que el archivo cuente con nombres de las variables.

1. Análisis de datos bivariados.

En ocasiones es importante la descripción del comportamiento de dos variables para identificar su grado de asociación. Esto permite identificar inicialmente si existe algún tipo de relación entre ellas y, así, posteriormente se podrá profundizar en el análisis de la forma de su relación al grado de evaluar el tamaño del efecto causal que las vincula. Asimismo este tipo de evaluación inicial permite, también, descartar el estudio de variables que no presentan asociación, pues ello supone que a futuro no existirá un efecto causal significativo que las vincule. Y así se puede evitar el gasto de recursos (tiempo y dedicación) en el estudio de asociaciones débiles entre variables.

El estudio de la asociación existente entre dos variables o más, incialmente, debe reconocer el tipo de variables con las que se está trabajando (continuas, discretas) pues ello implica que las técnicas para describir y evaluar su asociación serán distintas.

En el caso de trabajar solamente con variables discretas (en escalas nominal u ordinal), suele ser pertinente el análisis de asociación mediante las tablas de contingencia, y se apoya en el estadístico \(\chi^2\) (chi-cuadrada) para evaluar la significancia estadística de su distribución (o el grado independencia entre las variables).

Mientras que en el caso de trabajar con variables continuas (ya sea en escala de intervalo o razón), es pertinente el uso de la técnica del análisis del coeficiente de correlación de Pearson para evaluar su nivel de asociación, así como su significancia estadística asociada a la distribución de probabilidades del estadístico \(r\) mismo.

Si bien existen otros estadísticos para evaluar las asociaciones entre variables ordinales y continuas, en este documento se centra la atención en las tablas de contingencia y en el coeficiente de correlación de Pearson.

2. Análisis de datos categóricos.

El estudio de variables categóricas suele ser una situación recurrente en el ámbito de la Ciencia Política, pues las escalas utilizadas para su medición solamente permiten la diferenciación entre atributos (variables en escala nominal) o en ocasiones se puede identificar la presencia diferenciada de un atributo en cada categoría) que permite ordenarlas pero sin establecer con claridad la distancia existente entre cada atributo (variables en escala ordinal).

Un ejemplo de variable categórica nominal es el nombre de los partidos políticos con los que se identifica un elector. El nombre de los partidos permite distinguir la identificación partidista del elector con alguna de las organizaciones disponibles pero no es posible ordenar los nombres de los partidos, con el fin de identificar algún fenómeno social subyacente.

En el caso de las variables ordinales, un ejemplo se pueden encontrar en la manera en que la organización “Latinobarómetro” mide la satisfacción de los ciudadanos de América latina con el funcionamiento de la democracia. Para ello realizan la siguiente pregunta: “En general, ¿Diría Ud. que está muy satisfecho, más bien satisfecho, no muy satisfecho o nada satisfecho con el funcionamiento de la democracia?”, donde las respuestas posibles son: 1. muy satisfecho, 2. más bien satisfecho, 3. no muy satisfecho, 4. nada satisfecho, 5. no sabe.

Estas respuestas buscar identificar la presencia del atributo de “satisfacción con la democracia” y sus posibles variaciones en cada atributo posible de respuesta, pero no es posible identificar las distancias existentes entre cada opción disponible. Esto es, siempre quedará la duda sobre si la distancia existente entre las respuestas 1 y 2 es la misma (o constante) entre 3 y 4. Pero, últimamente, estas respuestas pueden ser ordenadas según la presencia del grado de satisfacción.

Este tipo de variables, debido a que su naturaleza y su escala de medición se caracteriza por ser texto o nombres, a estas no se les pueden calcular parámetros como lo son: media o desviación estándar. Y en cambio las operaciones matemáticas que se pueden realizar con ellas corresponden a conteos o frecuencias por cada categoría disponible y, por tanto, el tipo de análisis estadístico recurre a herramientas no paramétricas mediante las que se busca evaluar su comportamiento o distribución para una o más variables entre sí.

Al iniciar el trabajo con variables categóricas siempre es importante revisar la estructura de los datos guardados en la matriz de datos, con el fin de identificar la configuración con la que fueron guardadas en el archivo correspondiente. Para ello se utilizará el script str() que permite revisar la estructura de las variables y las observaciones de la matriz.

str(datos_covid) #este script permite ver la estructura de las variables y un vistazo a los primeros valores de las observaciones para cada variable.
## 'data.frame':    401755 obs. of  35 variables:
##  $ FECHA_ACTUALIZACION: Factor w/ 1 level "2020-06-13": 1 1 1 1 1 1 1 1 1 1 ...
##  $ ID_REGISTRO        : Factor w/ 401755 levels "00000e","000013",..: 65385 361816 52562 130466 322694 101799 6571 133408 62254 10155 ...
##  $ ORIGEN             : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ SECTOR             : int  3 3 4 4 4 4 3 4 4 4 ...
##  $ ENTIDAD_UM         : int  25 27 9 15 15 30 27 15 15 7 ...
##  $ SEXO               : int  2 1 1 1 2 1 2 2 1 1 ...
##  $ ENTIDAD_NAC        : int  25 27 9 15 15 30 27 15 9 7 ...
##  $ ENTIDAD_RES        : int  25 27 15 15 15 30 27 15 15 7 ...
##  $ MUNICIPIO_RES      : int  6 5 58 37 122 193 13 109 54 97 ...
##  $ TIPO_PACIENTE      : int  1 2 1 1 2 2 1 2 1 1 ...
##  $ FECHA_INGRESO      : Factor w/ 165 levels "2020-01-01","2020-01-02",..: 132 143 108 113 112 123 160 88 98 110 ...
##  $ FECHA_SINTOMAS     : Factor w/ 165 levels "2020-01-01","2020-01-02",..: 130 141 105 113 112 113 160 86 97 104 ...
##  $ FECHA_DEF          : Factor w/ 105 levels "2020-01-14","2020-01-15",..: 105 105 105 105 105 105 105 105 105 105 ...
##  $ INTUBADO           : int  97 2 97 97 2 2 97 2 97 97 ...
##  $ NEUMONIA           : int  2 2 2 2 2 2 2 1 2 2 ...
##  $ EDAD               : int  27 52 55 38 59 67 36 27 39 30 ...
##  $ NACIONALIDAD       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ EMBARAZO           : int  97 2 2 2 97 2 97 97 2 2 ...
##  $ HABLA_LENGUA_INDIG : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ DIABETES           : int  2 1 1 2 2 1 2 2 2 2 ...
##  $ EPOC               : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ ASMA               : int  2 2 2 2 2 1 2 1 2 2 ...
##  $ INMUSUPR           : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ HIPERTENSION       : int  2 1 1 2 2 2 2 2 2 2 ...
##  $ OTRA_COM           : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ CARDIOVASCULAR     : int  2 1 2 2 2 2 2 2 2 2 ...
##  $ OBESIDAD           : int  2 2 1 2 2 2 2 2 2 1 ...
##  $ RENAL_CRONICA      : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ TABAQUISMO         : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ OTRO_CASO          : int  1 2 99 99 99 99 1 99 99 99 ...
##  $ RESULTADO          : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ MIGRANTE           : int  99 99 99 99 99 99 99 99 99 99 ...
##  $ PAIS_NACIONALIDAD  : Factor w/ 88 levels "Alemania","Archipiélago de Svalbard",..: 55 55 55 55 55 55 55 55 55 55 ...
##  $ PAIS_ORIGEN        : Factor w/ 49 levels "99","Alemania",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ UCI                : int  97 2 97 97 2 2 97 2 97 97 ...

La estructura de las variables del data frame de los datos de pacientes registrados con COVID-19 se encuentran 35 variables, de las que 7 son del tipo Factor y las 28 restantes son del tipo Intervalo.

Pregunta: ¿Cuántas variables categóricas y cuántas continuas son las que integran a la matriz de datos COVID-19?

2.1. Transformación de variables continuas a “Factores”

A continuación revisaremos si existe asociación entre el Resultado (Y) que arrojan los pacientes a las pruebas COVID-19 con la precondición de salud de padecer o no Diabetes (X).

Para realizar el trabajo con variables categóricas se requiere que R las reconozca del tipo Factor para que, a su vez, evite considerar la posibilidad de valores intermedios (o continuos) entre cada categoría además de identificar los valores perdidos. En el caso de la matriz de los datos COVID-19 se observa que diversas variables categóricas que son caracterizadas del tipo intervalo corresponden a variables categóricas discretas y, también, entre los valores asignados numéricamente se reportaron los casos perdidos.

El riesgo que se corre al no indicarle al software que una variable de interés sea categórica se observa en la siguiente gráfica, en la que se desea graficar la distribución de los pacientes con la pre condición de diabetes:

datos_covid %>%
  ggplot(aes(x = DIABETES)) +
  geom_bar()

En la gráfica se observa una distribución muy amplia en la que los casos están concentrados en los valores extremos (en torno a los valores 1 y 2 así como en el valor 98). En esta situación, el software está considerando que la variable es de tipo intervalar y, por tanto, contempla la posiblidad de casos con valores intermedios entre sus extremos.

Por ello se requiere transformar la variable DIABETES, para convertirla de una del tipo intervalo a una del tipo factor. Para ello, lo primero consiste en re codificar los valores de la variable de DIABETES a una variable dummy en donde el caso positivo (sí tiene diabetes) adquiera el valor de 1, y el caso negativo (no tiene diabetes) adquiera el valor de 0. Además se requiere indicarle al software cuáles son los valores perdidos que, originalmente, les fueron asignados el valor de 98.

datos_covid <- datos_covid %>% #Esto permite sobre escribir una nueva variable sobre el data frame
  na_if(98) %>% #se indican los casos "perdidos" con su valor original
  mutate(DIABETES_dum = 
         ifelse(DIABETES == 1, 1, 0)) # se recodifican los valores positivos y negativos

Hasta aquí se recodificaron los valores originales de la variable DIABETES pero aún falta transformar el tipo de variable para que sea reconocida del tipo factor.

datos_covid$DIABETES_dum<- factor(datos_covid$DIABETES_dum, #objeto
                                  levels = c(0,1),  #valores o niveles numéricos
                                  labels = c("no", "si"), #significados de cada valor numérico
                                  exclude = NA) #excluir los casos "perdidos"

Ahora se puede graficar la distribución de la variable del tipo Factor.

datos_covid %>% #selección de data frame
  drop_na(DIABETES_dum) %>% #remover los casos "perdidos"
  ggplot(aes(DIABETES_dum, fill = as.factor(RESULTADO))) + #definir el tamaño del lienzo
  geom_bar() + #definir el tipo de gráfica de los datos
  labs(title = "Pacientes con Diabetes y Resultado a Prueba COVID-19", #texto de la gráfica
       x = "Diabetes",
       y = "Cantidad")

Ejercicio:

Recodificar los valores de la variable “RESULTADO” y transformarla en una variable dummy “RESULTADO_dum”, donde 1 represente el valor de un caso positivo de paciente infectado con COVID-19 y 0 para un paciente no infectado con COVID-19, y donde el valor original de 3 corresponde a los casos “perdidos.” Posteriormente se debe transformar a una variable del tipo “Factor”. Y finalmente graficar la distribución de la variable.

datos_covid <- datos_covid %>% #Esto permite sobre escribir una nueva variable sobre el data frame
  na_if(3) %>% #se indican los casos "perdidos" con su valor original
  mutate(RESULTADO_dum = 
           ifelse(RESULTADO == 1, 1, 0)) #se recodifican los valores negativos

Trasnformación a factor:

datos_covid$RESULTADO_dum<- factor(datos_covid$RESULTADO_dum, #objeto
                                  levels = c(0,1),  #valores o niveles numéricos
                                  labels = c("negativo", "positivo"), #significados de cada valor numérico
                                  exclude = NA) #excluir los casos "perdidos"

Graficación:

datos_covid %>% #selección de data frame
  drop_na(DIABETES_dum, RESULTADO_dum) %>% #remover los casos "perdidos"
  ggplot(aes(DIABETES_dum, fill = RESULTADO_dum)) + #definir el tamaño del lienzo
  geom_bar() + #definir el tipo de gráfica de los datos
  labs(title = "Pacientes con Diabetes y Resultado a Prueba COVID-19", #texto de la gráfica
       x = "Diabetes",
       y = "Cantidad")

3. Tablas de contingencia y pruebas de independencia

Referencia: https://www.institutomora.edu.mx/testU/SitePages/martinpaladino/Datos_categoricos.html

Las tablas de contingencia consisten en un arreglo de los datos correspondientes a las variables categóricas nominales analizadas, y se integra por celdas condicionales y marginales. En las celdas marginales (horizontal y vertical) se refiren las frecuencias totales (absolutas o relativas) de los casos registrados bajo cada una de las categorías correspondientes a cada variable, mientras que en las celdas condicionales se reportan las frecuencias de los casos que comparten las características de las variables intersectas.

En función de las variables (no sus categorías) representadas en la tabla de contingencia también varía el número de dimensiones que contiene dicha tabla. Esto es, en caso de integrar una tabla de cotingencia con dos variables (indistintamente de la cantidad de categorías o atributos de cada variable), entonces se refiere que se cuenta con una tabla de contingencia con dos dimensiones.

Para tablas de contingencia bidimensionales, visualmente las dimensiones se nos presentan como filas y columnas. En la intersección de cada fila y columna hay una celda que registra el conteo de las observaciones que pertenecen a ambas categorías. En términos de conjuntos, el conteo de objetos es la intersección de A y B. En el caso de las filas se suele incluir a la variable de interés que se desea explicar (Y), y en el caso de las columnas se suele presentar la variable que se considera asociada y que, se infiere, afecta el comportamiento de la distribución de la variable de interés (X).

En R se puede construir una tabla de contingencia con frecuencias absolutas utilizando el script table(), y que a su vez crea un objeto del tipo ‘table’, que es una estructura especial para tablas.

tabla_abs<-table(datos_covid$RESULTADO_dum, datos_covid$DIABETES_dum, useNA = "no") #formato de variables (y - renglón, x - columna)
tabla_abs
##           
##                no     si
##   negativo 181903  19650
##   positivo 118206  23803

Tabla de contingencia con proporciones totales:

round(prop.table(tabla_abs), 2) #proporciones totales reducidas a 2 decimales
##           
##              no   si
##   negativo 0.53 0.06
##   positivo 0.34 0.07

Tabla de contingencia con proporciones condicionales por fila:

round(prop.table(tabla_abs, 1), 2) #proporciones por fila reducida a 2 decimales
##           
##              no   si
##   negativo 0.90 0.10
##   positivo 0.83 0.17

Tabla de contingencia con proporciones condicionales por columna:

round(prop.table(tabla_abs, 2), 2) #proporciones por columna reducida a 2 decimales
##           
##              no   si
##   negativo 0.61 0.45
##   positivo 0.39 0.55

Tabla de contingencia con sumas absolutas en los marginales:

addmargins(tabla_abs, c(1, 2))
##           
##                no     si    Sum
##   negativo 181903  19650 201553
##   positivo 118206  23803 142009
##   Sum      300109  43453 343562

Tabla de contingencia con sumas de proporciones en los marginales:

round(addmargins(prop.table(tabla_abs), c(1, 2)), 2)
##           
##              no   si  Sum
##   negativo 0.53 0.06 0.59
##   positivo 0.34 0.07 0.41
##   Sum      0.87 0.13 1.00

3.1. Tablas de frecuencias y de contingencia con librería descr

La librería descr contiene algunas funciones o códigos que también permiten generar tablas de frencuencias así como tablas de contingencia. La diferencia respecto de los scripts del sistema base radican en el formato de salida que arroja y en la posibilidad de generar gráficos de barras acumuladas, de manera automática.

En el caso de las tablas de frecuencias, el script para solicitarlas para una variable es freq(), y tiene la siguiente estructura: freq(x, w, user.missing = , plot = , …), donde:

  • x = la variable factor de la que se desea conocer sus frecuencias,
  • w = un vector adicional para ponderar la tabla de frecuencias,
  • user.missing = vector de caracteres que indica cuáles son los niveles que deben se tratados como valores perdidos al calcular los porcentajes válidos, y estos no son representados en la gráfica de barras acumuladas.
  • plot = valor lógico (TRUE es el valor por default) que indica si se debe generar el gráfico de frecuencias
  • … = argumentos adicionales que se adjuntan a la gráfica de frecuencias en caso de que plot = TRUE.

En el caso del ejemplo realizado hasta el momento basado en la variable RESULTADO_dum, se pueden solicitar las distribuciones de frecuencias absolutas y relativas (porcentajes) para cada una de la siguiente manera:

freq(datos_covid $ RESULTADO_dum, plot = FALSE)
## datos_covid$RESULTADO_dum 
##          Frequency Percent Valid Percent
## negativo    202139   50.31         58.62
## positivo    142690   35.52         41.38
## NA's         56926   14.17              
## Total       401755  100.00        100.00

En caso de necesitar la versión gráfica para la representación de estos datos, se activa la opción de gráfica:

freq(datos_covid $ RESULTADO_dum, plot = TRUE)

## datos_covid$RESULTADO_dum 
##          Frequency Percent Valid Percent
## negativo    202139   50.31         58.62
## positivo    142690   35.52         41.38
## NA's         56926   14.17              
## Total       401755  100.00        100.00

Por otra parte, se puede solicitar una tabla de contingencia (o tabla cruzda) para conocer la asociación existente entre dos variables a partir del script crosstab(), que tiene la siguiente estructura:

crosstab(dep, indep, weight = NULL, digits = list(expected = 1, prop = 3, percent = 1, others = 3), max.width = NA, expected = FALSE, prop.r = FALSE, prop.c = FALSE, prop.t = FALSE, prop.chisq = FALSE, chisq = FALSE, fisher = FALSE, mcnemar = FALSE, resid = FALSE, sresid = FALSE, asresid = FALSE, missing.include = FALSE, drop.levels = TRUE, format = “SPSS”, cell.layout = TRUE, row.labels = !cell.layout, percent = (format == “SPSS” && !row.labels), total.r, total.c, dnn = “label”, xlab = NULL, ylab = NULL, main = "“, user.missing.dep, user.missing.indep, plot = getOption(”descr.plot"), …)

donde las indicaciones básicas son:

  • dep = variable dependiente,
  • indep = variable independiente,
  • weight = vector opcional para ponderar la tabulación cruzada,
  • prop.r = valor lógico que arroja los proporciones por fila (row),
  • prop.c = valor lógico que arroja los proporciones por columna (column),
  • prop.t = valor lógico que arroja los proporciones totales (total),
  • expected = valor lógico que arroja los valores esperados para cada celda,
  • prop.chisq = valor lógico que arroja los valores de proporciones chi cuadrada por celda,
  • chisq = valor lógico que genera el valor chi-cuadrado para la tabla y su p-value correspondiente,
  • fisher = valor lógico que genera el valor F de Fisher para la tabla y su p-value correspondiente,
  • resid = valor lógico que arroja los valores absolutos residuales para cada celda (diferencia entre valores observados y esperados en cada celda),
  • missing.include = valor lógico que incluye los valores perdidos en el cálculo del estadístico de prueba,
  • total.r = valor lógico que arroja los valores totales por fila,
  • total.c = valor lógico que arroja los valores totales por columna,
  • format = “SPSS”, valor de caracter que indica el formato en que se presentarán los resultados,
  • xlab = valor de caracter que permite modificar el título de la variable del eje X en el gráfico,
  • ylab = valor de caracter que permite modificar el título de la variable del eje Y en el gráfico,
  • main = valor de caracter que permite modificar el nombre de la gráfica,
  • plot = valor lógico que permite generar o cancelar la generación de una gráfica de barras apiladas.

Siguiendo el ejemplo de arriba en donde se evalúa la asociación existente entre la variabe de RESULTADOS_dum dependiente de la variable DIABETES_dum, se realiza la siguiente tabla de contingencia:

crosstab(datos_covid $ RESULTADO_dum, datos_covid $ DIABETES_dum,
         expected = TRUE,
         prop.c = TRUE,
         prop.t = TRUE,
         resid = TRUE,
         format = "SPSS",
         percent = TRUE,
         main = "Asociación entre diabetes y resultado a prueba covid-19",
         xlab = "Paciente con Diatebes",
         ylab = "Resultado en prueba COVID-19",
         plot = TRUE)

##    Cell Contents 
## |-------------------------|
## |                   Count | 
## |         Expected Values | 
## |          Column Percent | 
## |           Total Percent | 
## |                Residual | 
## |-------------------------|
## 
## =====================================================
##                              datos_covid$DIABETES_dum
## datos_covid$RESULTADO_dum        no       si    Total
## -----------------------------------------------------
## negativo                    181903    19650   201553 
##                             176061    25492          
##                               60.6%    45.2%         
##                               52.9%     5.7%         
##                               5842    -5842          
## -----------------------------------------------------
## positivo                    118206    23803   142009 
##                             124048    17961          
##                               39.4%    54.8%         
##                               34.4%     6.9%         
##                              -5842     5842          
## -----------------------------------------------------
## Total                       300109    43453   343562 
##                               87.4%    12.6%         
## =====================================================

De esta manera se ha generado una tabla de contingencia con información diversa, en la que el significado de cada renglón es indicado en el cuadro superior del título “cell contents”. Para el ejemplo realizado, cada celda contiene la siguiente información por renglón: i. la cantidad absoluta, ii. los valores absolutos esperados para cada celda, iii. los porcentajes condicionados por columna, iv. los porcentajes que representa cada celda respecto del total, y v. el valor de los residuos para cada celda.

3.2. Pruebas de hipótesis: independencia de Chi-cuadrada

Hasta el momento se ha revisado la manera en que pueden interactuar dos variables categóricas a través de una tabla de contingencia. Sin embargo aún no es suficiente para establecer si existe algún tipo de asociación estadísticamente significativa entre dichas variables. Para ello es necesario realizar una prueba de hipótesis, en la que se utilizará el estadístico de prueba \(\chi^2\) (chi-cuadrada).

A partir de dicho estadístico se evalúa si el comportamiento de la variable Y (en el ejemplo consiste en el RESULTADO_dum) está asociado al comportamiento de la variable X (que consiste en si los pacientes presentan la pre condición de DIABETES_dum). De manera que la hipótesis alternativa que se evalúa plantea que ambas variables están asociadas, mientras que la hipótesis nula plantea que ambas variables son independientes entre sí.

La manera en que se calcula el estadístico de prueba \(\chi^2\) consiste en una comparación entre la tabla de contingencia bivariada de los datos observados respecto del comportamiento ideal de los mismos en una tabla de datos esperados. Esta última tabla de datos esperados calcula los valores ideales dentro de cada celda de la tabla de contingencia a partir de multiplicar las proporciones marginales correspondientes a cada fila y columna.

Para calcular la distribución ideal de los datos esperados, “La forma más simple es multiplicar los conteos marginales para cada celda y luego dividirlos por la n, el total de observaciones. Las proporciones marginales indican la probabilidad de que un objeto –en el sentido estadístico– pertenezca a cierta categoría.” (Paladino, s/a)

Tabla del modelo de independencia:

Resultado_dum DIABETES_dum
si no
Positivo 0.0533 0.3567
Negativo 0.0767 0.5133

A partir de la comparación de los datos observados respecto de los datos esperados de la tabla ideal, las diferencias o errores crudos que surgen para cada celda es que se calcula el valor del estadístico \(\chi^2\), y al que se encuentra asociado una probabilidad con la que se evalúa la hipótesis nula (que plantea que ambas variables son independientes entre sí). \[\chi^2 = \frac{\sum (O-E)^2}{E}\]

Esto es, en la medida en que la tabla de datos observados sea lo más semejante posible a la distribución de la tabla de datos esperados (que representa a un modelo de independencia), se considera que los datos observados siguen la tendencia del modelo de independencia y, por tanto, las variables son independientes entre sí.

Una vez calculado el valor del estadístico de prueba \(\chi^2\), es necesario conocer un dato adicional para poder calcular la probabilidad de obtener los datos observados dado el modelo de independencia, con la que se evaluará la hipótesis nula. Estos consisten en los Grados de Libertad (gl), “que corrigen las probabilidades por el tamaño de la tabla. Los grados de libertad se calculan usando la fórmula” (Paladino, s/a): \[gl = (filas -1)(columnas -1)\]

A partir del valor del estadístico de prueba \(\chi^2\) y los gl se puede calcular el p-valor correspondiente para evaluar la hipótesis nula.

En R se puede calcular la prueba de chi-cuadrado mediate el script chisq.test(). “La sintaxis básica es chisq.test(x, correct=TRUE), donde x es un objeto de la clase table y correct= es un valor lógico que señala si se hará la corrección de Yates (TRUE, por defecto) o no (FALSE, opcional)” (Paladino, s/a).

chisq.test(tabla_abs)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla_abs
## X-squared = 3707.3, df = 1, p-value < 2.2e-16

La prueba de chi-cuadrada para la tabla de contingencia entre las variables de RESULTADO_dum y DIABETES_dum arroja un valor del estadístico de prueba de 3707.3 con 1 grado de libertad. Con estos elementos se identifica que el p-valor de la H0 es menor a 0.

A partir de evaluar dicho p-valor con un nivel de significancia (\(\alpha =0.05\)), entonces se considera que se puede rechazar la H0, con lo que se acepta Ha que plantea que ambas variables están asociadas entre sí. De manera que se puede tomar una decisión de aceptar que existe asociación entre ambas variables con un nivel de confianza del 95%.

3.2.1. Prueba de independencia con paquetería descr

Alternativamente se puede solicitar la realización de la prueba de independencia con el estadístico chi-cuadrado a partir de la librería descr dentro del script crosstab(), para lo que se debe activar el comando chisq = TRUE, de la siguiente manera:

crosstab(datos_covid $ RESULTADO_dum, datos_covid $ DIABETES_dum,
         expected = TRUE,
         prop.c = TRUE,
         prop.t = TRUE,
         resid = TRUE,
         chisq = TRUE,
         format = "SPSS",
         percent = TRUE,
         main = "Asociación entre diabetes y resultado a prueba covid-19",
         xlab = "Paciente con Diatebes",
         ylab = "Resultado a prueba COVID-19",
         plot = TRUE)

##    Cell Contents 
## |-------------------------|
## |                   Count | 
## |         Expected Values | 
## |          Column Percent | 
## |           Total Percent | 
## |                Residual | 
## |-------------------------|
## 
## =====================================================
##                              datos_covid$DIABETES_dum
## datos_covid$RESULTADO_dum        no       si    Total
## -----------------------------------------------------
## negativo                    181903    19650   201553 
##                             176061    25492          
##                               60.6%    45.2%         
##                               52.9%     5.7%         
##                               5842    -5842          
## -----------------------------------------------------
## positivo                    118206    23803   142009 
##                             124048    17961          
##                               39.4%    54.8%         
##                               34.4%     6.9%         
##                              -5842     5842          
## -----------------------------------------------------
## Total                       300109    43453   343562 
##                               87.4%    12.6%         
## =====================================================
## 
## Statistics for All Table Factors
## 
## Pearson's Chi-squared test 
## ------------------------------------------------------------
## Chi^2 = 3707.956      d.f. = 1      p <2e-16 
## 
## Pearson's Chi-squared test with Yates' continuity correction 
## ------------------------------------------------------------
## Chi^2 = 3707.321      d.f. = 1      p <2e-16 
##         Minimum expected frequency: 17961

Al final de la tabla se observan los valores de la prueba de independencia de chi-cuadrada simple así como la misma prueba con el ajuste de Yate’s. En ambas se presentan los valores del estadístico de prueba chi-cuadrado, los grados de libertad correspondientes para la tabla cruzada así como el p-value correspondiente.

4. Ejercicio

  1. Transformar dos variables de intervalo a tipo “factor”.
  2. Realizar una tabla de contingencia e identificar las probabilidades condicionadas entre dichas variables.
  3. Graficar la relación entre las variables categóricas.
  4. Realizar una prueba de independencia entre las variables.
  5. Interpretar el resultado de la prueba de independencia.