R 脚本之NLS 不工作

TianFang 阅读:17 2024-02-06 11:00:25 评论:0

我有 5 个 (x,y) 数据点,我试图找到一个最合适的解决方案,该解决方案由两条线组成,两条线相交于一个点 (x0,y0),并且遵循以下等式:

y1 = (m1)(x1 - x0) + y0 
y2 = (m2)(x2 - x0) + y0 

具体来说,我要求交集必须出现在 x=2 和 x=3 之间。看一下代码:

#Initialize x1, y1, x2, y2 
x1 <- c(1,2) 
y1 <- c(10,10) 
 
x2 <- c(3,4,5) 
y2 <- c(20,30,40) 
 
g <- c(TRUE, TRUE, FALSE, FALSE, FALSE) 
 
q <- nls(c(y1, y2) ~ ifelse(g == TRUE, m1 * (x1 - x0) + y0, m2 * (x2 - x0) + y0), start = c(m1 = -1, m2 = 1, y0 = 0, x0 = 2), algorithm = "port", lower = c(m1 = -Inf, m2 = -Inf, y0 = -Inf, x0 = 2), upper = c(m1 = Inf, m2 = Inf, y0 = Inf, x0 = 3)) 
coef <- coef(q) 
m1 <- coef[1] 
m2 <- coef[2] 
y0 <- coef[3] 
x0 <- coef[4] 
 
#Plot the original x1, y1, and x2, y2 
plot(x1,y1,xlim=c(1,5),ylim=c(0,50)) 
points(x2,y2) 
 
#Plot the fits 
x1 <- c(1,2,3,4,5) 
fit1 <- m1 * (x1 - x0) + y0 
lines(x1, fit1, col="red") 
 
x2   <- c(1,2,3,4,5) 
fit2 <- m2 * (x2 - x0) + y0 
lines(x2, fit2, col="blue") 

因此,您可以看到此处列出的数据点。然后,我通过我的 nls 运行它,获取我的参数 m1m2x0y0(斜率, 和交点)。

但是,看看解决方案:

显然,红线(应该仅基于前 2 个点)不是前 2 个点的最佳拟合线。这与蓝线(第二次拟合)的情况相同,应该取决于最后 3 个点)。这里有什么问题?

请您参考如下方法:

这是分段回归:

# input data 
 
x1 <- c(1,2); y1 <- c(10,10); x2 <- c(3,4,5);  y2 <- c(20,30,40)  
x  <- c(x1, x2); y <- c(y1, y2) 
 
# segmented regression 
 
library(segmented) 
fm <- segmented.lm(lm(y ~ x), ~ x, NA, seg.control(stop.if.error = FALSE, K = 2)) 
summary(fm) 
 
# plot 
 
plot(fm) 
points(y ~ x) 

有关详细信息,请参阅 ?lm?segmented.lm?seg.control


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号