在情况a中,mgcv R软件包中的gam代码运行良好。
library(mgcv)
dat <- gamSim(1,n=400,dist="normal",scale=2)
num_knots = nrow(dat)
fit <- gam(y~s(x0, bs = "cr", k = num_knots, m=2),data=dat)
summary(fit)
但是当我在gam()中添加参数by后,它报告了错误“模型的系数比数据多”。
fit <- gam(y~s(x0, bs = "cr", k = num_knots, m=2, by = x1),data=dat)
该错误使我感到困惑,因为我认为添加by参数来创建平滑项和参数项之间的相互作用不应增加未知系数的数量,尽管事实证明我是错的。我在哪里错了?
答案 0 :(得分:1)
当您将连续变量传递给by
时,您得到的是变化系数模型,其中x1
的效果随x0
的平滑函数而变化。
在第一种情况下发生的是,由于将可识别性约束应用于x0
的基础扩展,因此您请求了num_knots
基础函数,但实际上获得了num_knots - 1
基础函数。当您添加截距时,您将获得num_knots
系数,该系数可以拟合该模型,因为它是一个受罚样条曲线(尽管您可能想要method = 'REML'
)。之所以应用可识别性约束,是因为存在与模型截距混淆的基函数(或组合),并且您无法在模型中拟合两个常数项,并且无法唯一地标识它们。
在第二种情况下,变化系数模型不存在相同的问题,因此,当您要求使用num_knots
基函数和截距时,您尝试使用具有400个观测值的401个系数拟合模型不起作用。