我想用R包mgcv拟合一个惩罚的三次样条,其中我没有对模型中的截距、线性和二次项应用任何惩罚。惩罚应仅适用于样条基中的三次项和其他项。我想以这种方式拟合我的模型,因为在我的领域中,标准是使用二次项来调整x
,例如lm(y~x+x^2)
。我相信在我的数据中可能会有适度的偏离这个模型,所以我想修复一个更灵活(但不是太摆动)的模型,因此使用惩罚样条。
我目前的理解是,mgcv将自动对截距和线性项不进行惩罚,但二次项将受到惩罚。
所以,如果我的工作模型可以适合下面的代码
x <- seq(0,1, length = 100)
y <- 0.5*x + x^2 + rnorm(100)
mod1 <- gam(
y~s(x, fx = F, k = 5, bs = "cr")
)
则调用mod1$coefficients
产生长度为5的向量,表示截距、线性项、二次项、三次项和一个三次样条项。因此,我目前的理解是mod1$coefficients[1:2]
不受惩罚,mod1$coefficients[3:5]
受惩罚。我的理解是否正确?如果是这样,我该如何修改上面的代码来消除mod1$coefficients[3]
估计中的损失?
我试着在样条函数s()
中摆弄参数m
,因为mgcv
文档表明这将改变惩罚所在的样条函数的导数。但是,这似乎根本不会改变拟合的样条曲线。
mod1 <- gam(
y~s(x, fx = F, k = 10, bs = "cr")
)
mod2 <- gam(
y~s(x, fx = F, k = 10, bs = "cr", m = c(3,3))
)
all(mod1$fitted.values == mod2$fitted.values) # this is always true
2条答案
按热度按时间qxgroojn1#
它不是三次回归样条,但它确实清楚地分离了问题的两个组成部分。在这里,我将展示如何使用薄板样条(
mgcv::gam()
中的默认基础)来实现这一点。使用您的设置和我的软件包来处理GAMs
我们开始看具有三阶导数罚值的薄板样条的基础:
这导致
最后三个基函数(9、10和11)在惩罚的零空间中;它们不受惩罚的影响,因为它们到处都有0的三阶导数。函数11是二次项。函数9与模型截距混淆,并且将通过在基础上施加和为零的约束而从基础中移除;这是默认约束,
gam()
在拟合GAM时默认执行此操作。要拟合的GAM(假设薄板样条线是合适的)则为
该模型使用2 EDF,正如我们所期望的那样,给出了数据模拟的方式
如果你想对2阶多项式项上的样条位进行正式测试,那么我们可以重新拟合上面的模型,但通过
poly(x, 2)
将所需的项作为参数项包括在内,但修改薄板样条的基础以摆脱惩罚零空间中的所有函数。我们通过设置m = c(3,0)
来删除空空间:注意函数9、10和11在基函数中是如何消失的。这将允许我们隔离样条中的二次分量之外的摆动,将2阶多项式摆动留给模型中的参数项。
最后一条生产线
正如我们已经看到的,超二次波动很小,我们无法拒绝 f(x)=== 0的零假设。
我认为你可以使用B样条基来做到这一点,它允许你控制多项式的阶数和惩罚的阶数(不像三次回归样条基,它固定由分段三次多项式形成,具有二阶导数惩罚):
这将惩罚具有非零三阶导数的函数,因此不应该惩罚基范围内的线性和二次函数。只是不太清楚它是如何做到这一点的,你当然不能以你为CRS假设的方式解释系数(你也不能以
bs = "cr"
基的方式解释它们-绘制s(x, bs = "cr")
的基函数来看看为什么)。这是具有B样条基的m1
的拟合基函数的样子拟合函数必须看起来像这样,因为估计的样条为:
8wtpewkr2#
以下是向二次模型添加三次项的方法:
下面是plot的输出:
比较: