在 mgcv 的 gam() 中选择 k

机器算法验证 毫克CV
2022-04-02 12:39:46

这篇文章(下面的链接)暗示将基础维度设置为 -1(k = -1),因为通过 R 的 mgcv 包中的广义交叉验证(GCV)自动选择结数:

为 GAM 选择结

除了 k 不是结数。

我只遇到过设置 k = -1 的特定实例。

这样做真的有什么好处吗?

我问这个的原因是因为我正在生成数百个模拟数据集,并且不可能(不切实际)通过 gam.check() 为每个数据集找到最佳 k。

所以,我想知道使用 method = "GCV.Cp" 简单地设置 k = -1 的优点,以避免必须检查每个模拟数据集的直方图和 QQ 图。

当然,将 k 设置为任意高的值在计算上是昂贵的,因为正确的 k 仅用于捕获数据中的真实变化。

任何建议都将受到欢迎。

1个回答

这里和@Ira S链接帖子中的答案存在一些混淆。k参数的默认值为-1这表示为指定的基类型计算默认的基函数数量(默认为薄板样条,但您可以通过bs参数询问其他基函数)。因此,对于单变量薄板样条,默认情况下您将获得 10 个基函数,因为k = -1默认值为 10,而实际上您将获得 9 个基函数作为常数基函数,它与模型截距项混淆,从基中删除通过应用总和为零的可识别性约束。

给定一个基扩展,mgcv::gam()将使用惩罚似然拟合所需的模型,以估计基函数和截距和任何其他参数项的参数,以平滑参数为条件,并估计实际选择复杂性的平滑参数(摆动) 的最终拟合平滑函数。

mgcv::gam()可以使用 GCV、REML 或 ML 来估计模型的系数和平滑度参数。无论你传递给什么值,它都会为你做这个估计k您只能通过将参数添加fx = TRUEs()每个平滑的调用来停止它执行此平滑选择。

您面临mgcv::gam()的主要问题是设置初始基础尺寸。您不需要使用薄板样条选择节点位置(每个唯一数据值都有一个节点,然后k找到具有基函数的完整基展开的低秩版本),并且对于大多数不那么奇特的基地,结的位置通常对拟合模型几乎没有影响。

您希望设置k得很大,在给定数据量的情况下尽可能大,但您不希望它太大,因为使用所有这些基函数需要更多的计算工作,特别是如果在结果模型拟合中,许多/大多数将被惩罚为零。

所以,在你的情况下,我会设置k一个足够大的值,以适应真实函数的预期摆动。如果您有大量数据并且可以承担计算负担,则可以有效地将其设置为您想要的任意高。

假设您指定了正确的模型,则惩罚应处理额外的摆动。

我发现 GCV 对于我安装的某些模型的模型错误规范更稳健一些,我更喜欢使用 REML 进行平滑度选择,这将成为 mgcv 未来版本的默认设置,因此我建议您使用它,而不是 GCV。