在 R 中提取多项式模型对象的临界点?
Extract critical points of a polynomial model object in R?
我正在尝试求解已拟合数据的三次多项式函数的拐点,即一阶导数为零的 x 值。
我还需要一种方法来找到 x 的临界点处的 y 值。
使用 lm()
拟合模型并使用 summary()
查看模型质量非常容易。我可以通过添加预测和使用 geom_line()
.
轻松绘制函数
必须是专门针对此问题的包或基本 R 函数。谁能推荐一个方法?
下面是描述问题的代表。不用说,画箭头只是为了说明问题;它们没有映射到真正的拐点,否则我不会问这个问题...
library(tidyverse)
library(modelr)
set.seed(0)
#generate random data and plot the values
df <- tibble(x= sample(x= c(-100:200), size= 50),
y= -0.5*(x^3) + 50*(x^2) + 7*(x) + rnorm(n=50, mean=10000, sd=50000) )
df %>% ggplot(aes(x, y)) +
geom_point()
# fit a model to the data
cubic_poly_model <- lm(data= df, formula = y~poly(x, 3))
# plot the fitted model
df %>%
add_predictions(model = cubic_poly_model) %>%
ggplot(aes(x, y))+
geom_point(alpha=1/3)+
geom_line(aes(x, y=pred))+
annotate('text', label= 'critical point A', x=-50, y=-250000)+
geom_segment(x=-50, xend=-10, y=-200000, yend=-5000, arrow = arrow(length=unit(3, 'mm'), type = 'closed'))+
annotate('text', label= 'critical point B', x=140, y=400000)+
geom_segment(x=110, xend=90, y=300000, yend=100000, arrow = arrow(length=unit(3, 'mm'), type = 'closed'))
# But how can I get the critical values of x and the y values they produce?
由 reprex package (v0.3.0)
于 2020-09-03 创建
我使用 mosaic
包设计了一个解决方案。 makeFun()
函数允许将模型对象转换为函数。然后,您可以使用基数 R optimize()
来查找指定区间(在本例中为 x 值的范围)内该函数的最大值或最小值。在 optimize()
中指定“最大值”参数以说明您是想要局部最大值还是局部最小值。
查看下面的代码:
library(magrittr)
set.seed(0)
#generate random data and plot the values
df <- tibble::tibble(x= sample(x= c(-100:200), size= 50),
y= -0.5*(x^3) + 50*(x^2) + 7*(x) + rnorm(n=50, mean=10000, sd=50000) )
cubic_poly_model <- lm(data= df, formula = y~poly(x, 3))
crit_values <- cubic_poly_model %>%
mosaic::makeFun() %>%
optimize(interval = c(min(df$x), max(df$x)), maximum = TRUE)
funct_crit_x <- crit_values[['maximum']][[1]]
funct_max <- crit_values[['objective']]
funct_crit_x
funct_max
我正在尝试求解已拟合数据的三次多项式函数的拐点,即一阶导数为零的 x 值。
我还需要一种方法来找到 x 的临界点处的 y 值。
使用 lm()
拟合模型并使用 summary()
查看模型质量非常容易。我可以通过添加预测和使用 geom_line()
.
必须是专门针对此问题的包或基本 R 函数。谁能推荐一个方法?
下面是描述问题的代表。不用说,画箭头只是为了说明问题;它们没有映射到真正的拐点,否则我不会问这个问题...
library(tidyverse)
library(modelr)
set.seed(0)
#generate random data and plot the values
df <- tibble(x= sample(x= c(-100:200), size= 50),
y= -0.5*(x^3) + 50*(x^2) + 7*(x) + rnorm(n=50, mean=10000, sd=50000) )
df %>% ggplot(aes(x, y)) +
geom_point()
# fit a model to the data
cubic_poly_model <- lm(data= df, formula = y~poly(x, 3))
# plot the fitted model
df %>%
add_predictions(model = cubic_poly_model) %>%
ggplot(aes(x, y))+
geom_point(alpha=1/3)+
geom_line(aes(x, y=pred))+
annotate('text', label= 'critical point A', x=-50, y=-250000)+
geom_segment(x=-50, xend=-10, y=-200000, yend=-5000, arrow = arrow(length=unit(3, 'mm'), type = 'closed'))+
annotate('text', label= 'critical point B', x=140, y=400000)+
geom_segment(x=110, xend=90, y=300000, yend=100000, arrow = arrow(length=unit(3, 'mm'), type = 'closed'))
# But how can I get the critical values of x and the y values they produce?
由 reprex package (v0.3.0)
于 2020-09-03 创建我使用 mosaic
包设计了一个解决方案。 makeFun()
函数允许将模型对象转换为函数。然后,您可以使用基数 R optimize()
来查找指定区间(在本例中为 x 值的范围)内该函数的最大值或最小值。在 optimize()
中指定“最大值”参数以说明您是想要局部最大值还是局部最小值。
查看下面的代码:
library(magrittr)
set.seed(0)
#generate random data and plot the values
df <- tibble::tibble(x= sample(x= c(-100:200), size= 50),
y= -0.5*(x^3) + 50*(x^2) + 7*(x) + rnorm(n=50, mean=10000, sd=50000) )
cubic_poly_model <- lm(data= df, formula = y~poly(x, 3))
crit_values <- cubic_poly_model %>%
mosaic::makeFun() %>%
optimize(interval = c(min(df$x), max(df$x)), maximum = TRUE)
funct_crit_x <- crit_values[['maximum']][[1]]
funct_max <- crit_values[['objective']]
funct_crit_x
funct_max