mgcv包中gam的平滑方法?

机器算法验证 r 广义加法模型 样条 平滑 毫克CV
2022-03-29 23:09:44

我目前正在使用 mgcv 包中的 gam 模型,对我来说,平滑方法有点令人困惑,我希望你们能帮助我更好地理解这一点。所以这是我到目前为止所理解的:

gam 模型的优点是我可以对复杂函数进行建模,这意味着我可以将连续变量建模为函数f(z)但挑战在于找到那些f函数。

一些基本方法是 B 样条、P 样条、三次样条和薄板样条。

中的默认设置gam是薄板样条。所以我想知道它基本上是做什么的。到目前为止,据我了解,该方法的优点是您不必指定节数 k。您从最大的结数开始,然后gam通过 GCV 选择最适合该功能的 k。

我做对了吗?

2个回答

mgcv使用薄板样条基础作为其平滑项的默认基础。老实说,在您选择的许多应用程序中,这可能几乎没有什么区别,尽管在某些情况下或具有非常大的数据集大小时,可能会使用其他基本类型来获得良好的效果。薄板样条曲线往往比您提到的其他三个具有更好的 RMSE 性能,但设置起来计算成本更高。除非您有理由使用 P 或 B 样条基,否则请使用薄板样条,除非您有大量数据,并且如果您有大量数据,请考虑三次样条选项。

k不设置结数,至少在默认的薄板样条基础上不设置。什么k是设置基扩展的维数;你最终会得到k - 1基函数。mgcv中,Simon Wood 做了一个技巧来降低基础维度的等级。IIRC,在通常的薄板样条基础中,每个数据位置都有一个结,但这很浪费,因为一旦你建立了这么大的基础,你最终会在拟合函数中使用更少的自由度。k - 1Simon所做的是对基函数矩阵进行特征分解,并选择与最大特征值对应的分解的特征向量。这具有将完整基础的主要摆动“信息”集中在降低等级形式中的效果。

的选择k很重要,默认值是任意的,并且您想要检查(请参阅gam.check()),但关键的观察是您希望设置k的足够大,以包含您试图从数据。在实践中,人们倾向于在k给定数据集大小的情况下拟合适度,然后gam.check()在结果模型上使用以检查是否k足够大。如果不是,请增加k和改装。冲洗并重复...

您很可能希望通过method = "REML"或使用 REML(或 ML)平滑度选择来拟合模型method = "ML":这将模型视为混合效应模型,样条基的摆动部分被视为特殊随机效应项。Simon Wood 表明,REML(或 ML)选择比 GCV 表现更好,后者在目标函数在最佳平滑度参数值附近持平的情况下可能会变得不平滑。

@generic_user 提到的岭惩罚已为您处理好,因此您可以忽略设置模型的这一部分。

尝试这个:

#Fake data
library(mgcv)
x <- runif(10000, 0, 10)
y <- log(x) + sin((x^2)/10)+rnorm(10000)
plot(x,y)

使用默认的“结位置”尝试三种不同的基函数

plot(gam(y~s(x, bs = 'ps')))
plot(gam(y~s(x, bs = 'cr')))
plot(gam(y~s(x, bs = 'ts')))

它们基本相同。现在是相同的,每个都有 40 节。

plot(gam(y~s(x, bs = 'ps', k = 40)))
plot(gam(y~s(x, bs = 'cr', k = 40)))
plot(gam(y~s(x, bs = 'ts', k = 40)))

...有点过度摇摆,但实际上并没有那么不同。

现在 futz 使用平滑参数,你会看到动作在哪里:

plot(gam(y~s(x, sp = 0)))
plot(gam(y~s(x, sp = 1e6)))
plot(gam(y~s(x))) #default smoothing parameter, estimated by generalized cross-validation

因此,总而言之,当您指定比您可能需要的更多节点时,节点位置并不重要,然后通过脊惩罚来惩罚它们。

如果您不知道我在说什么脊罚,请阅读 Simon Wood 关于 GAM 的书请注意,作者是编写 R 包的同一个人。