问题描述
我在阅读 Hadley Wickham 所著的《R for Data Science》一书时开始产生这个问题。在“数据转换”一章中,作者使用了这个例子:
library(nycflights13)
library(tidyverse)
by_dest <- group_by(flights,dest)
delay <- summarise(by_dest,count = n(),dist = mean(distance,na.rm = TRUE),delay = mean(arr_delay,na.rm = TRUE)
)
#> `summarise()` ungrouping output (override with `.groups` argument)
delay <- filter(delay,count > 20,dest != "HNL")
# It looks like delays increase with distance up to ~750 miles
# and then decrease. Maybe as flights get longer there's more
# ability to make up delays in the air?
ggplot(data = delay,mapping = aes(x = dist,y = delay)) +
geom_point(aes(size = count),alpha = 1/3) +
geom_smooth(se = FALSE)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
输出图如下所示: relationship between delay and flight distance
所以我想知道我们是否可以使用R知道曲线的极值和对应的x值?
从 this answer 开始,我使用 ggpmisc 中的 stat_poly_eq() 计算多项式回归方程:
library(ggpmisc)
formula=y ~ poly(x,3,raw=TRUE)
p <- ggplot(data = delay,y = delay))
p <- p + geom_point(aes(size = count),alpha = 1/3)
p <- p+ geom_smooth(method = "lm",formula = formula,se = FALSE)
(p1 <- p+ stat_poly_eq(formula = formula,aes(label = paste(..eq.label..,..rr.label..,sep = "~~~")),parse = TRUE))
并使用该方程找出曲线的极值,我认为这非常不聪明。所以我想知道如何计算回归曲线的极值和对应的 x 值(不是原始数据的最大值和最小值,而是回归曲线的最大值和最小值)。
解决方法
您可以在第一个代码段中看到,您的 ggplot
调用输出了以下消息:
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
查看 geom_smooth
和 stat_smooth
的 documentation:
stats::loess() 用于少于 1,000 次的观察;否则 mgcv::gam() 与公式 = y ~ s(x,bs = "cs") 和 method = "REML" 一起使用。
因此,您只需对数据调用 stats::loess
以拟合 geom_smooth
曲线隐含的模型,然后使用 predict
方法获取实际范围之外的值。