在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
相关产品推荐
相关产品推荐

