我知道如何在R中进行基本的多项式回归。不过,我只能使用nls
或lm
来拟合一条使点之间误差最小的直线。
大多数情况下这是有效的,但有时当数据中存在测量间隙时,模型变得非常违反直觉。是否有办法添加额外的约束条件?
可重现示例:
我想要将下面这组虚构数据(类似于我的真实数据)拟合到一个模型中:
x <- c(0, 6, 21, 41, 49, 63, 166)
y <- c(3.3, 4.2, 4.4, 3.6, 4.1, 6.7, 9.8)
df <- data.frame(x, y)
首先,让我们绘制它。
library(ggplot2)
points <- ggplot(df, aes(x,y)) + geom_point(size=4, col='red')
points
看起来如果我们用一条线连接这些点,它会改变方向3次,因此让我们尝试拟合一个四次函数。
lm <- lm(formula = y ~ x + I(x^2) + I(x^3) + I(x^4))
quartic <- function(x) lm$coefficients[5]*x^4 + lm$coefficients[4]*x^3 + lm$coefficients[3]*x^2 + lm$coefficients[2]*x + lm$coefficients[1]
points + stat_function(fun=quartic)
看起来这个模型与点相配得很好...除了一点,因为我们的数据在63和166之间有一个很大的间隙,所以那里有一个巨大的峰值,它没有理由存在于模型中。(对于我的实际数据,我知道那里没有巨大的峰值)
所以问题在于:
- 如何将局部最大值设置为(166,9.8)?
如果不可能,那么另一种方法是:
- 如何限制线性预测的y值不大于y=9.8?
或者也许有更好的模型可供使用?(而不是分段处理)。 我的目的是比较图表之间的模型特征。
ggplot
代码中添加如下内容:geom_smooth(method="lm", se=FALSE, formula=y ~ poly(x,4))
。 - eipi10geom_smooth(colour="red", se=FALSE, method="loess")
。当你有少量的点时,默认方法是loess
,因此如果您希望可以省略method
参数。 - eipi10