如何在 mgcv GAM 模型中调整平滑

机器算法验证 r 平滑 毫克CV
2022-02-09 15:44:33

我试图弄清楚如何控制 mgcv:gam 模型中的平滑参数。

我有一个二项式变量,我试图将其主要建模为固定网格上的 x 和 y 坐标的函数,以及其他一些影响较小的变量。在过去,我使用包 locfit 和 (x,y) 值构建了一个相当好的局部回归模型。

但是,我想尝试将其他变量合并到模型中,看起来广义加法模型 (GAM) 是一个很好的可能性。在查看了 gam 和 mgcv 包之后,它们都具有 GAM 功能,我选择了后者,因为邮件列表线程中的许多评论似乎都推荐它。一个缺点是它似乎不支持像 loess 或 locfit 这样的局部回归更平滑。

首先,我只是想尝试仅使用 (x,y) 坐标来近似复制 locfit 模型。我尝试了常规和张量产品平滑:

my.gam.te <- gam(z ~ te(x, y), family=binomial(logit), data=my.data, scale = -1)

my.gam.s  <- gam(z ~  s(x, y), family=binomial(logit), data=my.data, scale = -1)

但是,从模型中绘制预测,与 locfit 模型相比,它们要平滑得多。所以我一直在尝试调整模型以使其不那么平滑。我试过调整参数 sp 和 k,但我不清楚它们如何影响平滑。在 locfit 中,nn 参数控制使用的邻域的跨度,较小的值允许较少的平滑和更多的“摆动”,这有助于捕获网格上二项式结果的概率快速变化的某些区域。我将如何设置 gam 模型以使其行为相似?

2个回答

k论点有效地为每个术语设置了平滑矩阵的维数。gam()正在使用 GCV 或 UBRE 分数来选择最佳平滑度,但它只能在平滑矩阵的维数内工作。默认情况下,te()平滑k = 5^2适用于 2d 表面。我忘记了它的用途,s()所以检查文件。mgcv的作者 Simon Wood 目前的建议是,如果模型选择的平滑度等于或接近于 的值所施加的维数限制k,则应增加k并重新拟合模型以查看从更高维的平滑矩阵中选择更复杂的模型。

但是,我不知道locfit是如何工作的,但是您确实需要一些东西来阻止您安装过于复杂的表面(GCV 和 UBRE,或者如果您选择使用它们,则为 (RE)ML [你不能像你一样set scale = -1],正试图做到这一点),数据不支持。换句话说,您可以拟合数据的非常局部的特征,但是您是在拟合收集的数据样本中的噪声还是拟合概率分布的平均值?假设您已经整理出基础维度(上图),gam() 可能会告诉您一些关于可以从您的数据中估计的内容。

要注意的另一件事是,您当前使用的平滑器是全局的,因为所选的平滑度应用于整个平滑范围。自适应平滑器可以在响应快速变化的部分数据中使用分配的平滑“余量”。gam()具有使用自适应平滑器的功能。

查看?smooth.terms?adaptive.smooth查看可以使用gam(). te()可以组合大多数(如果不是全部)这些平滑器(检查可以和不能包含在张量产品中的文档),因此您可以使用自适应平滑器基础来尝试捕获数据部分中更精细的局部尺度反应变化很快。

我应该补充一点,您可以使用和的fx = TRUE参数,让 R 来估计具有平滑项使用的一组固定自由度的模型基本上,将 k 设置为您想要的,并且只适合固定自由度的回归样条而不是惩罚回归样条。s()te()fx = TRUEgam()

有许多选项可以gam减少摆动:

  • 将默认值设置s(..., k = 10)为较小的值。
  • 将默认设置s(...,bs = 'tp')ts
  • 设置gam(..., select = TRUE)
  • 将默认值设置gam(..., gamma = 1)为更大的值。尝试 1 到 2 之间的值。
  • 将默认设置s(..., m = 2)m = 1
  • 强制单调增加/减少曲线。请参阅scam包和其他选项。
  • 将一些平滑的预测变量更改+ s(X1)为线性项+ X1
  • 使用更少的预测变量。