Análisis de datos, prueba de diferencia de medias (t-test) y prueba ANOVA (ANalysis Of VAriance)

Ejemplo practico a partir del artículo Civic Education, Political Discussion, and the Social Transmission of Democratic Knowledge and Values in a New Democracy: Kenya 2002. Finkel, S. E., & Smith, A. E. (2011)

Author

Gerardo Esteban, Gómez-Santiago

Published

September 8, 2024

Introducción

Dentro del análisis de datos, una de las tareas mas comunes e informativas es comparar los promedios de una variable cuantitativa entre distintos grupos. Este análisis, además de ser descriptivo, permite empezar a generar conjeturas acerca de la relación entre las variables e incluso, en algunos casos, puede ser suficiente para justificar un argumento o una hipótesis de investigación.
Cómo es usual en análisis de datos en ciencias sociales (también en casi todas las disciplinas cientificas, no solo las sociales), los datos disponibles se corresponden con muestras poblacionales que, si fueron seleccionadas de manera ALEATORIA, nos permiten hacer inferencias respecto al comportamiento o los valores parametricos de la población.

Los datos del artículo en el que se basa este tutorial, que buscan medir el efecto de la educación cívica en el comportamiento y la adopción de normas democráticas, son una muestra obtenida en Kenya entre 2001 y 2002, en el marco de las elecciones presidenciales celebradas en ese país durante 2002.

El objetivo de este tutorial es utilizar los principios de la inferencia estadística, presentes en la prueba de diferencia de medias y en la prueba ANOVA, para determinar si existen diferencias significativas en el promedio de una medida individual de Tolerancia Política, en función del número de clases o talleres de educación cívica recibidos.

Es importante aclarar que este tutorial no replica los resultados del estudio, el mismo hace uso de un método de inferencia causal conocido como efectos fijos (Fixxed Effects) cuyo tutorial se realizará más adelante (una explicación completa de este método se encuentra disponible en Breviarios Digitales: Estrategias de identificación - Laboratorio de Métodos Flacso). Sin embargo, los resultados obtenidos no son contradictorios con los obtenidos por (Finkel & Smith, 2011), siendo este un ejercicio introductorio que resulta útil para entender dicho estudio.

A continuación se presenta la contextualización del estudio, una breve explicación teórica de la estadística detras de las pruebas a realizar y el paso a paso del código en lenguaje R.

Contextualización del estudio

Los autores tienen interes en contrastar si la educación cívica y de manera mas específica si los talleres de educación cívica con metodologías de enseñanza participativa, tienen influencia sobre las actitudes, los valores y las orientaciones de participación en nuevas democracias.
Desde el punto de vista de la teoría política, este estudio discute con los aportes previos de (Almond et al., 1963) y (Lipset, 1959) que consideran que las conductas y los valores democraticos solo pueden construirse en el largo plazo.

Los autores, además de plantear que la educación civica tendría un efecto positivo sobre la tolerancia política, plantean que los individuos menos educados y con menor integración social van a experimentar un mayor efecto en el cambio de sus actitudes, valores y comportamientos.
En nuestro análisis nos centraremos solamente en la primera hipótesis, la cual podemos expresar formalmente como:

\frac{\partial Tolerancia \hspace{0.1cm} Política}{\partial Educación \hspace{0.1cm} Cívica} > 0

Con respecto al contexto político del espacio donde se realizó el estudio, es importante destacar que los talleres de educación cívica enmarcados en el National Civic Education Program (NCEP), se realizarón en la prevía de las primeras elecciones libres y competitivas por la presidencia de Kenya.
La salida del poder de Daniel Arap Moi, quien era el presidente desde 1978, enfrentaba a Mwai Kibaki, opositor en representación de la Coalición Nacional del Arco Iris (NARC party) con Uhuru Kenyatta, quien hacia parte de la Unión Nacional Africana de Kenya (KANU por sus siglas en ingles), partido que gobernaba al país desde su independencia en 1963.
Si bien la ausencia de comportamientos democráticos no puede atribuirse a un factor único, una de las condiciones que (Finkel & Smith, 2011) presentan como relevante al respecto, es la prevalencia en la ciudadania de su identificación tribal por sobre la identificación nacional, lo que conduce a una constante tensión y amenaza de guerra civil, observable en la ausencia de Tolerancia Política.

Entre fines de 2001 y diciembre de 2002 cuando se realizáron las elecciones, se llevaron adelante mas de 50,000 talleres de educación cívica con cerca de 4.5 millones de participantes.
Para el estudio se seleccionaron aleatoriamente 2,601 individuos que fueron encuestados antes y despues de los talleres, estos se dividieron entre tratados (asistieron al menos a un taller) y no tratados (nunca asistieron a talleres) buscando un emparejamiento de los grupos en variables sociodemográficas como edad, genero, etnia, nivel educativo y vecindario.

Teniendo en cuenta que el objetivo del tutorial es ver la diferencia en la tolerancia política en función del número de talleres educativos tomados, trabajaremos solamente con las encuestas post-tratamiento, realizadas tanto a los que asistieron a algún taller (grupo de tratamiento) como a los que no asistieron a ninguno (grupo de control).

Teoría estadistica

Tanto en el análisis de diferencia de medias como en el análisis de varianza (en adelante ANOVA), lo subyacente es una prueba de hipótesis sobre el valor de los promedios. Ambos hacen uso de los principios de la inferencia estadistica para establecer bajo cierto nivel de confianza (1 - \alpha), si existe diferencia en las medias poblacionales (\mu_i) de la variable de interes, a partir de los valores muestrales obtenidos (\bar{X}_i).

La diferencia entre uno y otro solamente es el alcance, mientras la diferencia de medias permite hacer comparaciones solamente entre dos grupos, la prueba ANOVA permite hacer comparaciones entre k grupos, siendo k mayor o igual a 2.

