如何最小化类“lm”对象的大小而不影响它传递给predict()

时间:2014-02-20 01:30:18

标签: r memory lm

我希望在大型数据集上运行lm(),其中包含50个+观察值和2个预测变量。分析在远程服务器上运行,只有10GB用于存储数据。我已经对从数据中采样的10K观测值测试了'lm()',结果对象的大小为2GB +。

我需要从lm()返回的类“lm”的对象,以生成模型的摘要统计信息(summary(lm_object))并进行预测(predict(lm_object))。

我已对model, x, y, qr的{​​{1}}选项进行了一些实验。如果我将它们全部设置为lm,我会将大小缩小38%

FALSE

library(MASS)
fit1=lm(medv~lstat,data=Boston)
size1 <- object.size(fit1)
print(size1, units = "Kb")
# 127.4 Kb bytes
fit2=lm(medv~lstat,data=Boston,model=F,x=F,y=F,qr=F)
size2 <- object.size(fit2)
print(size2, units = "Kb")
# 78.5 Kb Kb bytes
- ((as.integer(size1) - as.integer(size2)) / as.integer(size1)) * 100
# -38.37994

显然我需要保留summary(fit2) # Error in qr.lm(object) : lm object does not have a proper 'qr' component. # Rank zero or should not have used lm(.., qr=FALSE). predict(fit2,data=Boston) # Error in qr.lm(object) : lm object does not have a proper 'qr' component. # Rank zero or should not have used lm(.., qr=FALSE). ,与默认对象相比,它只会将对象大小减少9%

qr=TRUE

如何在不将大量不需要的信息转储到内存和存储空间的情况下,将“lm”对象的大小降至最低?

3 个答案:

答案 0 :(得分:4)

这里的链接提供了一个相关的答案(对于glm对象,它与lm输出对象非常相似)。

http://www.win-vector.com/blog/2014/05/trimming-the-fat-from-glm-models-in-r/

基本上,预测只使用系数部分,它是glm输出的很小一部分。下面的函数(从链接复制)修剪预测不会使用的信息。

但确实有一点需要注意。修剪后,它不能被摘要(拟合)或其他摘要函数使用,因为这些函数需要更多的预测需要。

cleanModel1 = function(cm) {
  # just in case we forgot to set
  # y=FALSE and model=FALSE
  cm$y = c()
  cm$model = c()

  cm$residuals = c()
  cm$fitted.values = c()
  cm$effects = c()
  cm$qr = c()  
  cm$linear.predictors = c()
  cm$weights = c()
  cm$prior.weights = c()
  cm$data = c()
  cm
}

答案 1 :(得分:0)

我也试图处理同样的问题。我使用的不是完美的其他东西,但适用于预测,你基本上可以取出lm中qr槽的qr槽:

lmFull <- lm(Volume~Girth+Height,data=trees)
lmSlim <- lmFull
lmSlim$fitted.values <- lmSlim$qr$qr <- lmSlim$residuals <- lmSlim$model <- lmSlim$effects <- NULL
pred1 <- predict(lmFull,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
pred2 <- predict(lmSlim,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
identical(pred1,pred2)
[1] TRUE

as.numeric((object.size(lmFull) - object.size(lmSlim)) / object.size(lmFull))
[1] 0.6550523

答案 2 :(得分:0)

xappp的答案很好但不是整个故事。您还可以执行一些巨大的环境变量(请参阅:https://blogs.oracle.com/R/entry/is_the_size_of_your

将此添加到xappp的功能

     e <- attr(cm$terms, ".Environment")
     parent.env(e) <- emptyenv()
     rm(list=ls(envir=e), envir=e)

或者使用此版本减少数据量,但仍允许您使用summary()

      cleanModel1 = function(cm) {
      # just in case we forgot to set
      # y=FALSE and model=FALSE
      cm$y = c()
      cm$model = c()

      e <- attr(cm$terms, ".Environment")
      parent.env(e) <- emptyenv()
      rm(list=ls(envir=e), envir=e)
      cm
      }