我使用 R 中的
synth
包来实现综合控制方法,其中我使用 dataprep()
函数来构造要传递给 synth()
的适当矩阵。也就是说,我将 dataprep()
称为如下:
dataprep_out <- dataprep(foo = csv_data,
predictors = vars_dep,
predictors.op = "mean",
time.predictors.prior = 2000:2010,
dependent = "Log_gdp",
unit.variable = "REG_FACTOR",
unit.names.variable = "REG_ID",
time.variable = "Year",
treatment.identifier = my_factor_treated,
controls.identifier = my_controls,
time.optimize.ssr = 2000:2010,
time.plot = 2000:2017
)
之后我打电话给
synth()
:
synth_out <- synth(data.prep.obj = dataprep_out)
这工作得很好,给了我预期的结果。然而,当我对另一个处理过的观察重复相同的代码,但使用完全相同的控件时(即
my_factor_treated
是 dataprep()
中已更改的 only参数),我在调用
synth()
时收到以下错误
:
svd(c) 中的错误:“x”中存在无限值或缺失值。
我正在努力寻找此错误的原因,也是因为我不确定在执行
svd()
期间哪个对象被传递给 synth()
函数。 dataprep()
返回的对象中没有一列只包含零,并且不包含 Inf 值(这是有道理的,因为否则这个错误也应该发生在第一个处理的观察上,对吗?)。
如果有人能告诉我为什么会出现此错误以及如何防止它,我将不胜感激。我已经检查了多个相关问题,但未能找到我的答案。谢谢!
PS。我不确定如何提供合适的 MWE,因为我猜我的问题与数据相关,并且我无法共享我正在使用的数据集。
我遇到了同样的问题,和你一样,我确认我的数据集中没有缺失值或全0。后来我意识到这是由生成权重时使用的优化算法引起的。您可以尝试的一件事是在合成函数中添加参数“optimxmethod='All'”。这将尝试所有可用的方法,并向您报告性能最佳的方法。
如果@yang3122的建议不起作用,问题可能是优化过程由于计算奇异而失败。在这种情况下,您可能需要对 Synth() 函数中的 Margin.ipop 值进行一些调整。默认值是5e-04,稍微增加这个值也许能解决优化问题。