如何在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)
代码修改说明
- 错误捕获:用
possibly包装核心函数,避免单个分组拟合失败中断整个流程:safe_nlsLM:拟合失败时返回NULLsafe_tidy:模型为NULL时返回预设的tibble,保证unnest后数据结构一致
- 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
相关产品推荐
相关产品推荐

