0

我在 Linux 机器(服务器)上的 R 2.15.3 中执行子采样任务,其中在某些子采样迭代中出现错误(这只是由于不合适的子采样数据集)。

为了能够在没有循环停止的情况下运行许多子采样迭代,在每次迭代中我使用try()以下方式:

set.seed(1234)

interestingobject <- list()

for(i in 1:300) {

  anyproblems <- try(0 + "0")

  while(class(anyproblems) == "try-error") {

    anyproblems <- try({

      <code line 1>
      <code line 2>
      <code line 3>
        .
        .
        .

    })

  }

  interestingobject[[i]] <- <object from iteration i>

}

现在我有以下“奇怪”的问题:

经过几次迭代后,第一个错误发生在 try({ ... }). 我认为这没有问题,因为“while”循环应该继续,直到不再try({ ... })发生错误。但问题是,在第一个错误发生后,同样的错误一次又一次地发生,因为抽取了相同的样本,我不知道为什么。

更新:在“代码行 1”行之前,我只是在代码中绘制一个随机cat(runif(1), "\n")try({ ... }) (我真的不知道这是怎么回事。我想这个问题可以通过与 R 生成/处理随机数(或类似的东西)的方式相关的东西来解释。

如果没有确切的代码,这似乎有点困难,但后者可能不会有太大帮助,因为它相当长且令人困惑。

如何解释发生这样的事情?

抽取的随机数也在循环中重复,所以实际上每两次迭代都会重复同样的事情。

编辑(可能对这个问题不重要):代码上的一些规范:在每次迭代中都会完成一个交叉验证,其中还有一个嵌套交叉验证,其中 - 使用交叉验证 - 在每个外部交叉中优化一个调整参数验证迭代。

也许值得知道的是,调整参数的调整——以及因此在相应的交叉验证中随机拆分成折叠——是由在代码之外定义的自写函数完成的。

更新 2:感谢评论者,我现在使用调试并发现当场发生第一个错误(仅来自一个类的观察)并且循环开始的地方也收到警告:

在 get(.obj, envir = dump[[.selection]]) 中:重新启动中断的 Promise 评估

也许这有帮助。这个警告信息是什么意思?可能是随机数生成器的种子重置了吗?

4

1 回答 1

-2

由于我没有更好的解决方案,我现在做了一个丑陋的解决方法,每次重复 try({...}) 中的过程时,它都会重新设置随机种子,无论是否有错误。由于随机选择的种子本身会受到随机数在循环中的问题的影响,因此它们是在整个子采样开始之前绘制的:

set.seed(1234)

interestingobject <- list()

########
# New: #
########
ranseed <- sample(1000000:10000000, size=100000)
count <- 1
#######

for(i in 1:300) {

  anyproblems <- try(0 + "0")

  while(class(anyproblems) == "try-error") {

    ########
    # New: #
    ########
    set.seed(ranseed[count])
    count <- count+1
    ########

    anyproblems <- try({

      <code line 1>
      <code line 2>
      <code line 3>
        .
        .
        .

    })

  }

  interestingobject[[i]] <- <object from iteration i>

}

由于这显然只是一个粗略的解决方案,如果有人能给我提示那里可能发生的事情,我仍然会非常高兴!

在 try({ ... }) 里面的代码中,我没有设置种子。但是,我使用的打包代码中的函数可能发生了一些事情:来自包“CMA”的“rfCMA”,它本身使用来自同名包“rfCMA”的“randomForest”。随机森林中的“mtry”也使用“CMA”包中的“tune”功能进行了优化。

编辑:我再次检查了 try({...}) 中的代码,没有发现任何错误。如果有人认为上述解决方案可能是错误的,请告诉!我不明白为什么它可能是错误的,因为每次在 try({...}) 内部发生错误时,相应的迭代都会被丢弃,并且通过 set.seed(ranseed[count]) 可以确定一个完全独立的迭代绘制。

于 2013-08-06T18:39:33.240 回答