我正在尝试将多项式或黄土拟合到一系列短数据(作物系数(Kc)〜生长度日(gdds))。 实际数据很短,其中
Kc <- c(0.1, 0.41, 0.54, 0.66, 0.85, 1)
gdd <- c(0, 90, 225, 270, 360, 630)
为了产生平滑的结果,我将其中 3 个数据集放在一起,如下所示。
Kc <- c(0.1, 0.41, 0.54, 0.66, 0.85, 1, 1.1, 1.41, 1.54, 1.66, 1.85, 2, 2.1, 2.41, 2.54, 2.66, 2.85, 3)
gdd <- c(0, 90, 225, 270, 360, 630, 630, 720, 855, 900, 990, 1260, 1260, 1350, 1485, 1530, 1620, 1890)
df <- data.frame(gdd = gdd, Kc = Kc)
R 中典型的多项式拟合如下所示:
Kc_fit <- lm(Kc ~ poly(gdd,4))
然而,这些结果相当差,并且增加多项式的次数并不会产生很大的差异。
ggplot(df, aes(x=gdd, y=Kc)) + geom_point() + stat_smooth(method='lm', formula = Kc ~ poly(gdd,4), size = 1)
上面的 ggplot 代码产生了我无法理解的奇怪结果。 不知道为什么会这样做。 否则,是否有人有任何想法可以让我对数据进行平滑多项式、黄土或其他拟合(其中拟合穿过点并且平滑量最小)?
我以前没有在 R 中遇到过这个问题,而且奇怪的是,它在将多项式拟合到这些数据时遇到了麻烦。 谢谢。
我不太清楚你所说的“很差”是什么意思:
Kc_fit <- lm(Kc ~ poly(gdd,4), df)
summary(Kc_fit)
Residual standard error: 0.1032 on 13 degrees of freedom
Multiple R-squared: 0.9898, Adjusted R-squared: 0.9866
(另一方面,简单的线性模型 (
Kc ~ gdd
) 的倍数 R^2 为 0.9873,调整后的 R^2 为 0.9865,因此添加多项式项并没有多大作用 - 尽管有 2.1四阶模型的 AIC 单位改进...)
您的绘图的问题是
stat_smooth
的公式始终必须根据x
和y
来指定,不是数据框中的原始变量,即在本例中为stat_smooth(method='lm', formula = y ~ poly(x,4))
: