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

在R语言中从GLM模型提取R2值并存储为向量的报错解决

问题解决:提取GLM模型R2值并存储为向量

错误原因

用c(full, bio, clim)合并模型对象时,R会将每个GLM模型的内部数值元素拆解拼接成数值向量,而非保留模型对象的完整结构。后续lapply遍历的是数值元素而非完整模型,因此predict()找不到适用的方法,触发报错。

修正步骤

1. 用列表存储模型对象

放弃c(),改用list()保存模型,这样能完整保留每个GLM对象的结构:

mods <- list(full = full, bio = bio, clim = clim)

2. 批量提取R2值

用sapply()(而非lapply())可直接返回向量格式的结果,更符合需求:

r2.vec <- sapply(mods, R2)

执行后r2.vec会是带模型名称的数值向量,方便对应查看各模型的R2值。

优化R2函数(可选)

原函数硬编码了data$speed,依赖全局环境的数据集,可修改为从模型对象中直接提取响应变量,让函数更通用:

R2 <- function(x) {
  observed <- x$model[[1]]  # 从模型中获取响应变量
  predicted <- predict(x)
  cor(observed, predicted)^2
}

完整示例代码

# 构建数据集
speed<-c(0.5,0.1,0.3,0.4,0.9,0.2)
sex<-c(rep(c("F","M"),times=c(3,3)))
mass<-c(500,400,600,800,700,500)
year<-c(2000,2000,2001,2001,2002,2002)
temp.c<-c(0,2,3,1,3,0)
data<-data.frame(speed,sex,mass,year,temp.c)

# 构建模型
full<-glm(formula = speed ~ sex + mass + year + temp.c, data=data,family=Gamma)
bio<-glm(formula = speed ~ sex + mass, data=data,family=Gamma)
clim<-glm(formula = speed ~ year + temp.c, data=data,family=Gamma)

# 通用R2提取函数
R2<-function(x) {
  observed <- x$model[[1]]
  predicted <- predict(x)
  cor(observed, predicted)^2
}

# 批量提取R2
mods <- list(full = full, bio = bio, clim = clim)
r2.vec <- sapply(mods, R2)

# 查看结果
r2.vec

内容的提问来源于stack exchange,提问作者Cam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:16:04