2016-07-28 91 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的確切值,所以感謝整齊的代碼。但我有興趣瞭解更多關於比例因子的信息。除包裝手冊之外,我還可以在哪裏閱讀更多內容? –