En función de lo anterior, es esencial entender la lógica subyacente a la prueba de hipótesis, antes de pasar a las estimaciones en el lenguaje de programación R.

Prueba de hipótesis

Cuando se estima el valor de un parametro a partir de un conjunto de datos muestrales, una manera de tener mayor certeza sobre el verdadero valor del parametro es a partir de la construcción de intervalos de confianza, los cuales nos aseguran con un alto grado de probabilidad (1 - \alpha), que el verdadero valor del parametro se encuentra contenido entre dos límites.

Hago referencia a los intervalos de confianza porque la lógica subyacente a la prueba de hipótesis, no es otra cosa que verificar si un valor hipótetico que llamaremos \mu_0, se encuentra contenido dentro de esos intervalos.
Ampliando el argumento de los intervalos de confianza a la comparación entre dos valores muestrales, como puede ser la media de un grupo A (\bar{X}_a) y la media de un grupo B (\bar{X}_b), lo que determina que \mu_a \neq \mu_b es que el intervalo de confianza de \bar{X}_a no coincida con el intervalo de confianza de \bar{X}_b. Este ultimo argumento puede extenderse a k grupos, dando lugar a una regla mas general y muy simple a partir de los intervalos de confianza.

Siempre que los intervalos de confianza de la media muestral entre dos o más grupos coincidan, no puede asegurarse que existe diferencia en la media poblacional de esos grupos.

Un ejemplo gráfico puede aclarar la idea, en el siguiente gráfico se observa que los intervalos al 95\% de confianza de la media de A y B no coinciden en ningún punto, por lo tanto, podemos afirmar que la media de A y la media de B son significativamente diferentes.

Ahora agreguemos las mediciones de un tercer grupo con nombre C, vemos que si bien tiene un valor promedio algo superior al de A, sus intervalos de confianza coinciden. Por lo tanto, podemos afirmar que las medias de A y C son significativamente diferentes a la media de B, pero que no existe una diferencia significativa entre A y C.

Esta es una manera sencilla de ver que es lo que subyace tanto al test de diferencia de medias como a la prueba ANOVA, ambos pueden ser entendidos desde los intervalos de confianza de las medias de los grupos.

Ahora bien, siendo un poco mas rigurosos, tanto en la prueba de diferencia de medias como en la prueba ANOVA, lo que hacemos es obtener un test estadístico que se compara con una distribución de probabilidad teórica, la cual tiene definidas zonas de aceptación y rechazo de la hipótesis nula.
En el caso de la diferencia de medias la distribución teórica es la t-Student, mientras que en la prueba ANOVA es la F de Fisher-Snedecor. En ambos casos, el valor del test estadístico obtenido se ubica dentro de su respectiva distribución teórica, determinando si se encuentra en una zona de aceptación o rechazo de la hipótesis nula (criterio del valor crítico).

A continuación se presenta una muestra gráfica de esto ultimo, en el gráfico se observa la distribución t-Student con 1000 grados de libertad. En una prueba de hipótesis de diferencia de medias de dos colas1, las zonas azul claro son definidas como zonas de rechazo de la hipótesis nula, por lo tanto, si el valor del test estadistico obtenido se ubica en alguna de esas zonas (es mayor a 1.96 o menor a -1.96) entonces se rechaza la hipótesis nula de igualdad de medias y podemos afirmar que existe una diferencia significativa entre la media de los grupos.2

El valor del test estadistico no solo sirve para determinar si se cae en una zona de aceptación o rechazo de la hipótesis nula, tambien sirve para calcular el P-Valor, que se define como la probabilidad de que cierto valor se observe dado que la hipótesis nula es cierta. Siempre que el p-valor sea menor al nivel de significancia (\alpha), se rechaza la hipótesis nula.
El nivel de significancia se define como el complemento del nivel de confianza, es decir, si nuestro nivel de confianza es del 95\%, el nivel de significancia es del 5\% o del 0.05. Por lo tanto, si el p-valor es menor al 0.05, se rechaza la hipótesis nula de que las medias son iguales.

Una vez que se entendio en terminos generales que es lo que subyace a la prueba de hipótesis, la expresión formal de la prueba de igualdad de medias entre dos poblaciones (test de diferencia de medias) y entre dos o mas poblaciones (test ANOVA) es:

Tipo de prueba Hipótesis Nula Hipótesis Alternativa
Test diferencia de medias H_0:\mu_a = \mu_b H_1:\mu_a \neq \mu_b
Test ANOVA H_0:\mu_a = \mu_b = \hspace{0.1cm} ... \hspace{0.1cm} = \mu_k H_1: al menos las medias de dos poblaciones son diferentes

Algo a destacar de la prueba de hipótesis es que siempre se plantea una hipótesis nula y una hipótesis alternativa, las cuales deben ser complementarias y completas respecto a las comparaciones posibles entre las medias.3

Una explicación adicional de la prueba ANOVA

Ya dijimos que la prueba de diferencia de medias, tambien conocida como t-test, solo permite la comparación entre dos grupos y que la ANOVA permite la comparación entre 2 o más grupos. Pero, ¿Por qué si se comparan las medias se llama Análisis de Varianza?
Porque lo que hace la prueba ANOVA es comparar la varianza entre grupos con la varianza al interior de los grupos, si la varianza entre grupos es mayor a la varianza al interior de los grupos, se genera evidencia significativa de que las medias de los grupos son diferentes.

Una muestra gráfica de esto se presenta a continuación, en el gráfico de la izquierda la evidencia en contra de la hipótesis nula de que las medias son iguales, es significativamente mayor a la del gráfico de la derecha.

Formulas de los estadisticos t y F

Si bien lo mas relevante en terminos conceptuales es entender de que se trata cada prueba y eso no siempre se consigue con las formulas matemáticas, es importante conocer las formulas de los estadisticos t y F para la realización de estas pruebas de hipótesis.

