【问题标题】:How can I fit two linear regression in the same data?如何在同一数据中拟合两个线性回归?
【发布时间】:2019-11-22 13:32:30
【问题描述】:

可能听起来很愚蠢,但假设我有:

x = c(1:10)
y = c(2,4,6,8,10,12,12.5,13,13.5,14)

散点图如下所示:

我不想拟合一个线性回归,而是拟合两个线性回归 eq。 1 当 x > a 和 eq. 2 当 x a。并且还从坡度变化时找到 a 值。在此示例中,a 从视觉分析中约为 6,但有没有办法更自动地找到它?

我正在寻找的是这样的:

【问题讨论】:

    标签: r statistics


    【解决方案1】:

    CRAN 包segmented 非常适合此类问题。使用起来甚至很简单。首先拟合一个线性模型,然后得到分段拟合。

    library(segmented)
    
    x <- 1:10
    y <- c(2,4,6,8,10,12,12.5,13,13.5,14)
    
    fit <- lm(y ~ x)
    segfit <- segmented(fit)
    

    现在是断点。 segfit$psi[2] 是断点。

    segfit$psi
    #       Initial Est.       St.Err
    #psi1.x     5.5    6 6.452643e-16
    

    摘要提供了更多信息。

    summary(segfit)
    

    并绘制图表。

    plot(x, y)
    plot(segfit, add=TRUE)
    

    【讨论】:

    • 打败我吧:-) 不错 +1
    【解决方案2】:

    当你绘图时:

    scatter.smooth(x,y) 
    

    你可以得到一条线: stating where is your break point or threshold point

    除此之外,您还可以使用 for 循环检查斜率在哪里发生变化:

    for(i in 1:length(x)){
    slope = (y[i+1]-y[i]/(x[i+1]-x[i]))
      print(paste(i,slope))
    }
    

    希望这会有所帮助。

    【讨论】:

    • 感谢 Tushar,这很有帮助。发现变化的相对简单的方法。
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2021-04-07
    • 2017-08-20
    • 2018-05-08
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多