R 4.x中predict.gam函数报错,R 3.6.3正常运行求助
解决gam包在R4.x版本中predict报错的问题
问题描述
在R 3.6.3(对应gam包版本gam_1.20)中可正常运行的代码,迁移到R 4.3.2(对应gam包版本gam_1.22-2)后,执行predict(fitModel1, se.fit = TRUE, type = "response")时抛出错误:
Error in NextMethod("predict") : no method to invoke
原代码如下:
library(gam) library(dplyr) gm1 <- predCol ~ s(VCF_nontree) + s(VCF_nonvegt) + s(VCF_treecov) + s(CCI_URBAN) + s(GPW_POP) gm2 <- predCol ~ offset(offset) + s(ACC) + s(EARS) + s(MAT) + s(PTA) + s(SLP) + s(SOC) + s(TWI) set.seed(42) c2 <- data.frame( predCol = abs(rnorm(677072, 0.022, 0.03)), VCF_nontree = rnorm(677072, 6533, 16.3), VCF_nonvegt =rnorm(677072, 15.9, 12.03), VCF_treecov = rnorm(677072, 18.1, 18.3), CCI_URBAN = rnorm(677072, 0.00412, 0.013), GPW_POP = rnorm(677072, 2.23, 1.28), offset = rep(NA, 677072), ACC = rnorm(677072, 612.6, 456.5), EARS = rnorm(677072, 731.88, 291.4), MAT = rnorm(677072, 22.69, 2.56), PTA = rnorm(677072, 124.13, 307.9), SLP = rnorm(677072, 2.41, 3.71), SOC = rnorm(677072, 0.609, 0.33), TWI = rnorm(677072, 118.2, 15.35) ) fitModel1.1 <- gam::gam(gm1, data = c2, family = quasibinomial) c2$offset <- as.numeric(predict(fitModel1.1, type = "link")) fitModel1 <- gam::gam(gm2, data = c2, family=quasibinomial) fm1 <- predict(fitModel1, se.fit = TRUE, type = "response")
原因分析
报错本质是方法调度冲突:加载dplyr后,其自带的predict方法干扰了gam包的predict.gam方法,导致R无法找到适配gam模型对象的predict方法。gam包1.22+版本的内部方法调用逻辑更新,进一步加剧了这个冲突。
解决方案
方案1:显式调用gam包的predict方法
直接指定使用gam::predict.gam,跳过方法调度的冲突,修改fm1的代码行:
fm1 <- gam::predict.gam(fitModel1, se.fit = TRUE, type = "response")
方案2:临时卸载dplyr包
如果当前代码不需要dplyr的功能,可先卸载dplyr再执行predict操作:
# 卸载dplyr包 detach("package:dplyr", unload = TRUE) # 执行predict fm1 <- predict(fitModel1, se.fit = TRUE, type = "response") # 若后续需要dplyr,重新加载 library(dplyr)
方案3:避免提前加载dplyr
如果代码中仅用到dplyr的部分功能,可替换为基础R函数,或在需要时再加载dplyr,避免与gam包的方法冲突。
内容的提问来源于stack exchange,提问作者we need a Mat. Stat.
相关产品推荐
相关产品推荐

