R 自定义链接功能适用于GLM,但不适用于mgcv GAM
如果答案显而易见,我深表歉意,但我花了相当长的时间尝试在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
- 我想使用包中修改过的probit链接(我想使用,我称之为
)自定义链接
- 我可以用这个链接创建一个{stats}family对象,并在glm的'family'参数中使用它
m如您所知,
采用迭代加权最小二乘法拟合迭代。早期版本的glm
通过拟合一个迭代惩罚加权最小二乘法来扩展这一点,该函数由gam
函数完成。在某些情况下,这称为性能迭代 自2008年以来(甚至更早),基于所谓的外部迭代的gam.fit
已取代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
(对于三次样条曲线来说不能更小),因为我的玩具数据接近线性,不需要大的基本尺寸。更重要的是,这似乎可以防止我的玩具数据集性能迭代的收敛失败。非常感谢您的回答。使用性能优化器是这个问题的简单答案。我将研究这个我不知道是新标准的外部迭代(显然在阅读simon wood r的书时跳过了这一部分)。现在,我将根据经验探索这个默认优化器是否会损害我的问题的拟合性能和收敛性,并在这里报告我的发现。我可能会扩展和共享链接,以便与外部迭代一起工作。非常感谢您编辑此问题。k=3
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)
- 性能迭代采用嵌套方式,其中对于