【问题标题】:Dealing with an error in Sapply loop with nls - loop stops at first error and does not output any data使用 nls 处理 Sapply 循环中的错误 - 循环在第一个错误处停止并且不输出任何数据
【发布时间】:2021-03-24 12:58:49
【问题描述】:

我有一个非常大的数据集,其中包含一个自变量 (Kpl) 和几千个因变量 (Y1,... Yi)。

我想计算所有 Kpl Vs Yi 对的二次函数拟合的 AICc。

我有以下代码,我对几个样本进行了测试并运行良好

cor_data <- read.csv("R/data/experimental_data/kpl_1.csv") 
Kpl <- as.matrix(cor_data[,1])

sapply(cor_data[,-1], function(x) AICc(nls(x ~ a*exp(b*Kpl),start = list(a=1,b=1),control=list(maxiter=1000))))

当我在原始文件中添加更多样本时,如果出现错误,整个 sapply 循环停止并且不输出任何数据。我意识到某些模型将无法与我正在尝试的方程式相匹配,这很好,但是有没有办法强制 sapply 循环在错误后继续并给出实际样本的结果工作吗?

如果它还可以打印出拟合失败的原因,则有好处,因为它可能是一堆不同的事情(低于最小因子、高于最大值或错误的起始值)。

【问题讨论】:

  • 你在找tryCatch

标签: r error-handling sapply non-linear-regression nls


【解决方案1】:

您可以使用 try-catch 或查看 tidyverse 中的 tidy-evaluation:

evalF <- function(x){
  fit <- try(nls(x ~ a * exp(b * Kpl),
                 start = list(a = 1, b = 1),
                 control = list(maxiter = 1000)))
  if(!inherits(fit, 'try-error'))
    AIC(fit)
  else
    NULL
}
sapply(cor_data[, -1], evalF)

如果您想打印错误消息,您可以简单地将fit 而不是NULL 或类似的print 返回到控制台。考虑在后一种情况下使用warning(...) 函数来进行格式化。

【讨论】:

  • 我的荣幸。如果您发现它解决了您的问题,请记住将答案标记为“答案”(答案本身的左上角)。它奖励像我这样努力工作的人,他们花时间拖延回答关于 SO 的问题。 ;-)
  • 我做到了,但我太菜鸟了,无法看到我的选票:D
  • 确保也点击小“复选”标记。 ;-)
猜你喜欢
  • 1970-01-01
  • 2017-08-15
  • 2017-12-02
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多