2016-07-28 93 views
1

考虑简单的GAM符合如下:mgcv:如何返回估计的平滑参数?

library(mgcv) 
my.gam <- gam(y~s(x), data=mydata) 
  1. 反正是有回报估计的平滑参数(波长),这样我可以将它保存?我知道lambda是作为'GCV分数'输出的,但我需要一个特定的代码来返回它。
  2. 如何将lambda设置为期望值?

回答

1

首先,summary()不返回平滑参数。 GCV分数与平滑参数混在一起。如果您不了解这些概念,请咨询当地的统计人员,或者就交叉验证提出问题。我只会告诉你如何提取和设置平滑参数。

考虑这样一个例子:

library(mgcv) 
set.seed(2) 
dat <- gamSim(1, n=400, dist="normal", scale=2) 
b <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data=dat) 

你可以得到(内部)平滑参数来自:

b$sp 
#  s(x0)  s(x1)  s(x2)  s(x3) 
#3.648590e+00 3.850127e+00 1.252710e-02 4.986399e+10 

严格地说,这不是lambda,但只有积极缩放因子从lambda不同。实际上,使用sp来平滑参数就足够了。如果你想将其设定为一个固定值,例如做:

b1 <- gam(y ~ s(x0, sp = 0) + s(x1, sp = 0) + s(x2, sp = 0) + s(x3, sp = 0), 
      data = dat) 

我在哪里设置了所有平滑参数0。注意,如果你设置sp为负值,mgcv会忽略它,做汽车 - 选择sp


备注

如果出于某些目的,你真的想要得到lambda,做到:

b$sp * unlist(lapply(b$smooth, "[[", "S.scale")) 
#  s(x0)  s(x1)  s(x2)  s(x3) 
#8.712849e+01 7.896376e+01 2.339330e-01 1.018779e+12 

但它是那么直接喂到lambdamgcv。所以我建议你与sp一起工作。


后续

其实我只注意到我有什么错用GCV得分和lambda,虽然我知道的概念。

好!

是的,我需要确切的值lambda,所以感谢您的整洁的代码。但我有兴趣了解更多关于比例因子的信息。除包装说明书外,我还可以在哪里阅读更多内容?

?smoothCon读:

smoothCon(object,data,knots=NULL,absorb.cons=FALSE, 
      scale.penalty=TRUE,n=nrow(data),dataX=NULL, 
      null.space.penalty=FALSE,sparse.cons=0, 
      diagonal.penalty=FALSE,apply.by=TRUE,modCon=0) 

scale.penalty: should the penalty coefficient matrix be scaled to have 
      approximately the same 'size' as the inner product of the 
      terms model matrix with itself? ... 

smoothCon源代码,有:

if (scale.penalty && length(sm$S) > 0 && is.null(sm$no.rescale)) { 
    maXX <- norm(sm$X, type = "I")^2 
    for (i in 1:length(sm$S)) { 
     maS <- norm(sm$S[[i]])/maXX 
     sm$S[[i]] <- sm$S[[i]]/maS 
     sm$S.scale[i] <- maS 
    } 
} 

简而言之,对于一个模型矩阵X和原材料惩罚矩阵S,缩放因子maS是:

norm(S)/norm(X, type = "I")^2 
+0

非常感谢你的回复。其实我只是注意到我在GCV分数和lambda上有什么错误,但我确实知道这些概念。是的,我需要lambda的确切值,所以感谢整齐的代码。但我有兴趣了解更多关于比例因子的信息。除包装手册之外,我还可以在哪里阅读更多内容? –