查看原文
其他

基于Lasso(scul)的合成控制法(一)

数量经济学 数量经济学 2023-02-21

基于Lasso(scul)的合成控制法(一)

本文主要来源于Hollingsworth和Wing(2020)“Tactics for design and inference in synthetic control studies: An applied example using high-dimensional data”一文中使用的R包scul。“

Installation

# Install development version from GitHub (CRAN coming soon) using these two lines of code
if (!require("devtools")) install.packages("devtools")
devtools::install_github("hollina/scul")`

教程/更多的细节

关于包的深入教程和包中每个函数的概述可以在这里获得,网址是https://hollina.github.io/scul/articles/scul-tutorial.html。本教程使用公开的数据,并讨论SCUL过程的许多特性。本教程还提供了SCUL方法与传统综合控制方法的简单比较。

有关SCUL的详情,请参阅我们的工作文件。这篇与Coady Wing合作的论文描述了在大多数综合对照研究中出现的关键决策(通常是临时决策)的识别假设和建议。然后,论文描述了SCUL方法,并使用该过程来估计娱乐用大麻合法化如何影响酒精和非处方止痛药的销售,发现酒精销售的减少。

什么是合成控制?

综合控制方法是一种评估特殊历史事件的因果治疗效果的策略。在Abadie、Diamond和Hainmueller(2010)开发的典型应用中,研究人员观察了一个处理单元和许多未处理单元的时间序列结果。未处理序列的加权平均值被用作处理序列的反事实估计,这被称为综合比较组。选择权重以尽量减少综合对照组与治疗单位在预处理时间内的差异。治疗效果的估计通常是观察结果和合成反事实之间的差异。统计推断通常是围绕安慰剂分析组织的;其中,对许多未治疗的安慰剂单位估计了伪治疗效果,伪估计的分布代表无治疗效果的零分布。

考虑合成控制的一种有用的方法是将其视为一种基于决定数据生成过程的未观察因素试图将供体序列与目标序列匹配的过程。当以这种方式构建时,用于模型选择/推断的识别假设和策略变得更加突出。

最近的方法论工作提出了一些估算综合控制权重的创新策略(Arkhangelsky et al. 2018; Doudchenko and Imbens 2017; Powell 2019)。在类似的情况下,我们使用一种称为“使用Lasso套索的合成控制”(SCUL)的方法构建供体权重。


SCUL是什么?

这种方法是一种灵活的、数据驱动的方法来构建合成对照组。它依赖于套索回归,在机器学习文献中很流行,并且倾向于在样本外预测良好的权重。

我们的工作论文强调了与任何综合对照研究相关的识别假设和建议。

一般来说,我们的方法允许:

  • 一个高维的捐赠池,可能比时间段的数量更大

  • 一种简单的方法来确保对目标和安慰剂系列使用相同的模型选择程序

  • 各种各样的变量类型作为候选捐赠者

  • 从捐赠池中推断

  • 反周期的权重

我们认为这种统计方法的结合和遵循这些建议作为SCUL程序


SCUL的贡献是什么?

1、阐明综合控制方法的识别假设

我们概述了综合控制设计识别因果治疗参数所需的两个简单识别假设:

  • 在基础因素结构匹配后,治疗暴露和潜在结果的条件独立性

  • 治疗前无潜伏因素。

虽然这些假设都不是直接可测试的,但我们的工作报告提供了一些观点和策略,可能有助于在应用工作中解释这些假设的有效性。

2、提供通常临时选择的建议

对于合成对照研究中常见的决策,我们的建议包括:

  • 对目标产品和安慰剂产品使用相同的模型选择程序

  • 采用无单元测度评价模型拟合

  • 丢弃在预先指定的模型拟合阈值上表现不佳的潜在目标系列和安慰剂系列(用于推断)

  • 结合滚动原点交叉验证程序来确定最佳权重

  • 将综合控制权重报告为对综合预测的平均贡献,而不是作为数值系数

  • 使用治疗效果估计的无单位测量来比较估计的治疗效果与安慰剂分布的推论

  • 报告给定显著性水平的最小治疗效应量,用于推断的安慰剂分布在统计学上与零不同

我们在教程中实现了不同版本的建议,并在工作文件中更详细地概述了每个建议。

3、使用机器学习方法,允许高维供体池和自动模型选择

套索回归的惩罚规格与众多的变量和大的系数。这使得许多系数的值为零,并允许包含非常大的捐赠池。这样做的一个好处是——只要供体在理论上是有效的——研究人员将不需要决定是否包括一个供体而不是另一个。这样做的一个代价是程序可能会过度拟合数据。SCUL权重的创建使用交叉验证的套索回归,以确保权重不会“过拟合”数据,并有利于样本外预测。

通过自动化模型选择和允许大量的捐赠者,我们减少了“研究人员的自由度”。很容易想象,可以为每个目标系列创建最佳的综合预测,但为每个安慰剂系列完善模型所花的时间会更少。如果自动模型选择结果更适合安慰剂系列,我们也提高了统计力。如果在治疗前阶段的更好的适应导致治疗后阶段的恶化更少(即更好的适应),就会发生这种情况。这提高了统计效力,因为统计推断是通过比较治疗系列的偏差和安慰剂偏差的分布来完成的。因此,减少安慰剂零分布的扩散允许被治疗单位的较小偏差被认为是统计上罕见的。

4、包括各种各样的捐赠者类型

我们将综合控制作为一种匹配形成数据生成过程的未观察到的潜在因素的方式。在这种情况下,使用来自广泛变量类型的供体单元是有意义的,因为不同的变量类型可能有助于确定处理单元的数据生成过程的不同潜在因素/特征。因此,我们使用广泛的供体变量来构建我们的合成控制组,而不是像通常做法那样只使用与目标变量相同的变量类型。

5、允许外推和负权重

传统的综合控制方法限制权重为非负和和为1。这些限制迫使合成对照组停留在供体池的支撑(即凸包)内,防止外推。这当然是一个令人满意的属性。然而,在某些情况下,这些阻止外推的限制可以抑制合成对照组找到完美的供体系列。

  • 情况1:当目标序列不在供体池的支持范围内时(即需要外推来匹配目标序列

  • 案例2:当负相关的捐赠者可以帮助识别基础数据生成过程(例如,两种金融资产,或一个价格和消费序列)



软件使用:

这个包是为R制作的,是在使用R 3.6.1的Unix机器上开发的。

References

Abadie, Alberto, Alexis Diamond, and Jens Hainmueller. 2010. “Synthetic Control Methods for Comparative Case Studies: Estimating the Effect of California’s Tobacco Control Program.” Journal of the American Statistical Association 105 (490): 493–505. https://doi.org/10.1198/jasa.2009.ap08746.

Arkhangelsky, Dmitry, Susan Athey, David A. Hirshberg, Guido W. Imbens, and Stefan Wager. 2018. “Synthetic Difference in Differences.” http://arxiv.org/abs/1812.09970.

Doudchenko, Nikolay, and Guido W. Imbens. 2017. “Balancing, Regression, Difference-In-Differences and Synthetic Control Methods: A Synthesis.” http://arxiv.org/abs/1610.07748.

Powell, David. 2019. “Imperfect Synthetic Controls,” no. May 2017: 1–38. https://sites.google.com/site/davidmatthewpowell/imperfect-synthetic-controls.

示例数据

本教程使用的公开数据与Abadie、Diamond和Hainmueller(2010)中使用的数据类似。Abadie、Diamond和Hainmueller(2010)的实证目标是评估1988年实施的加利福尼亚州烟草控制政策的效果。

在长格式中,数据是州年级别的,范围从1970年到1997年(28年)。每个州和每一年都有人均香烟销售额(cigsale)和香烟零售价(重新定价)的数据。要在SCUL过程中使用,数据必须采用宽格式,其中每一行是一个时间段(例如,年),每列是一个特定于单位的变量。在我们的数据中,对于每个变量,单位由每个列名的末尾标识(例如,来自加利福尼亚州的变量由_6表示,这是加利福尼亚州的FIPS代码)。

数据集应该按您用来索引时间的变量排序,最早的日期是第一个,最近的日期是最后一个。

cigarette te_sales数据集存储在此包的data子目录中。当scul包被加载时,它应该自动加载。

dim(cigarette_sales)
#> [1] 28 79

head(cigarette_sales[,1:6])
#>   year cigsale_6 cigsale_1 retprice_1 cigsale_5 retprice_5
#> 1 1970     123.0      89.8       39.6     100.3       36.7
#> 2 1971     121.0      95.4       42.7     104.1       38.8
#> 3 1972     123.5     101.1       42.3     103.9       44.1
#> 4 1973     124.4     102.9       42.1     108.0       45.1
#> 5 1974     126.7     108.2       43.1     109.7       45.5
#> 6 1975     127.1     111.7       46.6     114.8       48.6

我们将把这个数据集分为两个:一个包含结果的数据,另一个包含所有其他数据,这些数据将被用作合成反事实的捐赠池。在每个数据集中,我们将留下索引时间的第一列。我们不会将加州的零售价格作为潜在的捐赠变量,因为这是内生的。

AllYData <- cigarette_sales %>% 
  select(c("year""cigsale_6"))
AllXData <- cigarette_sales %>%
  select(-c("year""cigsale_6""retprice_6"))

预处理/清理数据

在开始分析之前,让我们确保数据的格式正确,并删除任何有问题的变量。

使用预处理()清理数据

Preprocess()函数接受一个矩阵或一个数据框,并确保每一列

  • 是数字

  • 是否有所有非缺失值

  • 并不是恒定的

它删除任何违反这些条件的列。

processed.AllYData <- Preprocess(AllYData)

使用 PreprocessSubset()确保所有Subset都有变化

为了避免过度拟合,我们将使用一种交叉验证方法,在数据的许多子集上评估模型。因此,我们需要确保在分析中使用的变量的子集有变化。PreprocessSubset() 与Preprocess()函数相同,不同之处在于它对交叉验证中使用的每个子集迭代执行相同的过程。

TreatmentBeginsAt <- 19 # Here the 18th row is 1988
PostPeriodLength <- nrow(processed.AllYData) - TreatmentBeginsAt + 1
PrePeriodLength <- TreatmentBeginsAt-1
NumberInitialTimePeriods <- 5
processed.AllYData <- PreprocessSubset(processed.AllYData,
                                       TreatmentBeginsAt ,
                                       NumberInitialTimePeriods,
                                       PostPeriodLength,
                                       PrePeriodLength)

使用OrganizeDataAndSetup()清理供体和安慰剂池数据

SCUL.input <- OrganizeDataAndSetup (
    time =  AllYData %>% select(year),
    y = AllYData %>% select(cigsale_6),
    TreatmentBeginsAt = TreatmentBeginsAt,
    x.DonorPool = AllXData,
    CohensDThreshold = 0.25,
    NumberInitialTimePeriods = NumberInitialTimePeriods,
    TrainingPostPeriodLength = 7,
    x.PlaceboPool = AllXData,
    OutputFilePath="vignette_output/"
)

使用GraphTargetData()检查绘图原始数据

GraphTargetData()将根据时间绘制任何变量的图形,在治疗开始之前的时间段内放置一条虚线。默认情况下是绘制目标变量的图形。一个png文件保存在OrganizeDataAndSetup()函数中指定的OutputFilePath中。

这不是最美观的图形,因为它是自动生成的。然而,它可以很好地检查你的数据是否正确输入,以及你的治疗时间是否正确。这里我们可以看到加州的香烟销量随着时间的推移一直在下降治疗前和治疗后的时间是1988年。


GraphTargetData ()

结果为:

如何选择λ

套索回归方法的一个关键选择参数是惩罚参数

在这里,我们使用所有预处理数据来获得网格上间隔的若干lambda惩罚值的权重。


使用SCUL()函数创建一个合成控制组

假设您已经正确设置了一切,并且有一个名为SCUL的元素列表。输入,您可以简单地运行SCUL()函数来运行上面概述的交叉验证过程。我们将输出存储为一个名为scull .output的列表。

SCUL.output <- SCUL(plotCV == TRUE)

使用PlotActualvSCUL()绘制实际数据和SCUL反事实图

使用PlotActualvSCUL()函数,可以将观察到的数据与反事实的预测进行绘制。

PlotActualvSCUL ()




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存