如何从一组随机问题中删除收敛失败的模型?

How to remove the models that failed convergence from a set of random questions?

我想在问题中包含一些模型估计(例如 GARCH 模型)的随机复制。该代码随机使用不同的数据系列。在这个过程中,一些随机数据序列的 GARCH 估计可能无法达到数值收敛。因此,我需要以这样一种方式对 question/problem 进行编码,即它必须从问题集中删除未能收敛的模型。当我使用 R-exams 时如何编码?

基本思路

一般来说,在生成练习时使用随机数据时,有时会出现问题,例如,解没有落在期望的范围内(即变得太大或太小),或者由于数学上的难解性或数值问题(如您所指出的)等,该解决方案甚至不存在

当然,这种问题最好在数据生成过程中尽量避免,尽量不要出现。但是,这样做并不总是可行或不值得,因为问题很少发生。在这种情况下,我通常会在必要时使用 while() 循环来重新生成随机数据。由于这可能 运行 可能会进行多次迭代,因此重要的是,使可能足够小以至于需要它。

工作示例

可以在软件包附带的 fourfold 练习中找到一个可行的示例。它随机生成一个四倍 table 的概率,随后应在实际练习中从部分信息中重建这些概率。为了明确定义练习,table 的所有条目必须(严格)介于 0 和 1 之间,并且它们的总和必须为 1。模拟代码实际上试图确保可能会出现边缘情况。与其编写更多代码来避免这些边缘情况,一个简单的 while() 循环会尝试捕获它们并在需要时对新的 table 进行采样:

ok <- FALSE
while(!ok) {
  [...generate probabilities...]
  tab <- cbind(c(prob1, prob3), c(prob2, prob4))
  [...compute solutions...]
  ok <- sum(tab) == 1 & all(tab > 0) & all(tab < 1)
}

捕捉错误的应用

同样类型的策略也可以用于其他问题,例如您描述的问题。您可以将模型估计包装成类似

的代码
fit <- try(mymodel(...), silent = TRUE)

然后使用类似

的东西
ok <- !inherits(fit, "try-error")

除了不产生错误之外,您可能还需要假设所有系数都是正的(或类似的东西)。那么你会做:

ok <- !inherits(fit, "try-error") && all(coef(fit) > 0)

类似地,您可以检查模型的收敛性等。