首页 > 解决方案 > 如何强制多项式回归对于大急转弯非常灵活,同时降低小转弯的灵活性

问题描述

是否可以强制多项式回归对于大急转弯非常灵活,同时降低小转弯的灵活性?

原因是我有一个依赖于 x 的变量 y,尽管我的数据集包含一些噪音,但我确信它存在正相关。这就是为什么我不希望 x 在 1 到 75 之间有一条摆动线,如下图所示。

library(ggplot2)
library(dplyr)

x <- c(1:100)
y <- c(1,3,6,12,22,15,13,11,5,1,3,6,12,22,11,5,1,3,6,12,22,11,5,5,9,10,1,6,12,22,15,13,11,5,-1,-12,-23,6,12,22,11,5,1,3,6,12,22,11,5,-11,-22,-9,12,22,11,5,9,10,18,1,3,6,12,22,15,13,11,5,-5, -9, -12,6,12,22,11,5,1,3,6,12,22,11,5,1,3,6,12,22,11,5,9,10,18,28,37,50,90,120,150,200)
y <- y + x

df <- data.frame(x, y)

model <- lm(y ~ poly(x, 6, raw = TRUE), data = df)

predictions <- model %>% predict(df)
df <- cbind(df, predictions) 

ggplot() + 
  geom_point(data = df, aes(x = x, y = y), size = 0.1) +
  geom_line(data = df, aes(x = x, y = predictions), colour="blue", size=0.1) 

在此处输入图像描述

我可以将模型更改为:

model <- lm(y ~ poly(x, 2, raw = TRUE), data = df)

这给出了这个图表:

在此处输入图像描述

在这种情况下,模型对于 x 在 0 到 90 之间没有摆动,尽管它缺少使 x 为 90 的转弯的灵活性。

我不是在为这个示例数据集寻找特定的解决方案。我正在寻找一种解决方案,使多项式回归足够灵活,以进行急转弯(大转弯),同时减少小转弯的摆动。(也许这可以通过限制最多 n 圈来解决?)

我想在几个数据集上自动使用它。出于这个原因,我不想为不同的模型指定不同的 x 范围。

谢谢!

我也尝试过使用 mgcv 中的 gam,尽管这给出了类似的结果:

mygam <- gam(y ~ s(x, k = 7), data = df)

在此处输入图像描述

mygam <- gam(y ~ s(x, k = 3), data = df)

在此处输入图像描述

该图基于 pmax(p1, p2),其中 p1 和 p2 是两个多项式:

在此处输入图像描述

标签: rregressionpolynomials

解决方案


推荐阅读