【问题标题】:Specify regression line intercept (R & ggplot2)指定回归线截距 (R & ggplot2)
【发布时间】:2015-10-28 01:16:41
【问题描述】:

背景

我现在的情节是这样的:

问题

我想强制 station_1 的回归线从 1 开始。

代码

 library(ggplot2)

 #READ IN DATA
 var_x = c(2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011)
 var_y = c(1.000000,1.041355,1.053106,1.085738,1.126375,1.149899,1.210831,1.249480,1.286305,1.367923,1.486978,1.000000,0.9849343,0.9826141,0.9676000,0.9382975,0.9037476,0.8757748,0.8607960,0.8573634,0.8536138,0.8258877)
 var_z = c('Station_1','Station_1','Station_1','Station_1','Station_1','Station_1','Station_1','Station_1','Station_1','Station_1','Station_1','Station_2','Station_2','Station_2','Station_2','Station_2','Station_2','Station_2','Station_2','Station_2','Station_2','Station_2')

 df_data = data.frame(var_x,var_y,var_z)

 out = ggplot(df_data,aes(x=var_x,y=var_y,group=var_z))       
 out = out + geom_line(aes(linetype=var_z),size=1)  
 out = out + theme_classic()

 #SELECT DATA FOR Station_1
 PFI_data=subset(df_data,var_z=="Station_1")

 #PLOT REGRESSION FOR Station_1
 out = out+ stat_smooth(data = PFI_data,
                   method=lm,
                   formula = y~x,
                   se=T,size = 1.4,colour = "blue",linetype=1)

任何帮助将不胜感激 - 这让我发疯太久了!

【问题讨论】:

    标签: r ggplot2 regression


    【解决方案1】:

    首先,将回归线强制到某个固定点时应该小心。这是一个 link 讨论原因。

    现在,从技术角度来看,我非常依赖这些问题和答案:onetwo。我的解决方案的概要如下:预先计算所需的截距,在没有它的情况下运行回归,将截距添加到结果预测中。

    我正在使用内部ggplot2:::predictdf.default 函数来节省一些输入。 cbind(df, df) 部分可能看起来很奇怪,但要使geom_smooth 正常工作是一个简单的技巧,因为var_z 中有两个因子级别。

    # Previous code should remain intact, replace the rest with this:
    # SELECT DATA FOR Station_1
    PFI_data=subset(df_data,var_z=="Station_1")
    names(PFI_data) <- c("x", "y", "z")
    
    x0 <- df_data[df_data$var_z == "Station_1", "var_x"][1]
    y0 <- df_data[df_data$var_z == "Station_1", "var_y"][1]
    
    model <- lm(I(y-y0) ~ I(x-x0) + 0, data = PFI_data)
    xrange <- range(PFI_data$x)
    xseq <- seq(from=xrange[1], to=xrange[2])
    df <- ggplot2:::predictdf.default(model, xseq, se=T, level=0.95)
    df <- rbind(df, df)
    df[c("y", "ymin", "ymax")] <- df[c("y", "ymin", "ymax")] + y0
    out + geom_smooth(aes_auto(df), data=df, stat="identity")
    

    【讨论】:

    • 感谢您对强制它通过一个点的谨慎。我完全同意你的看法,但我的主管坚持我这样做,也无视我的警告!
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2011-11-12
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2016-11-07
    • 2018-01-02
    • 2017-04-03
    相关资源
    最近更新 更多