R语言 当nls模型无法拟合数据时,如何返回NA?

bxgwgixi  于 2024-01-03  发布在  其他
关注(0)|答案(1)|浏览(126)

我正在应用分组nlsLM模型并求解它以获得每个组的y最高时的x值。但有些研究给出了以下错误
mutate()中的错误:In argument:model = map(data, ~nlsLM(y ~ SSlinp(x, a, b, xs), data = .x))。由map()中的错误引起:In index:2。由nlsModel()中的错误引起:!初始参数估计时的奇异梯度矩阵
如何避免这些研究,并运行那些可以运行nlsLM模型的研究?
下面是我使用示例数据的代码

  1. library(tidyverse)
  2. library(gslnls)
  3. library(broom)
  4. library(minpack.lm)
  5. library(nlraa)
  6. df %>%
  7. nest(data = -SN) %>%
  8. mutate(model = map(data, ~ nlsLM(y ~ SSlinp(x, a, b, xs), data = .x))) %>%
  9. mutate(x_opt = map(model, tidy)) %>%
  10. unnest(x_opt) %>%
  11. filter(term %in% "xs") %>%
  12. mutate(y_opt = unlist(map2(estimate, model, ~predict(.y, list(x = .x))))) %>%
  13. select(SN, estimate, y_opt)

字符串
数据

  1. df = structure(list(SN = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
  2. 3L, 3L, 3L, 3L, 3L), x = c(0L, 60L, 90L, 120L, 150L, 0L, 60L,
  3. 90L, 120L, 150L, 0L, 60L, 90L, 120L, 150L), y = c(3569.5, 6698.1,
  4. 6595.2, 6834.4, 6966.7, 3649.7, 4895.1, 5162, 4443.5, 5038.9,
  5. 4097.7, 5664.9, 5518.1, 7608.1, 8081.6)), class = "data.frame", row.names = c(NA,
  6. -15L))

rdrgkggo

rdrgkggo1#

这是一个笨拙的部分解决方案,你必须添加一个类似的my_predict函数,如果模型不好,它将返回正确的null/NA结果。
或者,您可以在模型拟合阶段之后中断管道,并删除不工作的模型(例如filter(!inherits(model, "try-error"))或类似的模型),然后在剩余元素上运行tidy/predict

  1. empty <- tibble(
  2. term = c("a", "b", "xs"),
  3. estimate = NA_real_,
  4. std.error = NA_real_,
  5. p.value = NA_real_
  6. )
  7. my_tidy <- function(m) {
  8. if (inherits(m, "try-error")) empty else broom::tidy(m)
  9. }
  10. df %>%
  11. nest(data = -SN) %>%
  12. mutate(model = map(data, ~ try(nlsLM(y ~ SSlinp(x, a, b, xs), data = .x)))) %>%
  13. mutate(x_opt = map(model, my_tidy)) %>%
  14. unnest(x_opt) %>%
  15. filter(term %in% "xs")

字符串

展开查看全部

相关问题