如何使用 R 在回归线上找到最低值和最高值?
How to find the lowest and highest values on a regression line with R?
我有类似的数据:
sample <- read.table(text =
" value date
-5.4 2017-03-01
-2.2 2017-03-05
-1.1 2017-03-10
4.9 2017-03-12
4.8 2017-03-22
5.6 2017-04-02
-0.3 2017-04-11
0.6 2017-04-16
3.3 2017-04-20
5.2 2017-04-22 ", header = T)
sample$date = as.Date(sample$date)
我用这些值绘制了线性回归趋势图:
plot(sample$date,sample$value)
abline(lm(sample$value ~ sample$date))
我想从回归线中找出最低和最高 'value' 之间的差异。我在图上用红色标记了这些点。
如何在 R 中做到这一点?
我的想法是以某种方式在回归线上制作一列值,对应于我数据集的每个日期,但我很难做到这一点。
它可以像这样简单(我已将您的数据框重命名为 SAMPLE
并从模型公式中删除 $
):
fit <- lm(value ~ date, data = SAMPLE)
diff(range(fit$fitted))
My idea is to somehow make a column of values on the regression line corresponding each date of my dataset, but I struggle to do that.
你要的栏目叫做"fitted values"和lm
returns它。
备注1
上面的结果无论是上升线还是下降线总是一些正值,因为range
returns min
在max
之前。您可以通过斜率的符号来调整它,使上升线为正,下降线为负。
diff(range(fit$fitted)) * sign(fit$coef[2])
备注2
正如 Maurits Evers 评论的那样,您还可以使用 predict(fit)
而不是 fit$fitted
。
library(tidyverse)
fit <- lm(value ~ date, data = sample)
sample%>%
arrange(desc(date))%>%
mutate(prd=map_dbl( sample$date,~predict (fit,newdata=data.frame(date=.x))))%>%
summarise(max(prd)-min(prd))%>%as.numeric()
[1] 5.133998
我有类似的数据:
sample <- read.table(text =
" value date
-5.4 2017-03-01
-2.2 2017-03-05
-1.1 2017-03-10
4.9 2017-03-12
4.8 2017-03-22
5.6 2017-04-02
-0.3 2017-04-11
0.6 2017-04-16
3.3 2017-04-20
5.2 2017-04-22 ", header = T)
sample$date = as.Date(sample$date)
我用这些值绘制了线性回归趋势图:
plot(sample$date,sample$value)
abline(lm(sample$value ~ sample$date))
我想从回归线中找出最低和最高 'value' 之间的差异。我在图上用红色标记了这些点。
如何在 R 中做到这一点?
我的想法是以某种方式在回归线上制作一列值,对应于我数据集的每个日期,但我很难做到这一点。
它可以像这样简单(我已将您的数据框重命名为 SAMPLE
并从模型公式中删除 $
):
fit <- lm(value ~ date, data = SAMPLE)
diff(range(fit$fitted))
My idea is to somehow make a column of values on the regression line corresponding each date of my dataset, but I struggle to do that.
你要的栏目叫做"fitted values"和lm
returns它。
备注1
上面的结果无论是上升线还是下降线总是一些正值,因为range
returns min
在max
之前。您可以通过斜率的符号来调整它,使上升线为正,下降线为负。
diff(range(fit$fitted)) * sign(fit$coef[2])
备注2
正如 Maurits Evers 评论的那样,您还可以使用 predict(fit)
而不是 fit$fitted
。
library(tidyverse)
fit <- lm(value ~ date, data = sample)
sample%>%
arrange(desc(date))%>%
mutate(prd=map_dbl( sample$date,~predict (fit,newdata=data.frame(date=.x))))%>%
summarise(max(prd)-min(prd))%>%as.numeric()
[1] 5.133998