求助:用minpack.lm::nlsLM拟合含双ifelse的非线性模型报错
问题解决:nlsLM拟合含条件分支模型的逻辑运算符错误
错误原因
你遇到的错误是因为在条件判断里用了标量逻辑运算符&&,它要求两侧都是单个逻辑值,但dayOfYear是长度为555的向量,直接用&&会触发类型转换错误。向量条件判断必须用向量版运算符&。
修正方案
把模型公式里的&&全部替换成&,示例如下:
假设你的原模型函数f类似这样:
f <- function(dayOfYear, tau_1_A, tau_2_A, ...) { ifelse(dayOfYear >= tau_1_A && dayOfYear < tau_2_A, model_part_A(dayOfYear, ...), ifelse(dayOfYear >= tau_1_B && dayOfYear < tau_2_B, model_part_B(dayOfYear, ...), base_value)) }
修正后:
f <- function(dayOfYear, tau_1_A, tau_2_A, ...) { ifelse(dayOfYear >= tau_1_A & dayOfYear < tau_2_A, model_part_A(dayOfYear, ...), ifelse(dayOfYear >= tau_1_B & dayOfYear < tau_2_B, model_part_B(dayOfYear, ...), base_value)) }
额外拟合建议
如果修正后仍有收敛问题,可尝试以下方法:
- 用
nls基础函数先测试,若收敛再换nlsLM; - 对参数做范围约束,比如在
nlsLM里用lower和upper参数限定参数取值区间; - 尝试将分段模型拆分为多个子模型分别拟合,再合并参数;
- 若双峰分布特征明显,可考虑用两个高斯/洛伦兹函数叠加的模型替代分段ifelse,比如:
这类连续模型通常比分段模型更容易被非线性拟合函数处理。double_peak <- function(x, a1, mu1, sigma1, a2, mu2, sigma2, base) { base + a1*dnorm(x, mu1, sigma1) + a2*dnorm(x, mu2, sigma2) }
内容的提问来源于stack exchange,提问作者Sophie Père
相关产品推荐
相关产品推荐

