使用线性回归的两个不同预测之间出现意外差异

时间:2016-06-06 13:29:29

标签: r ggplot2 linear-regression

我使用ggplot2绘制一些时间序列数据以及线性回归线。我有兴趣确定回归线何时达到82%。对图表进行目视检查表明这将在2017年11月15日左右发生。但是当我使用R predict.lm()功能时,我会得到一个不同的答案:2017年8月12日。不应该这些两种方法给我相同的答案?最后,我想用一个显示拦截日期的文字标签来注释图表。

require(ggplot2)
temp <- "End.Date    Save.Rate
1       2015-05-31     0.67
2       2015-07-31     0.67
3       2015-09-30     0.69
4       2015-11-30     0.71
5       2016-01-30     0.70
6       2016-03-31     0.72"

df <- read.table(text = temp, header = TRUE)
df$End.Date <- as.POSIXct(df$End.Date, origin="1970-01-01", tzone="America/New_York")

save.rate.lm = lm(End.Date ~ Save.Rate, data=df)
newdata <- data.frame(Save.Rate = 0.82)
temp <- predict.lm(save.rate.lm, newdata)
predicted.date <- as.POSIXct(as.data.frame(temp)[1,], origin="1970-01-01",
                             tzone="America/New_York")
print(predicted.date)

x.lims <- c(as.POSIXct(NA), as.POSIXct("2017-12-31", origin="1970-01-01",
                                       tzone="America/New_York"))
p <- ggplot(df, aes(x=End.Date, y=Save.Rate)) +
  geom_point() +
  stat_smooth(method='lm', fill=NA, fullrange=TRUE) + 
  theme(axis.text.x=element_text(angle = -45, hjust = 0)) +
  scale_y_continuous(labels = percent) +
  scale_x_datetime(breaks = date_breaks('month'), labels = date_format('%b-%Y'),
                   limits=x.lims) +
  geom_hline(yintercept=0.82)
print(p)

2 个答案:

答案 0 :(得分:6)

您不能只是反转线性回归(即date ~ 1+rate vs rate ~ 1 +date)并期望获得相同的答案(例如,请参阅this question on CrossValidated)。据我所知,没有简单的方法可以在逆回归上使用predict.lm来获得您正在寻找的答案。您需要根据日期拟合利率并使用某些代数来获得预测日期。下面我展示一个适合您特定问题的简单计算; this questionthis question的答案为您提供了一些额外的固定解决方案......

fit2 = lm(Save.Rate ~ End.Date, data=df)
## y = a + bx
## x* = (y-a)/b
cc <- coef(fit2)
pred.date <- as.POSIXct((0.82-cc[1])/cc[2],origin="1970-01-01",
                             tzone="America/New_York")
##               (Intercept) 
## "2017-11-19 17:26:28 EST" 

图片:

p+geom_vline(xintercept=as.numeric(pred.date),lty=2)

enter image description here

答案 1 :(得分:2)

Ben Bolker解释了为什么你的方法不起作用。

但是,您可以使用coord_flip在ggplot2中翻转轴,并在x方向(而不是通常的y方向)上使用带有误差项的回归:

p <- ggplot(df, aes(y=End.Date, x=Save.Rate)) +
  geom_point() +
  stat_smooth(method='lm', fill=NA, fullrange=TRUE) + 
  theme(axis.text.x=element_text(angle = -45, hjust = 0)) +
  scale_y_datetime(breaks = date_breaks('month'), labels = date_format('%b-%Y'),
                   limits=x.lims) +
  geom_vline(xintercept=0.82) +
  geom_hline(yintercept = as.numeric(predicted.date)) + #to illustrate it works
  coord_flip()
print(p)

但是,建议不要这样做,因为您的时间值的不确定性很可能远小于Save.Rate值的不确定性。因此,你可能应该像你的情节那样进行回归Save.Rate ~ End.Date并做反向预测,如Ben的回答所示。