Estadístico t-Student

t = \frac{(\mu_A - \mu_B) - 0}{\sqrt{\frac{S^2_A}{n_A} + \frac{S^2_B}{n_B}}}

El estadístico t-Student es igual a la diferencia de las medias dividido entre el error estandar

Estadistico F

F = \frac{\frac{\sum_{i=1}^{k}n_i(\bar{X}_i-\bar{X})^2}{k-1}}{\frac{\sum_{i=1}^{k}\sum_{j=1}^{n_i}(X_{ij} - \bar{X}_i)^2}{N-k}}

Siendo k el número de grupos, N el número total de observaciones y n_i el número de observaciónes en el grupo i.

El estadístico F es igual a la varianza estimada entre grupos, dividido por la varianza estimada al interior de los grupos

Proceso de elaboración de la prueba de hipótesis

Si bien desde un punto de vista puramente práctico la prueba de hipótesis de diferencia de medias y la prueba anova pueden llevarse a cabo en una sola linea de codigo, hay un conjunto de criterios a establecer e informar que se presentan en los siguientes cuatro pasos.

  1. Establecimiento de la hipótesis: Lo primero que debemos hacer es plantear nuestra hipótesis en terminos de hipótesis nula (H_0) e hipótesis alternativa (H_1), estas hipótesis deben ser complementarias y completas respecto a los resultados posibles.
  2. Establecimiento del nivel de significancia: Esto tambien se conoce como determinación de la probabilidad del error tipo I. Los valores más utilizados de \alpha son 0.05 (95\% de confianza), 0.01 (99\% de confianza) y 0.1 (90\% de confianza).
  3. Construcción del test estadistico: Esto lo hace de manera automática la función del software, sin embargo, no esta de más hacer explicito el calculo subyacente bien sea una diferencia de medias o una prueba anova.
  4. Determinación de aceptación o rechazo: Hay tres criterios para determinar si se acepta o se rechaza la hipótesis nula.
    • Comparación del test estadistico con el valor crítico: el valor obtenido en 3 se compara con un valor crítico de la distribución t-Student o la distribución F según corresponda.
    • P-Valor: obtenido el p-valor del test, se acepta o se rechaza la hipótesis nula dependiendo de si es mayor o menor al nivel de significancia \alpha.
    • Intervalos de confianza: En el caso particular de las medias es posible utilizar los intervalos de confianza de dos maneras. La primera es calcular el intervalo de confianza de la diferencia de medias, si dentro de estos intervalos de confianza esta contenido el cero, entonces se acepta la hipotesis nula. La segunda es calculando los intervalos de confianza para cada una de las medias de manera independiente, si existe un solapamiento entre los intervalos de confianza de los grupos analizados, entonces se acepta la hipótesis nula.

Cualquiera de los tres criterios utilizados debe conducir a la misma conclusión respecto a la aceptación o rechazo de la hipótesis nula.

Es importante resaltar que los resultados a los que llegamos una vez realizados los 4 pasos anteriores, nos informan sobre parametros poblacionales siempre que la muestra halla sido seleccionada de manera aleatoria. Es el principal aporte de la inferencia estadistica, conocer la tendencia o prevalencia de ciertos aspectos poblacionales a partir del estudio de un subconjunto de la población definida como muestra.

Procesamiento de los datos

A partir de los alcances de cada uno de los métodos, vamos a evaluar dos cosas. La primera, verificar si tomar al menos un taller, genera una diferencia significativa en el promedio de tolerancia política (comparar dos grupos con t.test). La segunda, verificar si existen diferencias significativas en el promedio de tolerancia política entre no tomar talleres, tomar 1, 2, 3 y 4 o más (comparar cinco grupos con anova). El procesamiento de los datos para realizar dichas pruebas de hipótesis, se presenta a continuación.

Cargar la base

Para cargar la base de datos con nombre “EF.dta”, debemos hacer uso de los paquetes ‘foreign’ o ‘haven’, los cuales permiten cargar archivos .dta. Además, debemos asegurarnos de que la base de datos se encuentre guardada en nuestro directorio de trabajo, el cual podemos consultar con la función ‘getwd()’

rm(list = ls()) # Limpiamos el ambiente (borramos todos los objetos pre-existentes)

# getwd() para verificar cual es nuestro directorio de trabajo y asegurarnos que la base se encuentre ahí
# setwd() en caso de querer cambiar nuestro directorio de trabajo

library(haven) # Paquete para poder cargar archivos .dta

Cargare la base de datos con el nombre ‘base’

base <- read_dta("EF.dta")

Exploración de la base

Antes de iniciar los análisis, siempre es conveniente hacer una exploración general de los datos, para verificar que se cargaron correctamente y que no hay ningún error en los mismos. Los comandos que yo suelo usar para ello son ‘glimpse()’ del paquete dplyr y ‘summary()’ que ya viene cargado por defecto en el R.

library(dplyr) # Activamos el paquete dplyr

base %>% glimpse() # Nos muestra los primeros valores y el tipo de cada variable
Rows: 4,602
Columns: 10
$ id         <dbl> 10101, 10101, 10103, 10103, 10104, 10104, 10105, 10105, 101…
$ waveint    <dbl> 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,…
$ tol_w      <dbl> 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 4.00, 4.00, 1.50, 2.25,…
$ multce_w   <dbl> 0, 3, 0, 3, 0, 1, 0, 1, 0, 1, 0, 3, 0, 4, 0, 0, 0, 1, 0, 1,…
$ med_rcdw   <dbl> 0.6666667, 0.6666667, 0.5000000, 0.5000000, 0.3333333, 0.66…
$ int_rcdw   <dbl> 1.00, 1.00, 0.50, 1.00, 1.00, 1.00, 0.75, 1.00, 0.50, 1.00,…
$ group_rcdw <dbl> 0.36363637, 0.27272728, 0.54545456, 0.27272728, 0.27272728,…
$ polpart1_w <dbl+lbl> 1, 3, 3, 3, 1, 3, 2, 3, 1, 2, 3, 3, 1, 3, 3, 3, 3, 3, 2…
$ wave22     <dbl> 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,…
$ wave33     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
summary(base) # Hace un resumen estadistico de cada variable
       id           waveint        tol_w          multce_w     
 Min.   :10101   Min.   :0.0   Min.   :1.000   Min.   :0.0000  
 1st Qu.:22437   1st Qu.:0.0   1st Qu.:1.000   1st Qu.:0.0000  
 Median :33352   Median :0.5   Median :1.500   Median :0.0000  
 Mean   :39136   Mean   :0.5   Mean   :1.942   Mean   :0.5856  
 3rd Qu.:51474   3rd Qu.:1.0   3rd Qu.:2.500   3rd Qu.:1.0000  
 Max.   :73280   Max.   :1.0   Max.   :4.000   Max.   :4.0000  
                               NA's   :7                       
    med_rcdw         int_rcdw        group_rcdw       polpart1_w   
 Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :1.000  
 1st Qu.:0.5000   1st Qu.:0.7500   1st Qu.:0.1818   1st Qu.:3.000  
 Median :0.6667   Median :1.0000   Median :0.3636   Median :3.000  
 Mean   :0.6030   Mean   :0.8129   Mean   :0.3714   Mean   :2.662  
 3rd Qu.:0.8333   3rd Qu.:1.0000   3rd Qu.:0.5455   3rd Qu.:3.000  
 Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :3.000  
                  NA's   :9                                        
     wave22           wave33      
 Min.   :0.0000   Min.   :0.0000  
 1st Qu.:0.0000   1st Qu.:0.0000  
 Median :0.0000   Median :0.0000  
 Mean   :0.3883   Mean   :0.1117  
 3rd Qu.:1.0000   3rd Qu.:0.0000  
 Max.   :1.0000   Max.   :1.0000  
                                  
# Otras funciones que sirven para hacer esta primera exploración son

# View() la cual despliega la base como una hoja de excel en una pestaña nueva
# head() muestra las primeros 10 observaciones de cada variable
# tail() muestra las ultimas 10 observaciones de cada variable

Identificación de las variables de interes

La base cuenta con 10 variables y 4,602 observaciones, como mencionamos en la contextualización del estudio, esta investigación es un trabajo longitudinal en el que se realizaron encuestas a las mismas personas antes y despues de los talleres de educación cívica. Este tipo de datos conocidos como panel de datos, son muy utilizados en la aplicación de metodologías de inferencía causal, para los fines de nuestro análisis, tomaremos solamente las encuestas despues de la aplicación de los talleres, las cuales se identifican con el valor de 1 en la variable waveint.
Para ello creamos una nueva base con nombre basePost la cual contiene las mismas 10 variables de la base original, pero filtrada por la condición lógica waveint == 1.4

# Filtrado de la base según el valor de waveint

basePost <- base[base$waveint == 1, ] # Alternativa en R base

basePost <- base %>%                  # Alternativa con Tidyverse
  filter(waveint == 1)

La variable que define la cantidad de talleres que tomo cada individuo es multce_w y la variable de tolerancia política esta etiquetada como tol_w.

En el caso de tol_w se trata de una variable continua entre 1 y 4, la cual fue construida a partir de la respuesta a 4 preguntas, siendo 1 poco tolerante y 4 muy tolerante.5
A continuación se muestra la distribución de la variable tol_w a partir de su histograma y su función de densidad, la variable muestra un sesgo a la derecha, dando cuenta de que aún despues de los talleres cívicos, en general hay una mayor prevalencia de baja tolerancia política.

# Opcion grafica de R base

hist(basePost$tol_w) 

# Opción grafica con el paquete ggplot2 

library(ggplot2)

basePost %>% 
  ggplot() +
  geom_histogram(mapping = aes(x = tol_w, y = after_stat(density)),
                 bins = 15, 
                 color = "white") +
  geom_density(mapping = aes(x = tol_w),
               color = "darkblue",
               fill = "blue",
               alpha = 0.3) +
  labs(title = "Distribución de la variable Tolerancia Política",
       y = "Densidad",
       x = "Tolerancia Política")

# Ante la advertencia de 2 observaciones con NA, eliminamos las observaciones
# con NA en la variable dependiente.

basePost <- basePost[!is.na(basePost$tol_w), ]

La variable multce_w, si bien esta almacenada en nuestra base de datos como una variable continua, es una variable categórica ordinal, cuyos valores posibles se corresponden con el número de talleres tomados entre 0 y 4. Con ello en mente, es necesario transformar esta variable de continua a categorica con la función ‘factor()’.

En el siguiente chunk de código transformamos la variable multce_w en categorica ordinal y vemos graficamente como se distribuye la misma.

# Alternativa en R base

basePost$multce_w <- factor(basePost$multce_w, 
                            levels = c(0,1,2,3,4), 
                            labels = c("0","1","2","3","4 o más"))


# Alternativa con dplyr

# basePost <- basePost %>%
#   mutate(multce_w = factor(multce_w,
#                            levels = c(0,1,2,3,4),
#                            labels = c("0","1","2","3","4 o más")))


## Gráfico con ggplot2

# Generamos una base de datos que almacene el número 
# de observaciones en cada grupo

etiquetas <- basePost %>% 
  group_by(multce_w) %>%  
  tally()

# Almacenamos una escala de color utilizando el paquete RColorBrewer 

coloresBarras <- RColorBrewer::brewer.pal(5,       # Número de colores
                                          "Blues") # las paletas disponibles pueden consultarse en https://r-graph-gallery.com/38-rcolorbrewers-palettes.html

# Código del gráfico

