指定回归线截距(R和ggplot2)

3

背景

我目前的情况如下所示:

enter image description here

问题

我想强制回归线从 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)

任何帮助都将不胜感激 - 这已经让我疯狂了太久!

1个回答

1
首先,当将回归线强制到某个固定点时,您应该小心。这里是一个讨论link
现在,从技术角度来看,我主要依赖以下问题和答案:one, two。我的解决方案概述如下:预计算所需的截距,运行没有它的回归,将截距添加到得到的预测值中。
我使用内部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")

enter image description here


谢谢你提醒我不要强行通过一个点。我完全同意你的看法,但是我的主管坚持让我这样做,而且也忽略了我的警告! - hoof_hearted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接