如何在 gamm mgcv 模型上使用反 link 函数

How to use inverse link functions on gamm mgcv model

我使用了反 link 函数,

ilink <- family(gam_model)$linkinv

用于创建时间序列交互图,效果很好。

我将模型替换为 gamm 模型,以考虑模型中的自相关。是否可以在 gamm 模型上使用反 link 函数?我试过了

ilink <- family(gamm_model)$linkinv
ilink <- family(gamm_model$gam)$linkinv
ilink <- family(gamm_model$lme)$linkinv

但是对于所有选项它都显示错误:

使用方法错误("family"): 没有适用于 'family' 的方法应用于 class "c('gamm', 'list')"

的对象

使用方法错误("family"): 没有适用于 'family' 的方法应用于 class "gam"

的对象

使用方法错误("family"): 没有适用于 'family' 的方法应用于 class "lme"

的对象

第二个选项令人惊讶,因为它适用于原始 gam 模型,calss "gam"

谢谢 德沃拉

这是 mgcv::gamm() 有点乱七八糟的不幸副作用之一。

$gam 组件实际上包含一个 $family 组件只是 $gam 对象是 只有 的 class "gam"mgcv::gam() 模型对象 继承自 class "glm" 并且有一个 family.glm 方法。我认为这是由于 $gam 对象不是完全兼容的 "gam" 对象,因此不是完整的 "glm" 对象,因此它没有继承自 "glm"。这也可能只是一个疏忽;很长一段时间 mgcv::gamm() 返回的对象只是 class "list"!

最简单的方法是为 class "gamm" 的对象编写您自己的 family 方法(这样您就不必记住要从哪个组件中提取) class "gam":

family.gamm <- function(object, ...) {
    family(object$gam)
}

family.gam <- function(object, ...) {
    object$family
}

鉴于 family.glm 的定义与上述 .gam 方法的定义完全匹配,将其保留在您的工作区中不会干扰 的其余部分mgcv.

library("mgcv")
set.seed(1)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2, verbose = FALSE)
m1 <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat, method = "REML")
m2 <- gamm(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat, method = "REML")

family(m1)
family(m2)

制作中

> family(m1)

Family: gaussian 
Link function: identity 

> family(m2)

Family: gaussian 
Link function: identity