You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 23:30:09