如何在没有数据或仅使用预测系数的情况下保存 glm 结果?

Posted

技术标签:

【中文标题】如何在没有数据或仅使用预测系数的情况下保存 glm 结果?【英文标题】:How to save glm result without data or only with coeffients for prediction? 【发布时间】:2012-11-03 11:13:03 【问题描述】:

当我使用以下 R 代码时,

model_glm=glm(V1~. , data=xx,family="binomial");
save(file="modelfile",model_glm);

模型文件的大小将与数据一样多,在我的情况下为 1gig。如何删除model_glm结果中的数据部分,所以只能保存一个小文件。

【问题讨论】:

在对glm 的调用中设置model = FALSE 以防止返回model.frame。 【参考方案1】:

在您对glm 的调用中设置model = FALSE 应该可以防止model.frame 被返回。同样设置y = FALSE 将阻止返回响应向量。 x = FALSE 是默认设置,可防止返回 model.matrix

这种组合应该会缩小 glm 对象的大小。

当然,您也可以使用coef(model_glm) 或标准误差提取系数

summary(model_glm)$coef

【讨论】:

您查看过生成的模型吗?它仍然很重:残差、拟合值和完整的 qr 矩阵。 biglm 包返回更轻的模型对象。 是的,bigglm 函数可能是一个可行的替代方案。如果您发布答案,它将得到我的投票。尽管如此,仍然可以在保存之前从glm 对象中仅选择所需的组件。【参考方案2】:

我在生产环境中将 GLM 作为 R 的一部分运行时遇到了这个问题,而 GLM 的大小大大减慢了我的速度。我发现我需要杀死的不仅仅是$data。 Here 是我的帖子,下面有一个例子。

> object.size(sg)
96499472 bytes
> sg$residuals <- NULL
> sg$weights <- NULL
> sg$fitted.values <- NULL
> sg$prior.weights <- NULL
> sg$na.action<- NULL
> sg$linear.predictors <- NULL
> sg$fitted.values <- NULL
> sg$effects <-NULL
> sg$data <- NULL
> object.size(sg)
3483976 bytes
> sg$qr$qr <- NULL
> object.size(sg)
79736 bytes

【讨论】:

只是评论...在您的博客中,您几乎看不到黄色突出显示的内容 您也可以执行类似sg[c("residuals", "weights", "fitted.values")] &lt;- NULL 的操作,让该向量包含您想要删除的所有内容的名称。 @RichardScriven 哦,我的眼睛 - 它灼伤了我的眼睛。 @RichardScriven 谢谢,已修复,还好我不在数据访问中。【参考方案3】:

object.size() 具有误导性,因为它忽略了环境属性。 如果要评估真实大小,请使用:

length(serialize(model_glm, NULL))

除了存储的数据之外,如果您想显着减小 glm 的大小,请执行以下操作:

rm(list=ls(envir = attr(model_glm$terms, ".Environment")),
     envir = attr(model_glm$terms,
              ".Environment"))

这来自一个非常详细的article

【讨论】:

【参考方案4】:

您可以在保存之前将模型对象中的数据设为 NULL。我做了一个快速测试,仍然产生了预测。

model_glm$data <- NULL

【讨论】:

以上是关于如何在没有数据或仅使用预测系数的情况下保存 glm 结果?的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用二元回归将序数数据建模为多元GLM

尝试在另一台计算机上使用 glm 模型进行预测时出错

用分类数据解释 GLM 输出

如何在回归中设置系数值; R

通过分类变量级别估计 h2o glm 系数

保存预测模型而不保存原始数据集