You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在nlsLM模型拟合失败时返回NA并跳过异常分组?

解决分组拟合nlsLM时跳过失败组并返回NA的问题

针对你遇到的奇异梯度矩阵导致拟合失败的问题,可以通过purrr包的possibly函数捕获错误,让拟合失败的分组返回NULL,后续流程自动处理为NA。以下是修改后的完整代码:

library(tidyverse)
library(gslnls)
library(broom)
library(minpack.lm)
library(nlraa)

# 定义安全版nlsLM:拟合失败时返回NULL
safe_nlsLM <- possibly(nlsLM, otherwise = NULL)
# 定义安全版tidy:模型为NULL时返回含xs项和NA的结果
safe_tidy <- possibly(tidy, otherwise = tibble(term = "xs", estimate = NA_real_))

df %>%
  nest(data = -SN) %>%
  # 使用安全版nlsLM拟合,失败组返回NULL
  mutate(model = map(data, ~ safe_nlsLM(y ~ SSlinp(x, a, b, xs), data = .x))) %>% 
  # 使用安全版tidy提取参数,保证每个分组都有xs项的结果
  mutate(x_opt = map(model, safe_tidy)) %>%
  unnest(x_opt) %>% 
  filter(term == "xs") %>% 
  # 计算最优x对应的y值,模型为NULL时返回NA
  mutate(y_opt = map2_dbl(estimate, model, ~ if(is.null(.y)) NA_real_ else predict(.y, list(x = .x)))) %>%
  select(SN, estimate, y_opt)

代码修改说明

  1. 错误捕获:用possibly包装核心函数,避免单个分组拟合失败中断整个流程:
    • safe_nlsLM:拟合失败时返回NULL
    • safe_tidy:模型为NULL时返回预设的tibble,保证unnest后数据结构一致
  2. NA值处理:计算y_opt时通过is.null(.y)判断模型是否存在,不存在则返回NA_real_

运行结果

针对你的样本数据,输出结果如下:

# A tibble: 3 × 3
     SN estimate y_opt
  <int>    <dbl> <dbl>
1     1     150. 6967.
2     2       NA    NA
3     3     150. 8082.

分组2因无法拟合模型,estimate和y_opt均返回NA,不影响其他分组的结果。

内容的提问来源于stack exchange,提问作者UseR10085

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:25:19