La base de datos consiste en un panel anual de cárceles estadounidenses observado entre 2008 y 2019. La unidad de análisis es la cárcel, identificada mediante el identificador único id, lo que permite seguir cada instalación a lo largo del tiempo. La información se encuentra organizada a nivel cárcel-año, por lo que cada observación corresponde a una cárcel específica en un año determinado.
La variable de resultado principal es la tasa anual de mortalidad. La carcel se cosidera tratada cuando utiliza un proveedor medico privado. Cuando una cárcel privatiza durante un año calendario, dicho año se codifica como tratado.
| Caracteristica | Valor |
|---|---|
| Observaciones totales | 6276 |
| Cárceles únicas | 523 |
| Estados | 45 |
| Periodo | 2008-2019 |
| treatment_path | N |
|---|---|
| always-treated | 230 |
| never-treated | 166 |
| switcher-clean | 98 |
| switcher-reverter | 27 |
| Concepto | N |
|---|---|
| Switcher-clean identificados | 98 |
| Excluidos por falta de variación útil en años con mortality rate observado | 2 |
| Switcher-clean finales | 96 |
| Caracteristica | Valor |
|---|---|
| Observaciones en muestra DiD | 1152 |
| Cárceles switcher-clean finales | 96 |
| Periodo | 2008-2019 |
| year | carceles_que_privatizan |
|---|---|
| 2009 | 6 |
| 2010 | 11 |
| 2011 | 7 |
| 2012 | 11 |
| 2013 | 10 |
| 2014 | 12 |
| 2015 | 8 |
| 2016 | 8 |
| 2017 | 12 |
| 2018 | 3 |
| 2019 | 8 |
Si solo observas 2008 y 2015, el grupo tratado debe ser el conjunto de cárceles switcher-clean que ya privatizaron a más tardar en 2015 (cohortes 2009–2015). Las cárceles que privatizan después de 2015 (2016–2019) todavía no están tratadas en 2015 y no deben entrar al grupo tratado. Como grupo control, lo más natural es usar las never-treated.
| did_group | media_mortalidad_2008 | media_mortalidad_2015 | n_carceles_2008 | n_carceles_2015 | diferencia |
|---|---|---|---|---|---|
| Control | 0.770 | 1.550 | 148 | 164 | 0.781 |
| Tratadas | 0.918 | 1.305 | 61 | 67 | 0.388 |
| Estimador | Valor |
|---|---|
| ATT DiD simple | -0.393 |
Entre 2008 y 2015, las cárceles que privatizaron su servicio de salud experimentaron una disminución relativa de aproximadamente 0.392 muertes por cada 1,000 internos respecto a la evolución observada en las cárceles que nunca privatizaron.
La especificación utiliza efectos fijos de cárcel y de año. Los efectos fijos de cárcel controlan por todas las características invariables en el tiempo de cada instalación, como tamaño, ubicación geográfica, infraestructura, calidad histórica de los servicios médicos y composición promedio de la población encarcelada. Los efectos fijos de año capturan shocks agregados que afectan simultáneamente a todas las cárceles entre 2008 y 2015. No incluyo efectos fijos de estado ni de FIPS porque estas variables son constantes dentro de cada cárcel y quedan completamente absorbidas por los efectos fijos de cárcel. Los errores estándar se agrupan a nivel cárcel, ya que el tratamiento se asigna a ese nivel y es razonable esperar correlación serial de los errores dentro de una misma instalación a través del tiempo. Esta estrategia sigue la lógica de identificación del artículo, que explota cambios dentro de la misma cárcel antes y después de la privatización.
| DiD 2008-2015 | |
|---|---|
| Errores estándar agrupados por cárcel entre paréntesis. | |
| Privatización del servicio médico | −0.507 |
| (0.375) | |
| Observaciones | 418 |
| R² | 0.570 |
| R² within | 0.007 |
La columna reporta una estimación DiD con efectos fijos de cárcel y año. El coeficiente de privatización es −0.507, lo que implica que, entre 2008 y 2015, las cárceles tratadas presentan una reducción relativa de aproximadamente 0.51 muertes por cada 1,000 internos respecto al grupo de comparación. No obstante, el efecto no es estadísticamente significativo, pues el error estándar agrupado por cárcel es 0.375. La falta de significancia estadística no parece deberse a una especificación incorrecta. Los efectos fijos de cárcel y año son apropiados dado el diseño DiD y los errores estándar agrupados por cárcel son consistentes con el nivel de asignación del tratamiento. Una explicación más plausible es la limitada potencia estadística del ejercicio. Al utilizar únicamente los años 2008 y 2015 se pierde gran parte de la variación temporal disponible en el panel y se agrupan cárceles con diferentes duraciones de exposición al tratamiento.
El principal problema identificado por la nueva literatura surge cuando se utilizan múltiples periodos y adopción escalonada del tratamiento, ya que unidades tratadas tempranamente pueden actuar como controles para unidades tratadas tardíamente. Esto puede generar ponderaciones negativas y hacer que el estimador TWFE no identifique un promedio causal interpretable cuando los efectos son heterogéneos en el tiempo.
Sin embargo, en este ejercicio únicamente observamos dos periodos (2008 y 2015) y definimos el grupo tratado como las cárceles que ya habían privatizado para 2015, mientras que el grupo de comparación está compuesto exclusivamente por cárceles never-treated. En consecuencia, no existe el problema de utilizar unidades ya tratadas como grupo de control para otras unidades tratadas.
Lo que sí ocurre es que el estimador recupera una combinación de efectos correspondientes a distintas cohortes de tratamiento (2009, 2010, …, 2015), observadas con diferentes duraciones de exposición al tratamiento. Por ello, el parámetro estimado debe interpretarse como un ATT promedio agregado y no como un efecto dinámico específico para una cohorte o duración determinada.
Por lo tanto, aunque sabemos que la privatización fue staggered, la estimación realizada sigue siendo válida como un DiD utilizando never-treated como grupo de control. La principal limitación no es el sesgo por ponderaciones negativas señalado por la nueva literatura, sino la pérdida de información sobre la heterogeneidad temporal de los efectos y sobre las diferencias entre cohortes de adopción. Si hubiera utilizado TWFE con todos los años del panel, entonces sí me preocuparía por los problemas documentados por la literatura. Pero al colapsar el análisis a una comparación 2008–2015 contra never-treated, el problema desaparece prácticamente.
## NOTES: 306 observations removed because of NA values (LHS: 245, RHS: 119).
## 1/0 fixed-effect singleton was removed (1 observation).
| DiD 2008-2015 | TWFE 2008-2019 | |
|---|---|---|
| Errores estándar agrupados por cárcel. | ||
| Privatización del servicio médico | −0.507 | −0.116 |
| (0.375) | (0.118) | |
| Observaciones | 418 | 5969 |
| R² | 0.570 | 0.201 |
| R² within | 0.007 | 0.000 |
Dado que la adopción es staggered, este estimador puede mezclar comparaciones entre cohortes tratadas tempranamente y tardíamente, por lo que no necesariamente identifica un ATT causal bien definido bajo heterogeneidad de efectos.
Los coeficientes previos al tratamiento permiten evaluar tendencias paralelas. Como los coeficientes pre-tratamiento son cercanos a cero y estadísticamente insignificantes, la evidencia es consistente con parallel trends. Los coeficientes posteriores al tratamiento muestran la evolución dinámica del efecto de la privatización sobre la mortalidad. Sin embargo, debido a que la adopción es staggered, esta gráfica TWFE puede sufrir los problemas identificados por la nueva literatura y es preferible utilizar estimadores adaptados a este tipo de contexto, como Callaway y Sant’Anna.
Para el $ ^{ATT}(2013-2015) $, la comparacion es \(\tau_{ATT}(2013, 2015) = \left[ \bar{Y}_{2015}^{G=2013} - \bar{Y}_{2012}^{G=2013} \right] - \left[ \bar{Y}_{2015}^{Never} - \bar{Y}_{2012}^{Never} \right]\)
Se usa 2012 como periodo pretratamiento porque para la cohorte g=2013, el año anterior al tratamiento es g−1=2012.
| grupo_cs | media_mortalidad_2012 | media_mortalidad_2015 | n_carceles_2012 | n_carceles_2015 | cambio |
|---|---|---|---|---|---|
| Cohorte tratada: G = 2013 | 0.816 | 0.453 | 10 | 10 | -0.362 |
| Never-treated | 1.425 | 1.548 | 163 | 163 | 0.123 |
cambio_tratadas <- tabla_cs_2x2 %>%
filter(grupo_cs == "Cohorte tratada: G = 2013") %>%
pull(cambio)
cambio_never <- tabla_cs_2x2 %>%
filter(grupo_cs == "Never-treated") %>%
pull(cambio)
tau_att_2013_2015 <- cambio_tratadas - cambio_never
resultado_tau_att <- tibble(
Parametro = "tau_ATT(2013, 2015)",
Grupo_tratado = "Cárceles que privatizan en 2013",
Grupo_control = "Never-treated",
Pre = 2012,
Post = 2015,
ATT = tau_att_2013_2015
)
kable(
resultado_tau_att,
digits = 3,
caption = "Estimador tau_ATT(2013, 2015)"
)
| Parametro | Grupo_tratado | Grupo_control | Pre | Post | ATT |
|---|---|---|---|---|---|
| tau_ATT(2013, 2015) | Cárceles que privatizan en 2013 | Never-treated | 2012 | 2015 | -0.485 |
Para las cárceles que privatizaron en 2013, en 2015 la privatización se asocia con una reducción relativa de aproximadamente 0.49 muertes por cada 1,000 internos, comparado con el cambio observado entre 2012 y 2015 en las cárceles que nunca privatizaron
La figura 3 presenta un event study robusto tipo Callaway & Sant’Anna. El eje horizontal presenta \(e=t-g\) donde \(g\) es el año en que una carcel privatiza por primera vez y \(t\) es el año calendario. Cada punto es el promedio de $ (g,g+e)$ para todas las cohortes que permiten observar \(e\) años después del tratamiento.
## Warning in did_standarization(data, args): 42 units are missing in some
## periods. Converting to balanced panel by dropping them.
## Warning in did_standarization(data, args): Be aware that there are some small groups in your dataset.
## Check groups: 2018.
## Warning in att_gt(yname = "mortality_rate", tname = "year", idname = "id", :
## Not returning pre-test Wald statistic due to singular covariance matrix
## # A tibble: 21 × 5
## event_time att se lower upper
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 -11 3.14 3.04 -2.81 9.09
## 2 -10 0.630 0.730 -0.801 2.06
## 3 -9 -0.0515 0.545 -1.12 1.02
## 4 -8 0.880 0.977 -1.03 2.79
## 5 -7 0.132 0.388 -0.628 0.892
## 6 -6 0.598 0.453 -0.290 1.49
## 7 -5 0.346 0.383 -0.404 1.10
## 8 -4 0.179 0.513 -0.827 1.19
## 9 -3 0.191 0.491 -0.772 1.15
## 10 -2 -0.249 0.295 -0.826 0.329
## # ℹ 11 more rows
## # A tibble: 21 × 5
## event_time att se lower upper
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 -10 -0.843 0.920 -2.65 0.960
## 2 -9 -0.463 0.504 -1.45 0.524
## 3 -8 0.247 0.738 -1.20 1.69
## 4 -7 -0.284 0.370 -1.01 0.441
## 5 -6 0.0502 0.458 -0.847 0.947
## 6 -5 0.108 0.364 -0.605 0.821
## 7 -4 0.0155 0.427 -0.821 0.852
## 8 -3 -0.115 0.394 -0.886 0.657
## 9 -2 -0.343 0.291 -0.914 0.227
## 10 -1 0 NA NA NA
## # ℹ 11 more rows
La Figura replica razonablemente el patrón encontrado en el artículo. Los coeficientes previos al tratamiento oscilan alrededor de cero y sus intervalos de confianza incluyen al valor nulo, lo que visualmente es consistente con ausencia de efectos anticipatorios. Posteriormente a la privatización, los efectos estimados son predominantemente negativos, sugiriendo una posible reducción en la tasa de mortalidad.
Tres años después de privatizar el servicio médico, las cárceles que privatizaron presentan una tasa de mortalidad aproximadamente 0.233 muertes por cada 1,000 internos menor que la que habrían experimentado en ausencia de privatización, utilizando como grupo de comparación a las cárceles nunca privatizadas. En términos causales, este coeficiente representa el efecto promedio del tratamiento para las cárceles tratadas tres años después de la privatización.
La gráfica evalúa principalmente el supuesto de Parallel Trends. En este contexto implica que en ausencia de privatización, las cárceles que eventualmente privatizarían y las cárceles nunca privatizadas habrían seguido trayectorias similares en la tasa de mortalidad antes del tratamiento.
La evidencia de la gráfica no muestra violaciones evidentes al supuesto de tendencias paralelas. Los coeficientes previos al tratamiento son pequeños y generalmente indistinguibles de cero, lo que sugiere que las cárceles tratadas y las nunca tratadas presentaban comportamientos similares antes de la privatización.
La idea es:
Estimar el contrafactual usando únicamente las observaciones que nunca han sido tratadas (never-treated) y aquellas que aún no han sido tratadas (not-yet-treated).
Predecir el resultado potencial en ausencia de tratamiento para cada unidad: \[\widehat{Y}_{it}^{C} = \widehat{\alpha}_i + \widehat{\delta}_t\]
Calcular el efecto del tratamiento para cada observación tratada individualmente, restando el contrafactual estimado del valor observado: \[\widehat{\tau}_{it} = Y_{it} - \widehat{Y}_{it}^{C}\]
Agregar los efectos individuales calculados en el paso anterior para obtener el efecto promedio ponderado sobre los tratados por grupo y tiempo: \[\widehat{\tau}^{ATT}(g,t)\]
## Estimador: -0.6760034
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).
Nota: los errores estándar reportados son aproximados (SE de la media de τ̂) y no incorporan la incertidumbre de la primera etapa de imputación. Los SEs correctos de BJS requieren bootstrap sobre ambas etapas.
El enfoque de Callaway y Sant’Anna (CS) compara cambios por cohorte y año, construyendo directamente el efecto promedio en los tratados por grupo y tiempo: \(\tau^{ATT}(g,t)\) entre las cárceles tratadas y un grupo válido de comparación.
Por otro lado, el método de Borusyak, Jaravel y Spiess (BJS) primero predice el contrafactual para cada cárcel tratada usando observaciones no tratadas o aún no tratadas: \(\widehat{Y}^C_{it}\) Y luego calcula la diferencia con respecto al valor observado: \[Y_{it} - \widehat{Y}^C_{it}\]
En la gráfica BJS, los efectos dinámicos se mantienen cerca de cero y casi todos los intervalos incluyen cero, por lo que no hay evidencia clara de que la privatización cambie sistemáticamente la mortalidad, sin embargo, si hay evidencia consistente con paralell trends. Comparada con la gráfica de CS, la conclusión es muy similar: hay poca evidencia de que el efecto de la privatización cambie con el tiempo cuando se restringe a las cárceles que recibieron al menos cuatro años de atención médica privada durante el panel.
## OLS estimation, Dep. Var.: mortality_rate
## Observations: 409
## Standard-errors: Corrected Clustered (id)
## Estimate Std. Error t value Pr(>|t|)
## treated -1.03139 0.338026 -3.05121 0.0024281 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 2.8155 Adj. R2: 7.469e-4
Como método adicional utilizo el estimador Two-stage Difference-in-Differences (DID2S) de Gardner. La motivación es que el TWFE tradicional puede ser problemático cuando el tratamiento ocurre de manera escalonada y los efectos son heterogéneos, no solo se “limpia” la variable dependiente, sino también el indicador de tratamiento, lo que puede generar comparaciones difíciles de interpretar. Gardner corrige esto separando el procedimiento en dos etapas. Primero, usando solo observaciones no tratadas o aún no tratadas, estima los efectos fijos de cárcel y año para predecir cuál habría sido la mortalidad sin privatización. Después residualiza la mortalidad, es decir, calcula la diferencia entre la mortalidad observada y la mortalidad esperada sin tratamiento. En la segunda etapa, regresa esa mortalidad residualizada contra el indicador de privatización. Intuitivamente, DID2S pregunta si, después de quitar diferencias permanentes entre cárceles y shocks comunes por año, la privatización está asociada con una mortalidad mayor o menor a la esperada. A diferencia de Callaway & Sant’Anna, que estima directamente efectos (ATT(g,t)) por cohorte y año, y de Borusyak et al., que imputa explícitamente resultados contrafactuales, DID2S obtiene el efecto a partir de esta residualización en dos etapas.
## NOTE: 72 observations removed because of NA values (LHS: 72).
## OLS estimation, Dep. Var.: y_resid
## Observations: 2,974
## Standard-errors: Clustered (id)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.005069 0.009875 0.513341 0.608159
## rel_year::-11 1.726156 2.193562 0.786919 0.432063
## rel_year::-10 -0.883973 0.625157 -1.414001 0.158586
## rel_year::-9 -0.274021 0.333788 -0.820943 0.412449
## rel_year::-8 0.462358 0.523795 0.882708 0.378229
## rel_year::-7 -0.255367 0.212132 -1.203807 0.229785
## rel_year::-6 0.012130 0.325598 0.037254 0.970311
## rel_year::-5 0.077438 0.249901 0.309874 0.756911
## rel_year::-4 0.025546 0.267474 0.095509 0.923986
## rel_year::-3 0.038900 0.268349 0.144961 0.884857
## rel_year::-2 -0.256461 0.173536 -1.477859 0.140684
## rel_year::0 -0.248565 0.190420 -1.305351 0.192954
## rel_year::1 -0.280266 0.207599 -1.350038 0.178206
## rel_year::2 -0.334891 0.200028 -1.674223 0.095318 .
## rel_year::3 -0.138951 0.283854 -0.489516 0.624899
## rel_year::4 -0.127408 0.276788 -0.460308 0.645689
## rel_year::5 0.022016 0.276055 0.079752 0.936497
## rel_year::6 -0.477535 0.292094 -1.634867 0.103316
## rel_year::7 0.177333 0.404291 0.438627 0.661305
## rel_year::8 -0.111507 0.393632 -0.283278 0.777194
## rel_year::9 0.942893 0.722147 1.305682 0.192842
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 2.40646 Adj. R2: -0.002002
event_manual_tbl <- tidy(
did2s_manual_event,
conf.int = TRUE,
conf.level = 0.95
) %>%
filter(str_detect(term, "rel_year")) %>%
mutate(
event_time = as.numeric(str_extract(term, "-?\\d+"))
) %>%
filter(!is.na(event_time)) %>%
arrange(event_time)
event_manual_tbl %>%
select(event_time, estimate, std.error, conf.low, conf.high) %>%
kable(
digits = 3,
caption = "Event study DID2S manual"
)
| event_time | estimate | std.error | conf.low | conf.high |
|---|---|---|---|---|
| -11 | 1.726 | 2.194 | -2.594 | 6.046 |
| -10 | -0.884 | 0.625 | -2.115 | 0.347 |
| -9 | -0.274 | 0.334 | -0.931 | 0.383 |
| -8 | 0.462 | 0.524 | -0.569 | 1.494 |
| -7 | -0.255 | 0.212 | -0.673 | 0.162 |
| -6 | 0.012 | 0.326 | -0.629 | 0.653 |
| -5 | 0.077 | 0.250 | -0.415 | 0.570 |
| -4 | 0.026 | 0.267 | -0.501 | 0.552 |
| -3 | 0.039 | 0.268 | -0.490 | 0.567 |
| -2 | -0.256 | 0.174 | -0.598 | 0.085 |
| 0 | -0.249 | 0.190 | -0.624 | 0.126 |
| 1 | -0.280 | 0.208 | -0.689 | 0.129 |
| 2 | -0.335 | 0.200 | -0.729 | 0.059 |
| 3 | -0.139 | 0.284 | -0.698 | 0.420 |
| 4 | -0.127 | 0.277 | -0.672 | 0.418 |
| 5 | 0.022 | 0.276 | -0.522 | 0.566 |
| 6 | -0.478 | 0.292 | -1.053 | 0.098 |
| 7 | 0.177 | 0.404 | -0.619 | 0.974 |
| 8 | -0.112 | 0.394 | -0.887 | 0.664 |
| 9 | 0.943 | 0.722 | -0.479 | 2.365 |
ggplot(event_manual_tbl, aes(x = event_time, y = estimate)) +
geom_point(size = 2) +
geom_errorbar(
aes(ymin = conf.low, ymax = conf.high),
width = 0.15
) +
geom_hline(yintercept = 0, linetype = "dashed") +
geom_vline(xintercept = -0.5, linetype = "dotted") +
labs(
title = "Event study DID2S manual",
x = "Years relative to treatment",
y = "ATT (Deaths per 1,000 inmates)"
) +
theme_minimal(base_size = 13)
| event_time | ATT_manual | ATT_paquete | diferencia |
|---|---|---|---|
| -11 | 1.726156 | 1.731226 | -0.005069 |
| -10 | -0.883973 | -0.878903 | -0.005069 |
| -9 | -0.274021 | -0.268951 | -0.005069 |
| -8 | 0.462358 | 0.467427 | -0.005069 |
| -7 | -0.255367 | -0.250297 | -0.005069 |
| -6 | 0.012130 | 0.017199 | -0.005069 |
| -5 | 0.077438 | 0.082507 | -0.005069 |
| -4 | 0.025546 | 0.030616 | -0.005069 |
| -3 | 0.038900 | 0.043970 | -0.005069 |
| -2 | -0.256461 | -0.251392 | -0.005069 |
| 0 | -0.248565 | -0.108835 | -0.139730 |
| 1 | -0.280266 | -0.299916 | 0.019649 |
| 2 | -0.334891 | -0.297410 | -0.037482 |
| 3 | -0.138951 | -0.180608 | 0.041656 |
| 4 | -0.127408 | -0.233361 | 0.105953 |
| 5 | 0.022016 | -0.163438 | 0.185454 |
| 6 | -0.477535 | -0.483831 | 0.006296 |
| 7 | 0.177333 | 0.378092 | -0.200759 |
| 8 | -0.111507 | -0.350053 | 0.238546 |
| 9 | 0.942893 | 0.019194 | 0.923699 |
| TWFE 2008-2019 | DID2S Gardner | |
|---|---|---|
| Errores estándar agrupados por cárcel. | ||
| treated | −0.116 | |
| (0.118) | ||
| treated = 1 | −0.203 | |
| (0.159) | ||
| Num.Obs. | 5969 | 3036 |
| R2 | 0.201 | 0.001 |
| R2 Adj. | 0.124 | 0.001 |
| R2 Within | 0.000 | |
| R2 Within Adj. | −0.000 | |
| AIC | 26942.3 | 13972.8 |
| BIC | 30490.3 | 13978.8 |
| RMSE | 2.12 | 2.42 |
| FE: id | X | |
| FE: year | X | |
Como nota metodológica, la implementación manual y el paquete did2s no coinciden exactamente porque no utilizan la misma muestra efectiva. En la versión manual se eliminan algunas observaciones para las cuales no se puede generar una predicción válida en la primera etapa, es decir, observaciones donde no se puede construir adecuadamente la mortalidad esperada sin tratamiento. En cambio, el paquete maneja internamente estas observaciones de forma distinta. Por eso, aunque ambos estimadores tienen la misma lógica y una interpretación económica muy similar, los valores puntuales no son idénticos. Esta diferencia no refleja un problema conceptual del método, sino una diferencia práctica en el manejo de la residualización, las observaciones faltantes y la muestra usada en la estimación.