Descripción general
tidysynth
es una implementación ordenada lamétodo de control sintéticoenR
.Un control sintético ofrece una forma de evaluar el efecto de una intervención en estudios de casos comparativos. El método tiene como objetivo modelar una unidad contrafáctica utilizando un promedio ponderado de unidades que no recibieron la intervención. El efecto de la intervención se puede estimar comparando las diferencias en las series de tiempo observadas y sintéticas. Consulte Abadie et al.2003, 2010, 2015 para obtener más información sobre el método y los casos de uso.
Construyendo sobre elsintetizador
paquete,tidysynth
realiza una serie de mejoras al implementar el método enR
. Estas mejoras permiten a los usuarios inspeccionar, visualizar y ajustar el control sintético con mayor facilidad. Un beneficio clave de una implementación ordenada es que todo el proceso de preparación para construir el control sintético se puede realizar en una sola canalización.
En concreto, el paquete:
- genera controles sintéticos de placebo sobre la marcha que permiten estadísticas inferenciales;
- ofrece métodos de trazado para explorar fácilmente el ajuste del control sintético y los pesos;
- aumenta la transparencia y la facilidad de uso a través de una implementación de pipe-able;
- se basa en una estructura de datos ordenada anidada con
agarrar_
funciones de prefijo para extraer fácilmente los elementos componentes de la canalización de control sintético.
Instalación
Crán.
install.packages('tidysynth')
Versión de desarrollador.
# install.packages("devtools")devtools::install_github("edunford/tidysynth")
Uso
El paquete utiliza una canalización de funciones para generar el control sintético.
Función | Descripción |
---|---|
control_sintetico() | Inicialice una canalización de sintetizador especificando la serie de paneles, el resultado y el período de intervención. Esta canalización funciona como un canal anidadotbl_df |
generar_predictor() | Cree una o más variables escalares que resuman los datos de covariables en una ventana de tiempo específica. Estas variables predictoras se utilizan para ajustar el control sintético. |
generar_pesos() | Ajuste los pesos unitarios y predictores utilizados para generar el control sintético. |
generar_control() | Genere el control sintético utilizando los pesos optimizados. |
El siguiente ejemplo proviene de Abadie et al.2010, que evalúa el impacto de la Proposición 99 sobre el consumo de cigarrillos en California.
require(tidysynth)data("fumar")fumar %>% dplyr::glimpse()
## Filas: 1,209## Columnas: 7## $ estado "Rhode Island", "Tennessee", "Indiana", "Nevada", "Louisiana…## $ año 1970, 1970, 1970, $ lngreso NA , NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …## $ cerveza NA, NA, NA, NA, NA, NA, NA, NA , NA, NA, NA, NA, NA, …## $ age15to24 0.1831579, 0.1780438, 0.1765159, 0.1615542, 0.1851852, 0.175…## $ retprice 39.3, 39.9, 30.6, 38 .9 , 34.3, 38.4, 31.4, 37.3, 36.7, 28.8, …
El método tiene como objetivo generar una California sintética utilizando información de un subconjunto de estados de control (el "grupo de donantes") donde se aplicó una ley similar.noimplementado. El grupo de donantes es el subconjunto de comparaciones de casos del que se toma prestada la información para generar una versión sintética de la unidad tratada ("California").
smoking_out <- smoking %>% # inicial del objeto de control sintético synthetic_control(outcome = cigsale, # resultado unidad = estado, # índice de unidad en los datos del panel tiempo = año, # índice de tiempo en los datos del panel i_unit = "California", # unidad donde ocurrió la intervención i_time = 1988, # período de tiempo cuando ocurrió la intervención generar_placebos=T # generar controles sintéticos de placebo (para inferencia) ) %>% # Generar los predictores agregados utilizados para ajustar las ponderaciones # ingresos logarítmicos promedio, precio minorista de cigarrillos y proporción de la # población entre 15 y 24 años de edad entre 1980 y 1988 T), jóvenes = media (de 15 a 24 años, na.rm = T)) %>% # consumo promedio de cerveza en el grupo de donantes de 1984 a 1988 )) %>% # Ventas de cigarrillos rezagadas generate_predictor(time_window = 1975, cigsale_1975 = cigsale) %>% generate_predictor(time_window = 1980, cigsale_1980 = cigsale) %>% generate_predictor(time_window = 1988, cigsale_1988 = cigsale) %>% # Generate los pesos ajustados para el control sintético generate_weights(optimization_window = 1970:1988, # tiempo de uso en la tarea de optimización margin_ipop = .02,sigf_ipop = 7,bound_ipop = 6 # opciones del optimizador) %>% # Generar el control sintético generate_control()
Una vez que se genera el control sintético, se puede evaluar fácilmente el ajuste comparando las tendencias de las series de tiempo sintéticas y observadas. La idea es que las tendencias en el período previo a la intervención se correspondan estrechamente entre sí.
fumar_out %>% plot_trends()
Para capturar la cantidad causal (es decir, la diferencia entre lo observado y lo contrafáctico), se pueden trazar las diferencias usandotrazar_diferencias()
fumar_out %>% plot_differences()
Además, uno puede examinar fácilmente la ponderación de las unidades y variables en el ajuste. Esto permite ver qué casos se utilizaron, en parte, para generar el control sintético.
fumar_out %>% plot_weights()
Otra forma útil de evaluar el control sintético es observar qué tan comparable es el control sintético con las covariables observadas de la unidad tratada.
fumar_out %>% grab_balance_table()
## # A tibble: 7 × 4## variable California synthetic_Californiadonante_sample## ## 1 ln_income 10.1 9.85 9.83 ## 2 ret_price 89.4 89.4 87.3 ## 3 jóvenes 0.174 0.174 0.173 ## 4 venta_cerveza 24.3 24.2 23.7 ## 5 venta_cig_1975 127. 127. 137. ## 6 venta_cig_1980 120. 120. 138. ## 7 venta_cig_1988 90.1 91.4 114.
Inferencia
Para la inferencia, el método se basa en repetir el método para cada donante en el grupo de donantes exactamente como se hizo para la unidad tratada, es decir, generarplacebocontroles sintéticos). Configurandogenerar_placebos = VERDADERO
al inicializar la canalización del sintetizador concontrol_sintetico()
, los casos de placebo se generan automáticamente al construir el control sintético de interés. Esto facilita la exploración de la diferencia única entre la unidad observada y la sintética en comparación con los placebos.
fumar_out %>% plot_placebos()
Tenga en cuenta que eltrama_placebos()
La función elimina automáticamente cualquier placebo que se ajuste mal a los datos en el período previo a la intervención. La razón para hacerlo es puramente visual: esas unidades tienden a desviarse de la escala cuando se grafican los placebos. Para podar, la función analiza el error de predicción cuadrático medio (MSPE) del período previo a la intervención (es decir, una métrica que refleja qué tan bien el control sintético se asigna a la serie temporal de resultados observados en el período previo a la intervención). Si un control de placebo tiene un MSPE que es dos veces mayor que el caso objetivo (por ejemplo, "California"), entonces se elimina. Para desactivar este comportamiento, configureciruela = FALSO
.
fumar_fuera %>% plot_placebos(ciruela pasa = FALSO)
Finalmente, Adabie et al.2010 describen una forma de construir los valores P exactos de Fisher dividiendo el MSPE posterior a la intervención por el MSPE previo a la intervención y luego clasificando todos los casos por esta proporción en orden descendente. Luego, el valor de Ap se construye tomando el rango/total.[^1] La idea es que si el control sintético se ajusta bien a la serie de tiempo observada (MSPE bajo en el período previo) y diverge en el período posterior (MSPE alto en el período posterior). -período) entonces hay un efecto significativo debido a la intervención. Si la intervención no tuvo ningún efecto, entonces el post-período y el pre-período deberían continuar mapeándose entre sí bastante bien, produciendo una proporción cercana a 1. Si las unidades de placebo se ajustan a los datos de manera similar, entonces no podemos rechazar la hipótesis del casco de que no hay ningún efecto provocado por la intervención.
Esta relación se puede trazar fácilmente usandoplot_mspe_ratio()
, ofreciendo una idea de la rareza del caso en el que realmente ocurrió la intervención.
fumar_fuera %>% plot_mspe_ratio()
Para obtener información más específica, hay una tabla de significado que se puede extraer con uno de los muchosagarrar_
funciones de prefijo
fumar_fuera %>% grab_significance()
## # A tibble: 39 × 8## nombre_unidad tipo pre_mspe post_mspe mspe_ratio rango fishers_exact_pvalue## ## 1 Tratado de California… 3.17 392. 124. 1 0.0256## 2 Georgia Donante 3.79 179. 47.2 2 0.0513## 3 Indiana Donante 25.2 770. 30.6 3 0.0769## 4 West Virginia Donante 9.52 284. 29.8 4 0.103 ## 5 Wisconsin Donante 11.1 26 8. 24.1 5 0.128 # # 6 Donante de Missouri 3.03 67.8 22.4 6 0.154 ## 7 Donante de Texas 14.4 277. 19.3 7 0.179 ## 8 Donante de Carolina del Sur 12.6 234. 18.6 8 0.205 ## 9 Donante de Virginia 9.81 96.4 9.83 9 0.231 ## 10 Nebraska Donante 6.30 52.9 8.40 10 0.256 ## # ℹ 29 filas más## # ℹ 1 variable más: z_score
Acceso a datos
Además de la canalización de datos principal para generar el control sintético y eltrama_
funciones de prefijo para visualizar la salida, hay una serie deagarrar_
funciones de prefijo que ofrecen fácil acceso a los datos contenidos dentro de un objeto de tubería de sintetizador.
En esencia, una canalización de sintetizador es simplemente un marco de datos tibble anidado, donde se puede acceder a cada componente de la canalización de control sintético.
fumar_fuera
## # Un tibble: 78 × 11## .id .placebo .type .outcome .predictors .synthetic_control .unit_weights## ## 1 Califor… 0 trea… ## 2 Califor… 0 cont… ## 3 Alabama 1 trat… ## 4 Alabama 1 cont… ## 5 Arkansas 1 tratamiento... ## 6 Arkansas 1 cont... ## 7 Colorado 1 tratamiento … ## 8 Colorado 1 cont… ## 9 Connect… 1 tra… ## 10 Conectar… 1 continuación… ## # ℹ 68 filas más# # # ℹ 4 variables más: .predictor_weights , .original_data ,## # .meta , .loss
Para acceder a los campos de datos relevantes, elagarrar_
funciones de prefijo entran en juego.
Función | Descripción |
---|---|
agarrar_resultado() | Extraiga la variable de resultado generada porcontrol_sintetico() . |
grab_predictores() | Extraiga las covariables a nivel agregado generadas porgenerar_predictor() . |
grab_unit_weights() | Extraer los pesos unitarios generados porgenerar_pesos() . |
agarrar_predictor_pesos() | Extraiga los pesos de las variables predictoras generados porgenerar_pesos() . |
grab_loss() | Extraiga la pérdida de RMSE de los pesos optimizados generados porgenerar_pesos() . |
grab_synthetic_control() | Extraiga el control sintético generado usandogenerar_control() . |
agarrar_significado() | Genere estadísticas inferenciales que comparen la rareza de la unidad que realmente recibió la intervención con las unidades de placebo en el grupo de donantes. |
grab_balance_table() | Compare las distribuciones de los predictores de nivel agregado para la unidad de intervención observada, el control sintético y el promedio del grupo de donantes. |
fumar_fuera %>% grab_synthetic_control()
## # A tibble: 31 × 3## time_unit real_y synth_y## ## 1 1970 123 117.## 2 1971 121 119.## 3 1972 124. 124.## 4 1973 124. 125.## 5 1974 127. 127.## 6 1975 127. 127.## 7 1976 128 128.## 8 1977 126. 126.## 9 1978 126. 125.## 10 1979 12 2. 123.## # ℹ 21 filas más
Tenga en cuenta que la mayoría de losagarrar_
Las funciones también permiten la extracción de unidades de placebo.
fumar_fuera %>% grab_synthetic_control(placebo = T)
## # A tibble: 1,209 × 5## .id .placebo time_unit real_y synth_y## ## 1 California 0 1970 123 117.## 2 California 0 1971 121 119.## 3 California 0 1972 124. 124.## 4 California 0 1973 124. 125.## 5 California 0 1974 127. 127.## 6 California 0 1975 127. 127.## 7 California 0 1976 128 128.## 8 California 0 1977 126. 126.## 9 California 0 1978 126. 125.## 10 California 0 1979 122. 123.## # ℹ 1199 filas más
Pero di que realmente quierodesear()
…
En la implementación actual, puede desempaquetar una tubería de sintetizador completa usandodesear()
. Elagarrar_
La función está destinada a optimizar cualquier necesidad de extracción específica. Todo el método se basa en la infraestructura de atidyverse, por lo que uno puede eludir la mayor parte de la funcionalidad del paquete e interactuar con la salida de la canalización del sintetizador como lo haría con cualquier anidado.tbl_df
objeto.
fumar_fuera %>% tidyr::unnest(cols = c(.resultado))
## # Un tibble: 1,482 × 50## .id .placebo .type time_unit California Alabama Arkansas Colorado## ## 1 California 0 tratado 1970 123 NA NA NA## 2 California 0 tratado 1971 121 NA NA NA## 3 California 0 tratado 1972 124. NA NA NA## 4 California 0 tratado 1973 124. NA NA NA## 5 California 0 tratado 1974 127. NA NA NA## 6 California 0 tratados 1975 127. NA NA NA## 7 California 0 tratados 1976 128 NA NA NA## 8 California 0 tratados 1977 126. NA NA NA## 9 California 0 tratados 1978 126. NA NA NA## 10 California 0 tratados 1979 122. NA NA NA## # ℹ 1,472 filas más## # ℹ 42 variables más: Connecticut , Delaware , Georgia ,## # Idaho < dbl>, Illinois , Indiana , Iowa , Kansas ,## # Kentucky , Luisiana , Maine , Minnesota ,## # Mississippi , Misuri , Montana , Nebraska ,## # Nevada , `Nuevo Hampshire` , `Nuevo México` ,## # `Carolina del Norte` , `Dakota del Norte` , Ohio , Oklahoma , …
depuración
¿Detectar un problema? Por favor, hágamelo saber mediante la publicación de un problema.
[^1]: tenga en cuenta que esto implica que necesitaría al menos 20 casos en el grupo de donantes para obtener un valor p convencional (.05).