mgcv: Error Model has more coefficients than data, 与 gam() 中的参数相关
mgcv: Error Model has more coefficients than data, related to the argument by in the gam()
案例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后,报错"Model has more coefficients than data"。
fit <- gam(y~s(x0, bs = "cr", k = num_knots, m=2, by = x1),data=dat)
这个错误让我很困惑,因为我认为添加 by 参数来创建平滑项和参数项之间的交互不应该增加未知系数的数量,尽管事实证明我错了。我哪里错了?
当您将连续变量传递给 by
时,您得到的是变系数模型,其中 x1
的影响作为 x0
.[=19 的平滑函数变化=]
第一种情况发生的情况是,由于可识别性约束应用于 x0
的基础扩展,您请求 num_knots
基函数但实际上得到了 num_knots - 1
基函数.当你添加截距时,你会得到 num_knots
系数,这适合这个模型,因为它是一个惩罚样条(尽管你可能想要 method = 'REML'
)。应用可识别性约束是因为存在与模型截距混淆的基函数(或组合)并且您无法在模型中拟合两个常数项并使它们被唯一识别。
在第二种情况下,变系数模型,没有同样的问题,所以当你要求 num_knots
基函数加上一个截距时,你试图用 401 个系数和 400 个系数拟合模型观察结果是行不通的。
案例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后,报错"Model has more coefficients than data"。
fit <- gam(y~s(x0, bs = "cr", k = num_knots, m=2, by = x1),data=dat)
这个错误让我很困惑,因为我认为添加 by 参数来创建平滑项和参数项之间的交互不应该增加未知系数的数量,尽管事实证明我错了。我哪里错了?
当您将连续变量传递给 by
时,您得到的是变系数模型,其中 x1
的影响作为 x0
.[=19 的平滑函数变化=]
第一种情况发生的情况是,由于可识别性约束应用于 x0
的基础扩展,您请求 num_knots
基函数但实际上得到了 num_knots - 1
基函数.当你添加截距时,你会得到 num_knots
系数,这适合这个模型,因为它是一个惩罚样条(尽管你可能想要 method = 'REML'
)。应用可识别性约束是因为存在与模型截距混淆的基函数(或组合)并且您无法在模型中拟合两个常数项并使它们被唯一识别。
在第二种情况下,变系数模型,没有同样的问题,所以当你要求 num_knots
基函数加上一个截距时,你试图用 401 个系数和 400 个系数拟合模型观察结果是行不通的。