能否利用nlsList对象实现反向预测,估算给定y对应的x值?
解决nlsList模型反推x值的问题
nlsList本质是分组的nls模型集合,每个元素都是标准的nls对象,刚好能适配invest函数的要求——只需要逐个处理每个子模型即可:
方法1:用investr包逐个处理子模型
假设你的nlsList对象名为my_nlsList,需要反推的目标y值按分组顺序存在target_y向量里,直接用mapply遍历每个模型和对应的y值:
library(investr) # 按分组顺序传入目标y值,得到对应x的估算值 pred_x <- mapply(function(sub_mod, y_val) { # 可根据需求设置interval参数,比如"confidence"获取置信区间 invest(sub_mod, y = y_val, interval = "none")$x }, my_nlsList, target_y)
方法2:手动实现非线性反推(无需额外包)
如果不想依赖investr,可利用uniroot函数求解非线性方程f(x) = y。先定义反推函数,再遍历子模型:
# 定义反推函数:计算模型预测值与目标y的差值,用于找根 inv_function <- function(x, model, target_y) { predict(model, newdata = data.frame(x = x)) - target_y } # 遍历每个子模型,求解对应x值 pred_x <- lapply(seq_along(my_nlsList), function(i) { sub_mod <- my_nlsList[[i]] y_val <- target_y[i] # 需根据你的数据设置合理的x搜索区间,避免无解或收敛失败 uniroot(inv_function, interval = c(0, 20), model = sub_mod, target_y = y_val)$root }) # 转成向量方便查看 pred_x <- unlist(pred_x)
注意事项
- 搜索区间
interval必须覆盖真实x值的范围,否则uniroot会报错; - 如果模型存在多个解,需要根据业务逻辑限定区间或选择合适的解;
- 若分组数量多,可结合
dplyr或data.table将结果与分组信息绑定,方便后续分析。
内容的提问来源于stack exchange,提问作者dmedi
相关产品推荐
相关产品推荐

