是否可以控制 GAM 中平滑函数的自由度适合 R,如果可以,如何控制?
Is it possible to control the degrees of freedom for the smooth functions in a GAM fit in R, and if so, how?
我正在使用 R 中的 mgcv
包来使 GAM 适合某些水文数据,如下所示:
d <- GAM_example_data[,1:4]
colnames(d) <- c("month","rain","pump","GWL")
fitted_GAM <- gam(GWL~s(month) + s(rain) + s(pump), data = d)
plot.gam(fitted_GAM)
当我得到从 plot.gam
输出的图时,它在 y 轴上告诉我每个平滑函数的自由度,这些通常是非整数值。 我希望能够控制所使用的每个平滑函数的自由度,有没有办法做到这一点?
我看到了指定 "knots" 并因此控制配合的参考资料,但我对 GAM 的概念还很陌生,而且我还没有找到任何明确的资源来解释这些是什么(如果它们甚至与我的问题完全相关。
gam
文档中有很多参数可以帮助您理解。
我认为对你的情况最有用的参数是 k
, 基础维度 。本质上,它使用 s
设置平滑自由度的上限。 Here is some documentation.
所以你可能 运行,例如:
gam(GWL ~ s(month, k = 4) + ...)
然后使用 plot.gam
和 gam.check
检查您的模型。如果诊断看起来不太好,您可以向上或向下调整 k
直到它们得到改善。
编辑:根据this answer,s()
的fx = TRUE
参数将拟合具有固定自由度的回归样条。 k 将等于总 df 并且 k-1 = edf.
我一直在密切关注您对其他答案的回应。从你的回复看来,对GAM的几个概念都比较了解,那我就简答一下吧。
不幸的是,没有。 mgcv
GAM 不是使用backfitting 进行估计,而是通过GCV 或REML 对平滑参数进行联合估计。因此,与可以为每个样条项指定 df
的旧版 gam
包不同,您无法在 mgcv
.
中实现此目的
惩罚回归设置中控制平滑度的唯一方法是设置平滑参数sp
,但它与自由度的关系不是封闭形式,你无法预见。
另一个答案是建议你做一个没有惩罚的纯回归样条。通过设置等级 k
并发出信号 fx = TRUE
,您的自由度始终等于等级减一(由于居中约束),这是一个整数。
以下是我在平滑方面所做的一些其他回答。
解释了设置 df
在 smooth.spline
中的工作原理。注意这是backfitting GAM的基础
解释了纯回归样条的基础。当然,mgcv
提供了很多样条基 class,而不仅仅是 splines::bs
.
使用的 B 样条
我正在使用 R 中的 mgcv
包来使 GAM 适合某些水文数据,如下所示:
d <- GAM_example_data[,1:4]
colnames(d) <- c("month","rain","pump","GWL")
fitted_GAM <- gam(GWL~s(month) + s(rain) + s(pump), data = d)
plot.gam(fitted_GAM)
当我得到从 plot.gam
输出的图时,它在 y 轴上告诉我每个平滑函数的自由度,这些通常是非整数值。 我希望能够控制所使用的每个平滑函数的自由度,有没有办法做到这一点?
我看到了指定 "knots" 并因此控制配合的参考资料,但我对 GAM 的概念还很陌生,而且我还没有找到任何明确的资源来解释这些是什么(如果它们甚至与我的问题完全相关。
gam
文档中有很多参数可以帮助您理解。
我认为对你的情况最有用的参数是 k
, 基础维度 。本质上,它使用 s
设置平滑自由度的上限。 Here is some documentation.
所以你可能 运行,例如:
gam(GWL ~ s(month, k = 4) + ...)
然后使用 plot.gam
和 gam.check
检查您的模型。如果诊断看起来不太好,您可以向上或向下调整 k
直到它们得到改善。
编辑:根据this answer,s()
的fx = TRUE
参数将拟合具有固定自由度的回归样条。 k 将等于总 df 并且 k-1 = edf.
我一直在密切关注您对其他答案的回应。从你的回复看来,对GAM的几个概念都比较了解,那我就简答一下吧。
不幸的是,没有。 mgcv
GAM 不是使用backfitting 进行估计,而是通过GCV 或REML 对平滑参数进行联合估计。因此,与可以为每个样条项指定 df
的旧版 gam
包不同,您无法在 mgcv
.
惩罚回归设置中控制平滑度的唯一方法是设置平滑参数sp
,但它与自由度的关系不是封闭形式,你无法预见。
另一个答案是建议你做一个没有惩罚的纯回归样条。通过设置等级 k
并发出信号 fx = TRUE
,您的自由度始终等于等级减一(由于居中约束),这是一个整数。
以下是我在平滑方面所做的一些其他回答。
df
在 smooth.spline
中的工作原理。注意这是backfitting GAM的基础
mgcv
提供了很多样条基 class,而不仅仅是 splines::bs
.