basePost %>% 
  ggplot() +
  geom_bar(mapping = aes(x = multce_w),
           fill = coloresBarras,
           color = "darkblue") +
  geom_text(data = etiquetas, 
            mapping = aes(x = multce_w, 
                          y = n + 30, 
                          label = n)) +
  labs(title = "Distribución de asistentes a cantidad de talleres",
       y = "Asistentes",
       x = "Número de talleres") +
  theme_bw()

Algo relevante de la anterior gráfica al momento de pensar en el test de diferencia de medias, es que el tamaño de la muestra incide en el error estandar, la relación entre tamaño de muestra y error estandar es inversa, de manera que, al construir los intervalos de confianza de la media de tolerancia política para cada grupo, se esperaría que, manteniendo constante todo lo demas, la amplitud del intervalo de confianza para las categorías 2, 3 y 4 o más, sea significativamente mayor a la amplitud del intervalo de las categorías 0 y 1.

Habiendo hecho un análisis exploratorio de las variables de interes, vamos a proceder a la corroboración de la hipótesis de diferencia de medias.

Corroboración de hipótesis t.test

Una de las limitaciones que enfrentamos al momento de realizar la prueba de hipótesis de diferencia de medias, es que esta diseñada para hacer comparaciones entre dos grupos y nuestra variable categórica multce_w tiene cinco, lo ideal en ese caso seria utilizar una prueba ANOVA, pero para entender bien la ANOVA primero hay que entender bien la diferencia de medias. En función de ello, vamos a reagrupar nuestra variable categórica en tratados y no tratados con la siguiente condición lógica.

Si multce_w es igual a cero (multce\_w == 0), entonces es No Tratado.
Si multce_w es mayor o igual a uno (multce\_w >= 1), entonces es Tratado

Reagrupación de variable

En este chunck vemos el código para generar la variable agrupada nombrada tratamiento y una gráfica de barras que muestra la distribución de la misma

# Código de agrupación de variable

basePost$tratamiento <- factor(
  case_when(
  basePost$multce_w == "0" ~ "No Tratado",
  basePost$multce_w != "0" ~ "Tratado"),
  levels = c("No Tratado",
             "Tratado"),
  labels = c("No Tratado",
             "Tratado")) 

## Gráfico con ggplot2

# Almacenamos las etiquetas del número de observaciones en una base de datos

etiquetas2 <- basePost %>% 
  group_by(tratamiento) %>% 
  tally()

# Código del gráfico

basePost %>% 
  ggplot() +
  geom_bar(mapping = aes(x = tratamiento, fill = tratamiento),
           show.legend = F) +
  geom_text(data = etiquetas2,
            mapping = aes(x = tratamiento, 
                          y = n + 50,
                          label = n)) +
  scale_fill_manual(values = c("darkblue", "darkgreen")) +
  labs(x = "Tratamiento",
       y = "Número de casos")

Habiendo creado la variable tratamiento, la cual contiene solo 2 categorias, ya podemos hacer uso de la función ‘t.test()’

Los argumentos de la función ‘t.test()’ para la diferencia de medias son:

  • formula la cual contiene una variable cuantitativa y una variable categorica con solamente dos niveles o valores posibles (indispensable).
  • data la base de datos donde estan las variables analizadas (indispensable).
  • alternative en este argumento especificamos el tipo de hipótesis a realizar, los valores posibles son “two.side” (igualdad de medias), “less” (media grupo 1 menor que media gurpo 2) y “greater” (media grupo 1 mayor que grupo 2).

El argumento alternative no es indispensable especificarlo, la función tiene el valor “two.side” por defecto, que en este caso especifico, simbolizando con (t) a los tratados y con (nt) a los no tratados, la hipótesis nula (H_0) y alternativa (H_1) serian:

  • H_0 : \mu_{nt} - \mu_{t} = 0
  • H_1 : \mu_{nt} - \mu_{t} \neq 0

Donde \mu simboliza la media poblacional de la variable cuantitativa tolerancia política.

Los productos de la función ‘t.test()’ son el p-Valor de la prueba, el valor del test estadístico y el intervalo de confianza de la diferencia de medias. Por lo que una vez utilizada, es posible determinar la significatividad de la diferencia de medias por cualquiera de los tres criterios.

t.test(formula = tol_w ~ tratamiento,   # formula, siempre se especifica "var. cuantitativa ~ var. categorica"
       data = basePost,                 # data, base de datos que contiene las variables
       alternative = "two.side")        # alternative, es una buena practica hacer explicita la hipótesis

    Welch Two Sample t-test

data:  tol_w by tratamiento
t = -4.4296, df = 1842.4, p-value = 9.993e-06
alternative hypothesis: true difference in means between group No Tratado and group Tratado is not equal to 0
95 percent confidence interval:
 -0.2778006 -0.1072964
sample estimates:
mean in group No Tratado    mean in group Tratado 
                1.789095                 1.981643 
Aplicación de criterios

Como ya se mencionó, los criterios deben conducir a la misma conclusión respecto a la aceptación o rechazo de la hipótesis nula, empecemos por el más intuitivo, el P-Valor.

Este se encuentra en la parte superior derecha y tiene un valor de 9.993 \cdot 10^{-6}, en notación decimal su valor es de 0.000009934. Esa es la probabilidad de que la media de los no tratados menos la media de los tratados sea igual a -0.19 (estimador puntual de la diferencia de medias), dado que la hipótesis nula es verdadera.
Como esa probabilidad es menor al nivel de significancia (0.05) entonces rechazamos la hipótesis nula y podemos afirmar que:

Existe una diferencia significativa en el nivel de tolerancia política entre quienes nunca asistieron a un taller de educación cívica y quienes asistieron al menos a un taller.

