卡住子采样迭代方案的“奇怪”问题(使用try(...))

时间:2013-08-05 18:39:18

标签: r random

我正在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]]中:   重新启动中断的承诺评估

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

1 个答案:

答案 0 :(得分:-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({...})里面的代码中我没有设置种子。不过也许吧 打包的代码中的函数正在发生一些事情 我使用:&#34; rfCMA&#34;来自包&#34; CMA&#34;,它本身使用&#34; randomForest&#34; 来自同名的包装&#34; rfCMA&#34;。 &#34; mtry&#34;在随机森林中 优化功能&#34;调&#34;也来自&#34; CMA&#34; -package。

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