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