Para hacer uso de la comparación del test estadístico con el valor crítico, tomamos el valor estadístico de la prueba que se encuentra en la parte superior izquierda (t = -4.4296398) y lo comparamos con los límites de aceptación o rechazo de la hipótesis nula según la distribución teórica t-Student para ciertos grados de libertad.
La distribución t-Student tiende a una distribución normal en la medida en que crecen los grados de libertad, por lo que con muestras lo suficientemente grandes, es relativamente valido tomar como valores críticos los valores de la distribución normal \lvert 1.96 \rvert para un nivel de confianza del 95\%. Sin embargo, una de las ventajas de utilizar un software estadístico esta en tener mayor precisión. Teniendo en cuenta la formula de grados de libertad para la prueba de diferencia de medias con varianzas desconocidas y diferentes (Heumann & Shalabh, 2016).6

v = \frac{\left( \frac{s_{x}^{2}}{n_{x}} + \frac{s_{y}^{2}}{n_{y}} \right)}{\frac{(s_{x}^{2}/n_{x})}{n_{x} - 1} + \frac{(s_{y}^{2}/n_{y})}{n_{y} - 1}}

En el siguiente chunk de código se muestra la obtención de los grados de libertad (v) y del valor crítico de la distribución t-Student para una prueba de igualdad de medias con un nivel de confianza del 95\%

# Definimos y guardamos en un objeto los tamaños de muestra

n_x <- nrow(basePost[basePost$tratamiento == "No Tratado", ])
n_y <- nrow(basePost[basePost$tratamiento == "Tratado", ])

# Definimos y guardamos en un objeto las varianzas muestrales

s2_x <- var(basePost$tol_w[basePost$tratamiento == "No Tratado"], na.rm = T)
s2_y <- var(basePost$tol_w[basePost$tratamiento == "Tratado"], na.rm = T)

# Aplicamos la formula para establecer grados de libertad en diferencia de 
# medias con varianzas desconocidad y distintas

v <- (s2_x/n_x + s2_y/n_y)^2/((s2_x/n_x)^2/(n_x - 1) + (s2_y/n_y)^2/(n_y - 1))

# Con la función qt, obtenemos el valor teórico de la distribución t-Student
# para cierto nivel de confianza (argumento p) y ciertos grados de libertad 
# (argumento df)

qt(p = 0.025, df = v)
[1] -1.961252

Debido a que -4.4296398 es menor a -1.9612524, la prueba cae en una zona de rechazo de la hipótesis nula, pudiendo afirmar que las medias de tratados y no tratados, son significativamente diferentes.

Finalmente, la funcion ‘t.test()’ nos devuelve los intervalos de confianza de la diferencia de medias, del planteamiento formal de la hipótesis nula:

H_0: \mu_{nt} - \mu_{t} = 0

Es facil deducir que si los intervalos de confianza no contienen el cero (ambos intervalos son negativos o ambos intervalos son positivos), entonces se rechaza la hipótesis nula de igualdad de medias. En este caso puntual los intervalos son, Limite Inferior -0.2778006 y Limite Superior -0.1072964. Dando cuenta de que no solo las medias son diferentes, sino que además, la media de los no tratados (\mu_{nt}) es menor a la media de los tratados (\mu_{t}), apoyando la hipótesis planteada por (Finkel & Smith, 2011) sobre el efecto positivo de los talleres de educación cívica en la tolerancia política.

Para terminar con la prueba de igualdad de medias, en el siguiente bloque de código se presenta el calculo y se gráfican los intervalos de confianza del valor medio de tolerancia política en tratados y no tratados, como puede observarse no hay solapamiento en los intervalos de confianza, por lo que podemos afirmar que las medias son diferentes y que la media de los no tratados es menor a la media de los tratados.

# Calculo de los intervalos de confianza de tol_w para tratados y no tratados

IntervalosTol_w <- basePost %>% 
  group_by(tratamiento) %>%                       
  summarise(meanTol = mean(tol_w, na.rm = T),
            sdTol = sd(tol_w, na.rm = T),
            n = n(),
            quantile = qt(.975, df = n-1,),
            margenError = sdTol/sqrt(n)*quantile,
            Li = meanTol - margenError,
            Ls = meanTol + margenError) 

## Código del gráfico de los intervalos con ggplot2

IntervalosTol_w %>% 
  ggplot() +
  geom_errorbar(mapping = aes(x = tratamiento, 
                              y = meanTol, 
                              ymin = Li, 
                              ymax = Ls),
                width = 0.6) +
  geom_point(mapping = aes(x = tratamiento, 
                           y = meanTol)) +
  labs(title = "Intervalos de confianza de la media de Tolerancia Política",
       x = "Grupo",
       y = "Tolerancia Política") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))

## Intervalos de confianza de la diferencia de medias

IntervalosDif_Medias <- tibble(estimacionPuntual = prueba$estimate[1] - prueba$estimate[2],
                               limiteInferior = prueba$conf.int[1],
                               limiteSuperior = prueba$conf.int[2])

# Opción vertical

IntervalosDif_Medias %>% 
  ggplot() +
  geom_errorbar(mapping = aes(x = "Dif. Medias",
                              y = estimacionPuntual, 
                              ymin = limiteInferior, 
                              ymax = limiteSuperior),
                width = 0.6) +
  geom_point(mapping = aes(x = "Dif. Medias",
                           y = estimacionPuntual)) +
  geom_hline(mapping = aes(yintercept = 0), 
             color = "darkred",
             linetype = "dashed",
             linewidth = 1) +
   labs(title = "Intervalos de confianza de la diferencia de medias de Tolerancia Política\nentre Tratados y No Tratados",
       x = NULL,
       y = TeX('$\\bar{X}_{nt} - \\bar{X}_{t}$')) +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5)) 

# Opción Horizontal

