【问题标题】:In a synthetic control method, does the measured time have to be continuous?在综合控制方法中,测量时间是否必须是连续的?
【发布时间】:2019-06-01 10:58:07
【问题描述】:

过去几天我一直在发布一些关于合成控制方法的问题,因为我一直遇到问题。除其他外,我目前的问题是我似乎收到了有关我进行研究的时间跨度的错误消息。我正在测量与选举日期相关的数据,因此,我的数据不是在连续的时间段内测量的,但其中存在差距。现在,如果我运行我的代码,我会收到以下错误:

“从 time.predictors.prior 开始的时间段 1949 在 time.variable 中找不到”

确实,我没有 1949 年的测量值,但我有 1948 年和 1952 年的测量值。我的问题是,我该如何解决这个问题?

我已尝试创建连续时间刻度,但这样做会得到不正确的数据,因为数据的性质不允许我以连续刻度测量数据。

dataprep_outcomes <- dataprep(foo=dataset [dataset$Year %in% c(1948:1986),], + predictors = c("Income","Distance","Gini","Percentage_voted","Protest"), + dependent = c("Percentage_voted"), + unit.variable = c("Municipality_No"), + time.variable = c("Year"), + treatment.identifier = 1, + controls.identifier = c(2:14), + time.predictors.prior = c(1948:1967), + time.optimize.ssr = c(1948:1986), + unit.names.variable = c("Municipality_ID"), + time.plot = c("Year"))}

我想解决这个问题,这将非常有帮助,作为外行,我将非常感谢听到建议。

提前谢谢你。

【问题讨论】:

    标签: r


    【解决方案1】:

    如果无法访问您的数据,我无法确认这是否可行。但是,看起来问题在于您告诉函数先前的时间段是 1948 年到 1967 年,而实际上它们只是这些日期的一个子集。一种解决方案可能是指定 time.predictors.prior = intersect(1948:1967, dataset$Year),这将确保您用于 time.predictors.prior 的唯一值是您的数据中的值。

    您需要确保您指定的任何时间范围仅包括观察日期,这意味着您还需要调整 time.optimize.ssr 中的日期范围。这是一个使用内置 basque 数据框(在 Synth 包中)的示例。请注意,在任何地方都指定了年份范围,我们需要确保它只包含观察到的年份。我正在使用 intersect 进行此操作,但还有其他方法。在您的函数中,这会容易得多,因为据我所知,您只在两个地方指定了年份范围。

    data(basque)
    
    basque <- subset(basque, !year %in% c(1965, 1966)) # remove two of the "prior" years
    
    # dataprep: prepare data for synth
    dataprep.out <-
      dataprep(
        foo = basque
        ,predictors= c("school.illit",
                       "school.prim",
                       "school.med",
                       "school.high",
                       "school.post.high"
                       ,"invest"
        )
        ,predictors.op = c("mean")
        ,dependent     = c("gdpcap")
        ,unit.variable = c("regionno")
        ,time.variable = c("year")
        ,special.predictors = list(
          list("gdpcap",intersect(1960:1969, basque$year),c("mean")),                            
          list("sec.agriculture",intersect(basque$year, seq(1961,1969,2)),c("mean")),
          list("sec.energy",intersect(basque$year, seq(1961,1969,2)),c("mean")),
          list("sec.industry",intersect(basque$year, seq(1961,1969,2)),c("mean")),
          list("sec.construction",intersect(basque$year, seq(1961,1969,2)),c("mean")),
          list("sec.services.venta",intersect(basque$year, seq(1961,1969,2)),c("mean")),
          list("sec.services.nonventa",intersect(basque$year, seq(1961,1969,2)),c("mean")),
          list("popdens",1969,c("mean")))
        ,treatment.identifier  = 17
        ,controls.identifier   = c(2:16,18)
        ,time.predictors.prior = intersect(1964:1969, basque$year)
        ,time.optimize.ssr     = intersect(1964:1969, basque$year)
        ,unit.names.variable   = c("regionname")
        ,time.plot            = intersect(c(1955:1997), basque$year)
      )
    

    【讨论】:

    • 亲爱的约瑟夫,我已经尝试了你的代码字符串,但它仍然给了我同样的错误。尽管如此,还是感谢您的意见!我在 Windows Excel 中制作数据集可能是有用的信息,也许问题在于我保存数据的方式,但我不知道如何。
    • 您能否发布数据,以便我查看哪些有效,哪些无效?这似乎是一个有趣的问题,但我很难检查。
    • 亲爱的 Joseph Clark McIntyre,我非常感谢您的建议,它确实删除了错误消息!这对我帮助很大。但是,作为外行,我遇到了另一个问题,那就是我收到以下错误“as.vector(y) 中的错误:缺少参数“y”,没有默认值”。但是,如果正确的话,就我而言,我填写了我的“y”?
    • 很高兴听到这个消息。
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多