首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mgcv:如何返回预估平滑参数?

mgcv:如何返回预估平滑参数?
EN

Stack Overflow用户
提问于 2016-07-29 03:15:14
回答 1查看 2.8K关注 0票数 1

考虑如下简单的GAM拟合:

代码语言:javascript
复制
library(mgcv)
my.gam <- gam(y~s(x), data=mydata)

  1. 有没有返回估计的平滑参数(λ),这样我就可以保存它?我知道λ在输出中是以'GCV分数‘的形式给出的,但我需要一个特定的代码来返回它。
  2. 如何将λ设置为所需的值?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-30 17:56:40

summary()不返回平滑参数。你把GCV分数和平滑参数搞混了。如果你不理解这些概念,请咨询当地的统计学家,或者在Cross Validated上提出问题。我将只向您展示如何提取和设置平滑参数。

考虑一个例子:

代码语言:javascript
复制
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)

您可以从以下位置获取内部平滑参数:

代码语言:javascript
复制
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就足够了。如果要将其设置为固定值,请执行以下操作:

代码语言:javascript
复制
b1 <- gam(y ~ s(x0, sp = 0) + s(x1, sp = 0) + s(x2, sp = 0) + s(x3, sp = 0),
          data = dat)

这基本上禁用了对所有平滑项的惩罚。请注意,将sp设置为负值意味着自动选择sp

lambda sp

代码语言:javascript
复制
sapply(b$smooth, "[[", "S.scale") / b$sp
#       s(x0)        s(x1)        s(x2)        s(x3) 
#6.545005e+00 5.326938e+00 1.490702e+03 4.097379e-10 

有时获取lambda是必要的。当将平滑函数视为随机效果或随机场时,存在

代码语言:javascript
复制
variance_parameter_of_random_effect = scale_parameter / lambda

其中,scale参数可以在b$scale中找到(对于高斯模型,这也是b$sig2)。请参阅相关问题:GAM with "gp" smoother: how to retrieve the variogram parameters?

后续

是的,我需要lambda的确切值,所以谢谢你简洁的代码。然而,我有兴趣了解更多关于比例因子的信息。除了软件包手册之外,我还可以在哪里阅读到更多关于它的信息?

?smoothCon上阅读

代码语言:javascript
复制
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的源代码中,有:

代码语言:javascript
复制
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是:

代码语言:javascript
复制
norm(S) / norm(X, type = "I")^2
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38644943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档