如何解决R语言nls函数报错:Convergence failure: false convergence (8)
R中nls函数拟合小波动数据出现false convergence的解决办法
报错原因
你使用的数据集df2中Numbers列的数值波动幅度极小,远小于数值本身的量级,默认收敛阈值下port算法检测到梯度变化过小,误判为无法收敛,触发false convergence (8)报错。此外你当前使用的模型对待估参数b1、b2是纯线性的,本身不需要调用非线性最小二乘函数nls,选错拟合工具也额外增加了收敛风险。
解决办法
- 最优方案:改用线性回归函数
lm拟合,完全规避收敛问题,结果精度更高
你的模型Numbers ~ b1*Days^2 + b2对待估参数属于线性形式,直接运行以下代码即可得到无误差的拟合结果:mod2 <- lm(Numbers ~ I(Days^2), data = df2) # 输出结果中,截距项对应b2,I(Days^2)的系数对应b1 - 若必须使用
nls函数,调整收敛控制参数即可正常运行
调宽松残差收敛阈值,同时开启警告仅提示模式不强制终止运行:mod2 <- nls(Numbers ~ b1*Days^2+b2, start = list(b1 = 0,b2 = 0), data = df2, algorithm = "port", control = nls.control(ftol = 1e-6, warnOnly = TRUE)) - 备选方案:更换拟合算法,可改用
minpack.lm包中的nlsLM函数,对低波动数据的收敛兼容性更好,对初值要求更低。
内容的提问来源于stack exchange,提问作者user16774617
相关产品推荐
相关产品推荐

