“svd(c) 中的错误:'x' 中存在无限值或缺失值”在 R 中使用 Synth() 时

问题描述 投票:0回答:2

我使用 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,因为我猜我的问题与数据相关,并且我无法共享我正在使用的数据集。

r svd
2个回答
1
投票

我遇到了同样的问题,和你一样,我确认我的数据集中没有缺失值或全0。后来我意识到这是由生成权重时使用的优化算法引起的。您可以尝试的一件事是在合成函数中添加参数“optimxmethod='All'”。这将尝试所有可用的方法,并向您报告性能最佳的方法。


0
投票

如果@yang3122的建议不起作用,问题可能是优化过程由于计算奇异而失败。在这种情况下,您可能需要对 Synth() 函数中的 Margin.ipop 值进行一些调整。默认值是5e-04,稍微增加这个值也许能解决优化问题。

© www.soinside.com 2019 - 2024. All rights reserved.