IntervalosDif_Medias %>% 
  ggplot() +
  geom_errorbar(mapping = aes(x = "Dif. Medias",
                              y = estimacionPuntual, 
                              ymin = limiteInferior, 
                              ymax = limiteSuperior),
                width = 0.6) +
  geom_point(mapping = aes(x = "Dif. Medias",
                           y = estimacionPuntual)) +
  geom_hline(mapping = aes(yintercept = 0), 
             color = "darkred",
             linetype = "dashed",
             linewidth = 1) +
   labs(title = "Intervalos de confianza de la diferencia de medias de Tolerancia Política\nentre Tratados y No Tratados",
       x = NULL,
       y = TeX('$\\bar{X}_{nt} - \\bar{X}_{t}$')) +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_flip()

Prueba ANOVA

Aunque la prueba de diferencia de medias (t-test) es concluyente respecto al efecto positivo de los talleres de educación cívica en la tolerancia política, al agrupar los individuos que asistieron a al menos un taller en una sola categoría, perdemos información.
Es decir, la respuesta en la tolerancia política no necesariamente es la misma si se asiste a un taller, a dos talleres o a cuatro talleres, la mejor manera de tener en cuenta esa variabilidad en el tratamiento es a través del análisis de varianza o prueba ANOVA de un factor.7

En el software R la manera más sencilla de realizar este análisis es a través de una regresión lineal, tomando como variable dependiente a nuestra variable númerica tol_w y como variable independiente a nuestra variable categórica multce_w.
Existe cierta complejidad en la utilización de variables categóricas en los análisis de regresión, cuando la variable independiente es continua, obtenemos solo un coeficiente de regresión (\beta_1) que nos indica el cambio en la variable dependiente ante el cambio en una unidad de la variable independiente. En el caso de variables categóricas como multce_w, obtenemos k-1 coeficientes de regresión, siendo k el número de categorías posibles.
En nuestro ejemplo concreto multce_w tiene 5 categorías posibles, por lo que al realizar la regresión con esta variable categórica obtenemos 4 coeficientes de regresión (\beta_i).

¿Porque perdemos una categoría en el análisis? En realidad no perdemos ninguna categoría, los coeficientes obtenidos (\beta_i) reflejan el cambio en la variable dependiente ante un cambio en la variable independiente. Cuando nuestra variable independiente es categórica, se toma una de las categorías como referencia para calcular ese cambio, dicha categoría de referencia se refleja en el intercepto.

En este caso concreto, al realizar la regresión de tol_w en función de multce_w, se toma como categoría de referencia multce\_w = 0 (no haber tomado ningún taller de educación cívica), por lo que el intercepto refleja el promedio de la tolerancia política en el grupo que no tomo ningún taller. Los cuatro coeficientes de regresión restantes lo que muestran es la diferencia en el valor medio de la tolerancia política de sus categorías con respecto a la categoría de referencia. Formalmente:

Ahora bien, en algunas ocasiones lo que más nos interesa de los análisis de regresión no es el valor de los \hat{\beta}, sino su significatividad, la cual se puede determinar por el P-Valor. En este caso específico, que el coeficiente de regresión \hat{\beta}_i sea significativo, implica que la media de la tolerancia política de la categoría i tiene una diferencia significativa con respecto a la media de la tolerancia política de la categoría de referencia.

Ahora veamos el código para realizar este análisis:

# Calculamos la regresión de tolerancia política en función del número de talleres
# almacenandolo en el objeto 'reg'

reg <- lm(tol_w ~ multce_w, data = basePost)

summary(reg) # Comando para obtener el resumen de la regresión

Call:
lm(formula = tol_w ~ multce_w, data = basePost)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.2100 -0.8502 -0.3502  0.7109  2.2109 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)      1.78909    0.03604  49.648  < 2e-16 ***
multce_w1        0.06112    0.05037   1.213    0.225    
multce_w2        0.30841    0.07454   4.137 3.64e-05 ***
multce_w3        0.39007    0.07797   5.003 6.08e-07 ***
multce_w4 o más  0.42092    0.08590   4.900 1.02e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.026 on 2294 degrees of freedom
Multiple R-squared:  0.0223,    Adjusted R-squared:  0.0206 
F-statistic: 13.08 on 4 and 2294 DF,  p-value: 1.548e-10

En este tipo de análisis el intercepto va a ser siempre significativo, el valor del intercepto (1.7890947) corresponde a la media de la tolerancia política en individuos que nunca asistieron a algún taller de educación cívica. Respecto al resto de coeficientes, \hat{\beta}_1 no es significativo, esto quiere decir que no existen diferencias significativas en el valor medio de tolerancia política entre aquellos que nunca recibieron talleres civícos y los que recibieron solo 1. Que los otros coeficientes [\hat{\beta}_2,\hat{\beta}_3,\hat{\beta}_{4 \hspace{0.07cm} o \hspace{0.07cm} más}] sean significativos, implica que si existe una diferencia significativa entre el valor medio de tolerancia política de quienes recibieron 2, 3 y 4 o más talleres con respecto al valor medio de tolerancia política de quienes no recibieron ningún taller. Además, siguiendo las fórmulas presentadas para cada uno de los \beta_i, el hecho de que el valor de estos últimos sea positivo, implica que la tolerancia política en los grupos 2, 3 y 4 o más, es mayor a la tolerancia política del grupo de referencia (0 talleres), abonando a la hipótesis de los autores respecto al efecto positivo de la educación cívica sobre la tolerancia política.

Con este análisis ya tenemos información adicional respecto al comportamiento de la tolerancia política en función del número de talleres cívicos, sin embargo, nuestras conclusiones son con respecto a la categoría de referencia. Es decir, no podemos afirmar nada respecto a las diferencias en los valores medios de tolerancia política de quienes asistieron a 2 talleres con respecto a quienes asistieron a 4 o más.
Una alternativa para ello es hacer una prueba de diferencia de medias para estas dos categorías8, pero si quisiéramos comparar todas las categorías de manera simultánea, lo mejor es obtener los intervalos de confianza de las medias por categoría y verificar si existe o no solapamiento entre las mismas.

