如何从GAM中提取拟合样条(`mgcv :: gam`)

时间:2013-03-23 07:47:07

标签: r gam mgcv

我正在使用GAM对逻辑回归中的时间趋势进行建模。然而,我想从中提取拟合样条曲线,将其添加到另一个模型中,不能用于GAM或GAMM。

因此我有两个问题:

  1. 如何在一段时间内让一个结更顺畅,以便在让模特找到其他结点的同时强迫一个结处于特定位置?

  2. 如何从拟合的GAM中提取矩阵,以便我可以将其用作不同模型的估算?

  3. 我运行的模型类型如下:

    gam <- gam(mortality.under.2~ maternal_age_c+ I(maternal_age_c^2)+
               s(birth_year,by=wealth2) + wealth2 + sex +
               residence + maternal_educ + birth_order,
               data=colombia2, family="binomial")
    

    我已经阅读了GAM的大量文档,但我仍然不确定。 任何建议都非常感谢。

1 个答案:

答案 0 :(得分:26)

mgcv::gam中,有一种方法可以通过predict.gam方法和type = "lpmatrix"完成此操作(您的Q2)。

?predict.gam甚至有一个例子,我在下面重现:

 library(mgcv)
 n <- 200
 sig <- 2
 dat <- gamSim(1,n=n,scale=sig)

 b <- gam(y ~ s(x0) + s(I(x1^2)) + s(x2) + offset(x3), data = dat)

 newd <- data.frame(x0=(0:30)/30, x1=(0:30)/30, x2=(0:30)/30, x3=(0:30)/30)

 Xp <- predict(b, newd, type="lpmatrix")

 ##################################################################
 ## The following shows how to use use an "lpmatrix" as a lookup 
 ## table for approximate prediction. The idea is to create 
 ## approximate prediction matrix rows by appropriate linear 
 ## interpolation of an existing prediction matrix. The additivity 
 ## of a GAM makes this possible. 
 ## There is no reason to ever do this in R, but the following 
 ## code provides a useful template for predicting from a fitted 
 ## gam *outside* R: all that is needed is the coefficient vector 
 ## and the prediction matrix. Use larger `Xp'/ smaller `dx' and/or 
 ## higher order interpolation for higher accuracy.  
 ###################################################################

 xn <- c(.341,.122,.476,.981) ## want prediction at these values
 x0 <- 1         ## intercept column
 dx <- 1/30      ## covariate spacing in `newd'
 for (j in 0:2) { ## loop through smooth terms
   cols <- 1+j*9 +1:9      ## relevant cols of Xp
   i <- floor(xn[j+1]*30)  ## find relevant rows of Xp
   w1 <- (xn[j+1]-i*dx)/dx ## interpolation weights
   ## find approx. predict matrix row portion, by interpolation
   x0 <- c(x0,Xp[i+2,cols]*w1 + Xp[i+1,cols]*(1-w1))
 }
 dim(x0)<-c(1,28) 
 fv <- x0%*%coef(b) + xn[4];fv    ## evaluate and add offset
 se <- sqrt(x0%*%b$Vp%*%t(x0));se ## get standard error
 ## compare to normal prediction
 predict(b,newdata=data.frame(x0=xn[1],x1=xn[2],
         x2=xn[3],x3=xn[4]),se=TRUE)

整个过程甚至是在R或GAM模型之外进行的预测步骤。您将不得不稍微修改示例以执行您想要的操作,因为示例会评估模型中的所有项,并且除了样条线之外还有两个其他项 - 基本上您执行相同的操作,但仅适用于样条项,涉及为样条曲线找到Xp矩阵的相关列和行。然后你还应该注意到样条曲线是居中的,所以你可能也可能不想撤消它。

对于Q1,请在示例中为xn向量/矩阵选择合适的值。这些对应于模型中n项的值。因此,将您想要固定的值设置为某个平均值,然后改变与样条曲线相关的值。

如果你在 R中执行所有这些,那么只是在样条协变量的值处评估样条曲线会更容易,因为样条曲线的变量将进入另一个模型。您可以通过创建预测值的数据框来实现,然后使用

predict(mod, newdata = newdat, type = "terms")

其中mod是拟合的GAM模型(通过mgcv::gam),newdat是包含模型中每个变量的列的数据框(包括参数项;设置术语你不想改变一些常数平均值[比如数据集中变量的平均值]或某个因子的某个水平)。 type = "terms"部分将为newdat中的每一行返回一个矩阵,其中“贡献”为模型中每个项的拟合值,包括样条项。只需获取与样条曲线相对应的此矩阵的列 - 再次将其居中。

也许我误解了你的Q1。如果要控制结,请参阅knots的{​​{1}}参数。默认情况下,mgcv::gam在数据的极值处放置一个结,然后剩余的“结”在该间隔上均匀分布。 mgcv::gam 找不到结 - 它会将它们放置给您,您可以通过mgcv::gam参数控制放置它们的位置。