Невозможно подавить предупреждения или сообщения при использовании nls2::nls2 в R

Я пытаюсь подогнать ~100 наборов данных к формуле триэкспоненциального распада, и данные часто не подходят. Это нормально, но я не могу подавить миллионы предупреждений, которые это производит. Поскольку это часть скрипта уценки, в итоге я получаю страницы и страницы повторяющихся предупреждающих сообщений.

Вот пример моих данных, которые я назвал DF:

structure(list(Time_min = c(19, 34, 49, 64, 94, 124, 154, 184, 
214, 244, 304), Concentration = c(477.08, 284.26, 189.16, 134.66, 
74.32, 53.04, 28.16, 16.78, 9.24, 8.7, 4.42)), row.names = c(NA, 
-11L), class = "data.frame")

И вот пример того, что я пробовал:

StartGuess <- data.frame(A = c(100, 500),
                         alpha = c(0.01, 0.5),
                         B = c(100, 500),
                         beta = c(0.001, 0.05),
                         G = c(10, 100),
                         gamma = c(0.0001, 0.01))

suppressMessages(nls2::nls2(Concentration ~ A * exp(-alpha * Time_min) +
                            B * exp(-beta * Time_min) +
                            G * exp(-gamma * Time_min), 
                      data = DF, start = StartGuess))

suppressWarnings(nls2::nls2(Concentration ~ A * exp(-alpha * Time_min) +
                            B * exp(-beta * Time_min) +
                            G * exp(-gamma * Time_min), 
                      data = DF, start = StartGuess))


suppressWarnings(
      suppressMessages(nls2::nls2(Concentration ~ A * exp(-alpha * Time_min) +
                                  B * exp(-beta * Time_min) +
                                  G * exp(-gamma * Time_min), 
                            data = DF, start = StartGuess)))

Как бы я ни пытался что-то подавить, я получаю список ошибок, таких как:

Error in numericDeriv(form[[3L]], names(ind), env) : 
  Missing value or an infinity produced when evaluating the model
Error in (function (formula, data = parent.frame(), start, control = nls.control(),  : 
  singular gradient

Чтобы было ясно, я ожидаю сообщения и ошибки, потому что знаю, что мне часто не хватает данных для адекватного описания триэкспоненциального распада, но должен быть какой-то способ подавить все эти предупреждения, не должно быть?


person shirewoman2    schedule 15.05.2020    source источник


Ответы (2)


Я собираюсь предложить комбинацию capture.output(type="message", ...) и try(). Просто try() (или tryCatch()) не улавливает все сообщения, так как они исходят из глубины nls2::nls2...

cc <- capture.output(type="message",
         res <- try(nls2::nls2(Concentration ~ A * exp(-alpha * Time_min) +
                      B * exp(-beta * Time_min) +
                      G * exp(-gamma * Time_min), 
                      data = DF, start = StartGuess),
    silent=TRUE)
)

В этом случае res оказывается объектом типа try-error: вы можете обнаружить это и сделать то, что хотите, проверив if (inherits(res,"try-error")) ...

[1] "Error in result[[which.min(ss)]] : \n  attempt to select less than one element in get1index\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in result[[which.min(ss)]]: attempt to select less than one element in get1index>
person Ben Bolker    schedule 15.05.2020

Вы можете попробовать обернуть вызов в tryCatch. Это позволяет вам выполнять определенные функции, когда выражение выдает ошибку или предупреждение.

Когда вызов nls2 выдает ошибку, выполняется предоставленная функция и возвращается NULL, поэтому в вашей консоли нет спама.

tryCatch(
    expr = {
        nls2::nls2(...)
            },
    error = function(e) NULL,
    warning = function(w) NULL
)
person thorepet    schedule 15.05.2020