A continuación se presenta el código para calcular y graficar las medias y los intervalos de confianza de la tolerancia política según el número de talleres tomados.

Intervalos_grupos <- basePost %>% 
  group_by(multce_w) %>% 
  summarise(meanTol = mean(tol_w, na.rm = T),
            sdTol = sd(tol_w, na.rm = T),
            n = n(),
            quantile = qt(.975, df = n-1,),
            Li = meanTol - sdTol/sqrt(n)*quantile,
            Ls = meanTol + sdTol/sqrt(n)*quantile)


Intervalos_grupos %>% 
  ggplot() +
  geom_point(mapping = aes(x = multce_w, 
                           y = meanTol,
                           shape = multce_w),
             show.legend = F) +
  geom_errorbar(mapping = aes(x = multce_w, 
                              y = meanTol, 
                              ymin = Li, 
                              ymax = Ls),
                width = 0.5,
                show.legend = F) +
  labs(title = "Intervalos de confianza al 95% de la media de tolerancia política según el número\nde talleres cívicos tomados\n",
       subtitle = "Según estos valores se requieren al menos 2 talleres para que estos tengan un efecto significativo sobre la\ntolerancia política. Además, tomar más de 2 no genera ningún cambio significativo con respecto a aquellos\nque tomaron solamente 2.",
       x = "Número de talleres cívicos",
       y = "Media de tolerancia política") +
  theme(plot.subtitle = element_text(size = 9),
        plot.title = element_text(hjust = 0.5))

A partir del gráfico anterior podemos concluir que se requieren al menos dos talleres para que estos tengan un efecto positivo sobre la tolerancia política y que tomar más de dos no genera cambios significativos con respecto a aquellos que tomaron solamente 2.
Estas conclusiones coinciden con el análisis de regresión realizado anteriormente, en el cual veíamos que tomar un taller no generaba cambios significativos en la tolerancia política con respecto a no tomar ninguno, mientras que tomar 2, 3 y 4 o más si lo hacian.
Algo que vale la pena destacar del gráfico es la relación inversa entre la amplitud de los intervalos de confianza y el tamaño de la muestra, las categorías cero y uno cuentan con un tamaño de muestra significativamente mayor al del resto de categorías, dando lugar a una menor amplitud de los intervalos de confianza y por lo tanto mayor precisión en la estimación del parametro poblacional.

Aunque este análisis muestra que los talleres cívicos tienen un efecto positivo sobre la tolerancia política, no podemos hacer afirmaciones en terminos de inferencia causal, es decir, no podemos afirmar que la tolerancia política se incremento por los talleres cívicos.
En primer lugar nuestros resultados pueden estar sesgados por omitir variables relevantes, el sexo, el nivel educativo, la etnia de pertenencia o la edad, son variables que pueden incidir en la probabilidad de tomar talleres cívicos y en el grado de tolerancia política que se tenga.
Otro problema a atender es el sesgo de autoselección, es posible que un individuo con un nivel alto de tolerancia política sea más propenso a tomar talleres de educación cívica. Por suerte existen metodologías para lidiar con estos problemas y establecer la causalidad entre talleres cívicos y tolerancia política.

Muchas gracias por haber llegado hasta aquí.

References

Almond, G. A., Verba, S., et al. (1963). The civic culture: Political attitudes and democracy in five nations. Princeton university press Princeton, NJ.
Finkel, S. E., & Smith, A. E. (2011). Civic education, political discussion, and the social transmission of democratic knowledge and values in a new democracy: Kenya 2002. American Journal of Political Science, 55(2), 417–435.
Heumann, C., & Shalabh, M. S. (2016). Introduction to statistics and data analysis. Springer.
Lipset, S. M. (1959). Some social requisites of democracy: Economic development and political legitimacy1. American Political Science Review, 53(1), 69–105.

Footnotes

  1. La prueba de hipótesis de dos colas plantea como hipótesis nula que las medias de los dos grupos son iguales, en las pruebas de una cola se plantea que la media de un grupo es mayor o menor a la del otro grupo.↩︎

  2. La similitud de la distribución t-Student con la distribución normal es evidente, en la medida que el número de grados de libertad se incrementa, la distribución t-Student tiende a la normal.↩︎

  3. Por simplicidad, en este tutorial solo trabajaremos con la prueba de hipótesis de igualdad de medias, tambien conocida como prueba de dos colas. En pruebas de una cola, la completitud refiere a que si se tiene por hipótesis nula que la media de A es menor o igual a la media de B, entonces la hipótesis alternativa debe ser que la media de B es mayor a la media de A.↩︎

  4. Siempre que deseemos filtrar una base de datos, tiene que existir una condición lógica que evalue a cada observación y determine si cumple o no la prueba.↩︎

  5. ‘[…] Medimos la tolerancia política con cuatro preguntas estándar sobre si a los ateos y a las personas que quieren abolir las elecciones en favor de un gobierno militar se les debería permitir “hablar públicamente en su localidad” y “organizar una manifestación pacífica para expresar su punto de vista” […]’ Finkel y Smith 2011, pagina 7.↩︎

  6. Esta formula es para la prueba de hipótesis de diferencia de medias con varianzas desconocidas y diferentes, escenario en el cual se aplica el test de Welch.↩︎

  7. Por un factor nos referimos a que solamente se está teniendo en cuenta una variable de agrupación, en este caso el número de talleres de educación cívica recibidos. Si agregáramos el sexo como variable categórica para el análisis, estaríamos hablando de prueba ANOVA de dos factores.↩︎

  8. Este sería un buen ejercicio práctico, para reutilizar el código del t.test solo tendríamos que filtrar basePost, dejando solamente las categorías multce_w = 2 y multce_w = 4 o más y en la formula especificar tol_w ~ multce_w.↩︎