R 自定义链接功能适用于GLM,但不适用于mgcv GAM

R 自定义链接功能适用于GLM,但不适用于mgcv GAM,r,regression,glm,gam,mgcv,R,Regression,Glm,Gam,Mgcv,如果答案显而易见,我深表歉意,但我花了相当长的时间尝试在mgcv.gam中使用自定义链接函数 总之, 我想使用包中修改过的probit链接(我想使用,我称之为自定义链接) 我可以用这个链接创建一个{stats}family对象,并在glm的'family'参数中使用它 m如您所知,glm采用迭代加权最小二乘法拟合迭代。早期版本的gam通过拟合一个迭代惩罚加权最小二乘法来扩展这一点,该函数由gam.fit函数完成。在某些情况下,这称为性能迭代 自2008年以来(甚至更早),基于所谓的外部迭代的g

如果答案显而易见,我深表歉意,但我花了相当长的时间尝试在mgcv.gam中使用自定义链接函数

总之,

  • 我想使用包中修改过的probit链接(我想使用,我称之为
    自定义链接
  • 我可以用这个链接创建一个{stats}family对象,并在glm的'family'参数中使用它


    m如您所知,
    glm
    采用迭代加权最小二乘法拟合迭代。早期版本的
    gam
    通过拟合一个迭代惩罚加权最小二乘法来扩展这一点,该函数由
    gam.fit
    函数完成。在某些情况下,这称为性能迭代

    自2008年以来(甚至更早),基于所谓的外部迭代的
    gam.fit3
    已取代
    gam.fit
    成为
    gam
    默认值。这样的更改确实需要一些关于族的额外信息,关于这些信息,您可以阅读
    ?fix.family.link

    两次迭代之间的主要区别在于系数
    beta
    的迭代和平滑参数
    lambda
    的迭代是否嵌套

    • 性能迭代采用嵌套方式,其中对于
      beta
      的每次更新,执行
      lambda
      的单个迭代
    • 外部迭代将这两个迭代完全分开,其中对于
      beta
      的每次更新,
      lambda
      的迭代进行到底,直到收敛
    显然,外部迭代更稳定,不太可能出现收敛失败

    gam
    有一个参数
    优化器
    。默认情况下,它采用
    optimizer=c(“外部”,“牛顿”)
    ,即外部迭代的牛顿法;但如果您设置了
    optimizer=“perf”
    ,则需要进行性能迭代


    因此,在上述概述之后,我们有两个选择:

    • 仍然使用外部迭代,但扩展自定义链接功能
    • 使用性能迭代与glm保持一致
    我很懒,所以我将演示第二种方法(事实上,我不太自信,不会采取第一种方法)


    可复制示例

    您没有提供可复制的示例,因此我准备如下

    set.seed(0)
    x <- sort(runif(500, 0, 1))    ## covariates (sorted to make plotting easier)
    eta <- -4 + 3 * x * exp(x) - 2 * log(x) * sqrt(x)   ## true linear predictor
    p <- binomial(link = "logit")$linkinv(eta)    ## true probability (response)
    y <- rbinom(500, 1, p)    ## binary observations
    
    table(y)    ## a quick check that data are not skewed
    #  0   1 
    #271 229 
    


    对于
    s(x)
    ,我使用了自然三次样条曲线基
    cr
    ,对于单变量平滑,没有必要使用薄板样条曲线的默认设置。我还设置了一个小的基本尺寸
    k=3
    (对于三次样条曲线来说不能更小),因为我的玩具数据接近线性,不需要大的基本尺寸。更重要的是,这似乎可以防止我的玩具数据集性能迭代的收敛失败。

    非常感谢您的回答。使用性能优化器是这个问题的简单答案。我将研究这个我不知道是新标准的外部迭代(显然在阅读simon wood r的书时跳过了这一部分)。现在,我将根据经验探索这个默认优化器是否会损害我的问题的拟合性能和收敛性,并在这里报告我的发现。我可能会扩展和共享链接,以便与外部迭代一起工作。非常感谢您编辑此问题。
    set.seed(0)
    x <- sort(runif(500, 0, 1))    ## covariates (sorted to make plotting easier)
    eta <- -4 + 3 * x * exp(x) - 2 * log(x) * sqrt(x)   ## true linear predictor
    p <- binomial(link = "logit")$linkinv(eta)    ## true probability (response)
    y <- rbinom(500, 1, p)    ## binary observations
    
    table(y)    ## a quick check that data are not skewed
    #  0   1 
    #271 229 
    
    probit2 <- probit.2asym(0.1, 0.1)
    
    par(mfrow = c(1,3))
    
    ## fit a glm with logit link
    glm_logit <- glm(y ~ x, family = binomial(link = "logit"))
    plot(x, eta, type = "l", main = "glm with logit link")
    lines(x, glm_logit$linear.predictors, col = 2)
    
    ## glm with probit.2asym
    glm_probit2 <- glm(y ~ x, family = binomial(link = probit2))
    plot(x, eta, type = "l", main = "glm with probit2")
    lines(x, glm_probit2$linear.predictors, col = 2)
    
    ## gam with probit.2aysm
    library(mgcv)
    gam_probit2 <- gam(y ~ s(x, bs = 'cr', k = 3), family = binomial(link = probit2),
                       optimizer = "perf")
    plot(x, eta, type = "l", main = "gam with probit2")
    lines(x, gam_probit2$linear.predictors, col = 2)