Bootstrap

Inferencia Causal

Irvin Rojas

Centro de Investigación y Docencia Económicas
Maestría en Economía

Bootstrap

Introducción a bootstrap

  • A veces es difícil encontrar una expresión analítica de los errores estándar

  • La idea de las técnicas bootstrap es construir una distribución empírica del estimador de interés

  • Una muestra bootstrap es una muestra de tamaño \(N\) tomada de la muestra original

  • En las rutinas para errores bootstrap, pensamos en \(\{(y_1,x_1),\ldots,(y_N,x_N)\}\) como la población

  • El procedimiento bootstrap más usado es el bootstrap no paramétrico o bootstrap en parejas (nos enfocaremos en este tipo de bootstrap en el curso)

  • La idea es remuestrear la pareja completa \(W_i=(y_i,x_i)\)

Algoritmo para errores estándar bootstrap

  1. Dada una muestra \(W_1,\ldots,W_N\), obtener una muestra de tamaño \(N\), remuestreando de la muestra original con reemplazo

  2. Calcular el estadístico \(\hat{\theta}_b\) usando la muestra bootstrap (coeficiente de regresión, diferencia de medias, función de coeficientes)

  3. Repetir los pasos 1 y 2 \(B\) veces, donde \(B\) es lo suficientemente grande (usualmente 1000 es suficiente)

  4. Usar las \(B\) repeticiones para obtener el error estándar del estadístico como la raíz cuadrada de \(s^2_{\hat{\theta},B}\):

\[s^2_{\hat{\theta},B}=\frac{1}{B-1}\sum_{b=1}^B(\hat{\theta}_{b}-\bar{\hat{\theta}})^2\] donde \(\bar{\hat{\theta}}=\frac{1}{B}\sum_{b=1}^B\hat{\theta}_b\)

¿Cómo hacer remuestreo en R?

set.seed(927)

data.morocco<- read.csv("./crepon_morocco_analysis.csv")%>%
  select(treatment,client,expense_total )

obs <- nrow(data.morocco)
obs
[1] 4934
#En la muestra original
mean(data.morocco$expense_total)
[1] 23294.83

¿Cómo hacer remuestreo en R?

#Una muestra bootstrap
data.b <-data.morocco[sample(nrow(data.morocco),obs, replace = TRUE),]

mean(data.b$expense_total)
[1] 24995.96
#Otra muestra bootstrap
data.b <-data.morocco[sample(nrow(data.morocco),obs, replace = TRUE),]

mean(data.b$expense_total)
[1] 25587.57

Aplicaciones comunes de bootstrap

  • Métodos de varias etapas (por ejemplo, el estimador de dos etapas de Heckman)

  • Funciones de estimadores (aunque aquí el método Delta también podría ser usado)

  • Datos agrupados con pocos grupos (wild cluster bootstrap)

  • El consejo práctico es usar resultados teóricos cuando se puede (por ejemplo, las matrices robustas descritas antes)

  • Pensemos siempre en la estructura de los datos antes de hacer bootstrap

  • Usar una semilla siempre para poder reproducir sus resultados

Bootstrap salvaje

  • En presencia de heterocedasticidad se prefiere usar bootstrap salvaje (wild bootstrap) (MacKinnon, 2012)

  • Propuesto originalmente por Liu (1988), cada muestra bootstrap tiene la siguiente forma:

