使用 nls 处理 Sapply 循环中的错误 - 循环在第一个错误处停止并且不输出任何数据

Dealing with an error in Sapply loop with nls - loop stops at first error and does not output any data

我有一个非常大的数据集,其中包含一个自变量 (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循环停止并且不输出任何数据。我意识到有些模型将无法与我正在尝试的方程式相吻合,这很好,但是有没有办法在错误发生后强制应用循环继续并给出实际样本的结果工作?

如果它还可以打印出拟合失败的原因,那就更好了,因为它可能是一堆不同的东西(低于 minfactor,高于 maxiter 或错误的起始值)。

您可以使用 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)

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