如何在R语言非线性最小二乘拟合代码中限制参数a和m
给非线性最小二乘拟合的参数a和m添加约束限制
gsl_nls函数支持通过lower和upper参数直接设置参数的上下界约束,以此限制a和m的取值范围。下面是修改后的完整代码(示例中设置a>0,m在0到5之间,你可根据实际需求调整约束范围):
set.seed(1) pacman::p_load(gslnls, dplyr) n <- 50 Datos <- data.frame( theta = (1:n) / n, Xb_exp = 2.5 * exp(-1.5 * (1:n) / n) + rnorm(n, sd = 0.1)) plot(Datos$theta,Datos$Xb_exp) # 添加参数约束:通过lower和upper指定参数范围 Ajuste <- gsl_nls( fn = y ~ 1 - exp(-a * ((x - (-2))/length(Xb_exp))^(m + 1)), data = data.frame(y = Datos$Xb_exp, x = Datos$theta), start = c(a = 1, m = 1), algorithm = "lmaccel", control = gsl_nls_control(scale = "levenberg", avmax = 0.75), trace = TRUE, # 自定义约束:a下限为0(无上限),m下限0、上限5 lower = c(a = 0, m = 0), upper = c(a = Inf, m = 5) ) summary(Ajuste) a <- predict(Ajuste, interval="prediction", level=0.99) a <- a[, -c(2,3)] Datos <- mutate(Datos, Xb_mod = a) plot(Datos$theta, Datos$Xb_mod)
关键说明
lower定义参数的最小允许值,upper定义最大允许值,用Inf/-Inf表示无边界- 约束范围需根据模型逻辑调整,比如若要避免
m+1为0/负数,可将m的下限设为-0.99(避开-1) - 带约束的拟合会自动在指定范围内寻找最小二乘最优解,
gsl_nls的算法会适配约束条件完成参数优化
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