\[y_i^*=X_i'\hat{\beta}+f(\hat{u}_i)v_i^*\] - Noten que mantiene fijos los \(X_i\) en cada muestra bootstrap

  • Una especificación comúnmente usada es hacer \(f(\hat{u}_i)=\hat{u}_i\) y \[v_i^*=\begin{cases} 1 \quad\text{con probabilidad 0.5} \\ -1 \quad\text{con probabilidad 0.5} \end{cases}\]

  • \(\hat{\beta}\) y \(\hat{u}_i\) son estimados con la muestra original

Bootstrap salvaje

  • En cada una de las \(B\) muestras bootstrap, mantenemos a los mismos individuos (no hay remuestreo)

  • Tendremos \(B\) muestras bootstrap, pero ahora la aleatoriedad viene por \(f(\hat{u}_i)v_i^*\)

  • Pueden usarse otras funciones más complicadas para \(f(\hat{u}_i)\)

  • La ventaja de este método es que conserva la relación entre las varianzas residuales y las \(X_i\) observadas en los datos originales

  • Davidson & Flachaire (2008) utilizan simulaciones para mostrar que con esta forma para \(f(\hat{u}_i)v_i^*\) la inferencia es más confiable que con otras especificaciones

Refinamiento asintótico

  • Una aplicación de las técnicas bootstrap es el refinamiento asintótico de la prueba \(t\) de coeficientes de regresión

  • Supongamos que \(H_0:\quad\beta=\beta^0\) y trabajamos con un nivel \(\alpha\)

  • El estadístico de la muestra original es el de siempre:

\[t=\frac{\hat{\beta}-\beta^0}{se(\hat{\beta})}\]

  • En cada repetición bootstrap calculamos ese mismo estadístico, pero centrado en \(\hat{\beta}\) y no en \(\beta^0\), porque dentro del mundo bootstrap el valor verdadero del parámetro es \(\hat{\beta}\):

\[t_b^*=\frac{\hat{\beta}_b^*-\hat{\beta}}{se(\hat{\beta}_b^*)}\]

Refinamiento asintótico

  • Ordenamos los \(B\) valores de \(|t_b^*|\)

  • Rechazamos \(H_0\) si \(|t|\) está por encima del \((1-\alpha)\)ésimo percentil de los \(|t_b^*|\) en la distribución bootstrap1

  • A pesar de sus propiedades teóricas, el refinamiento asintótico es poco usado

Bootstrap salvaje con refinamiento asintótico

  • Tres marcas conviven de aquí en adelante: \(\hat{\phantom{x}}\) para lo estimado con la muestra original sin restringir, \(\tilde{\phantom{x}}\) para lo estimado bajo \(H_0\), y \(^*\) para lo calculado dentro de una muestra bootstrap

  • Las dos ideas anteriores se combinan de forma natural: el bootstrap salvaje respeta la heterocedasticidad y el refinamiento mejora la aproximación de la prueba \(t\)

  • Pero hay una diferencia importante cuando el objetivo es contrastar una hipótesis y no solo calcular un error estándar: el proceso generador bootstrap debe imponer la nula

  • Para ello usamos los residuales del modelo restringido:

\[y_i^*=X_i'\tilde{\beta}+\tilde{u}_iv_i^*\] donde \(\tilde{\beta}\) y \(\tilde{u}_i\) se obtienen estimando el modelo bajo \(H_0\), no con la muestra libre

  • La razón es que el percentil con el que rechazamos debe venir de una distribución en la que \(H_0\) es cierta

  • Davidson & Flachaire (2008) muestran que esta versión, con residuales restringidos y pesos de Rademacher, es la que mejor se comporta en muestras finitas

Algoritmo del bootstrap salvaje restringido

Para contrastar \(H_0:\beta=\beta^0\):

  1. Estimar el modelo sin restringir y calcular \(t=\dfrac{\hat{\beta}-\beta^0}{se(\hat{\beta})}\)

  2. Estimar el modelo bajo \(H_0\) y guardar \(\tilde{\beta}\) y los residuales restringidos \(\tilde{u}_i\)

  3. Para cada \(b=1,\ldots,B\), generar \(y_i^*=X_i'\tilde{\beta}+\tilde{u}_iv_i^*\), con \(v_i^*\) de Rademacher

  4. Estimar sin restringir con \((y^*,X)\) y calcular \(t_b^*=\dfrac{\hat{\beta}_b^*-\beta^0}{se(\hat{\beta}_b^*)}\)

  5. Rechazar \(H_0\) si \(|t|\) supera el percentil \((1-\alpha)\) de los \(|t_b^*|\)

  • Comparación del paso 4 con la diapositiva del refinamiento: allá centrábamos en \(\hat{\beta}\) porque el valor verdadero del mundo bootstrap era \(\hat{\beta}\); aquí centramos en \(\beta^0\) porque el DGP ya impuso la nula

Wild cluster bootstrap

  • Con datos agrupados con pocos grupos, donde la CRVE subestima los errores estándar, Cameron, Gelbach y Miller (2008) proponen el wild cluster bootstrap

  • El peso aleatorio se asigna por grupo, no por individuo

\[y_{ig}^*=X_{ig}'\tilde{\beta}+\tilde{u}_{ig}v_g^*\]

  • Todas las observaciones del grupo \(g\) reciben el mismo signo \(v_g^*\), con lo que la muestra bootstrap conserva la correlación intragrupo que originó el problema

  • En cada repetición se estima con errores agrupados y se calcula \(t_b^*\)

  • Se rechaza con el percentil de los \(|t_b^*|\), igual que antes

Wild cluster bootstrap

  • Con \(G\) grupos solo existen \(2^G\) vectores de signos posibles, por lo que si \(G\) es pequeña conviene enumerarlos todos y el valor \(p\) solo puede tomar unos pocos valores distintos

  • Webb (2023) propone una distribución de seis puntos en lugar de Rademacher, precisamente para \(G\) pequeña

  • En R está implementado en boottest() del paquete fwildclusterboot. Sobre grupos de tamaños muy dispares, ver MacKinnon y Webb (2017)

Jackknife

  • Formalmente no es un método bootstrap

  • Una muestra jackknife es una muestra de tamaño \(N-1\) construida a partir de la muestra original donde una observación es eliminada a la vez

  • En cada muestra jackknife estimamos el estadístico de interés \(\hat{\theta}_{(j)}\) (tendremos \(N\) estadísticos)

  • El error estándar jackknife será

\[\hat{se}(\hat\theta)=\left(\frac{N-1}{N}\sum_{j=1}^N\left(\hat\theta_{(j)}-\bar\theta_{(\cdot)}\right)^2\right)^{1/2},\qquad \bar\theta_{(\cdot)}=\frac{1}{N}\sum_j\hat\theta_{(j)}\]

  • Funciona bien para estadísticos suaves y funciones lineales

  • Se puede hacer jackknife por bloques (Cameron y Miller, 2015)

Bootstrap

Inferencia Causal

CIDE · Maestría en Economía

© 2026 Irvin Rojas. Distribuido bajo licencia Creative Commons CC BY-NC-SA 4.0. Los materiales de terceros citados conservan sus propios derechos.