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

speedglm调用predict返回全NA,能否修改对象类适配常规predict?

关于speedglm配合predict返回全NA的问题分析与解决

我来帮你捋捋这个问题哈,你遇到的两个核心问题:predict返回全NA、speedglm对象类的疑问,咱们一个个说清楚:

一、为什么predict返回全NA?

这是因为speedglm默认不会保存训练数据的模型矩阵和因子水平信息,而你的预测数据mtcars_test里的gear是因子类型,当模型没有保存训练时的因子水平时,无法正确匹配测试数据的因子类别,直接返回NA。

解决这个问题很简单,只需要在调用speedglm时加上model=TRUE参数,让模型保存必要的训练数据信息:

library(speedglm)
mtcars2<-mtcars
mtcars2$gear<-as.factor(mtcars2$gear)
mtcars_train<-mtcars2[1:10,]
mtcars_test<-mtcars2[11:nrow(mtcars2),]
# 加上model=TRUE参数,保存训练数据的必要信息
model<-speedglm(formula = cyl ~ gear,data = mtcars_train,family=poisson(link="log"), model=TRUE)
pred<-predict(object = model, newdata = mtcars_test)
pred

运行这段代码就能得到正常的预测结果了。

二、能不能修改speedglm对象的类来用常规predict?

答案是绝对不可以。虽然speedglm对象的类是"speedglm" "speedlm",但它的内部结构和标准glm对象差异很大——speedglm是为了高效处理大规模数据设计的,做了很多内存优化,省略了glm里的一些冗余组件。强行修改类(比如用class(model) <- "glm")会导致后续调用predict.glm时出现各种报错,因为必要的结构根本不存在。

其实speedglm本身就有对应的预测方法predict.speedglm,你之前调用的predict其实已经在自动调用这个方法了,只是因为没加model=TRUE才出问题,完全不需要改用常规的predict函数。

补充优化方案

如果你担心保存整个模型矩阵会占用过多内存,还有另一种办法:提前确保测试数据的因子水平和训练集完全一致。比如可以先把训练集的因子水平同步到测试集:

# 同步训练集与测试集的因子水平
mtcars_test$gear <- factor(mtcars_test$gear, levels = levels(mtcars_train$gear))
# 即使不加model=TRUE,也能正常预测(但还是推荐加model=TRUE更稳妥)
model<-speedglm(formula = cyl ~ gear,data = mtcars_train,family=poisson(link="log"))
pred<-predict(object = model, newdata = mtcars_test)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:01:46