1

在 R 中,我使用了 robustbase 包中的 lmrob 来拟合以下形式的简单线性模型:

lmrob(value ~ t + as.factor(r) + as.factor(c) + 0, data=subs, setting="KS2014")

这在 95% 的情况下都可以正常工作,但每隔一段时间调用就会失败并给出以下错误:

错误:DGELS:加权设计矩阵不是满秩(XX 列)。

其中 XX 是不同的列号。我可以通过简单地重复执行 lmrob 命令直到它最终成功来解决这个问题——通常这需要 1-2 次尝试直到它起作用。请注意,当我重新运行 lmrob 时,我不会更改任何输入。

有谁知道我可以更改的设置以避免手动重新运行 lmrob 命令以使其工作?我尝试更改一些控制参数但没有成功:

lm_control <- lmrob.control(setting="KS2014")
lm_control$max.it <- 1000
lm_control$nResample <- 1500
4

2 回答 2

-1

这很简单。将语句包裹起来tryCatch并重复它,直到它干净为止。您可能需要调整 的类result,请参见 ( str(class(result)))。

pass <- FALSE

while (pass == FALSE) {
  result <- tryCatch(lmrob(value ~ t + as.factor(r) + as.factor(c) + 0, data=subs, setting="KS2014"),
           error = function(e) e, warning = function(w) w)

  if (!all(class(result) %in% c("error", "warning"))) {
    pass <- TRUE
  }
}

为了好玩,您可以设置重复次数的上限,这样您就不会陷入糟糕数据集的无限循环中。

于 2017-03-27T07:50:15.050 回答
-1

在阅读了有关稳健线性回归的更多信息后,我想我更好地理解了问题的根源。如本文所述并在lmrob.control 的文档中提到,稳健回归的第一步涉及对输入数据进行二次抽样。在具有许多分类预测变量的情况下,子样本包含共线性列的可能性更高,这会导致矩阵不是满秩,因此会报告“DGELS”错误。lmrob 中的“KS2011”和“KS2014”设置允许您指定算法在选择子样本时应特别注意避免共线列,但是在数据点数量不大于模型中的变量数量(有时我的应用程序就是这种情况),该算法仍然无法从初始起点找到非奇异数据子集,并且仍然失败。这并不能解释为什么重新启动一个新的 R 会话可以帮助 lmrob 找到一个非奇异子集,

于 2017-08-09T20:55:46.533 回答