2013-03-06 68 views
10

有没有办法'压缩'lm类的对象,以便我可以将它保存到磁盘并稍后加载以与predict.lm一起使用?有没有办法“压缩”lm()对象以供以后预测?

我有一个lm对象,保存时结果是〜142mb,我很难相信predict.lm需要所有原始观察值/拟合值/残差等来做出线性预测。我可以删除信息以便保存的模型更小吗?

我曾尝试设置一些变量(适合值,残差等)到NA,但它似乎没有影响保存的文件大小。

+2

此外,本着[本](http://stackoverflow.com/questions/2929776/how-to-save-a-fitted-r-model-for-later-use?rq= 1)的问题,我试着设置'model = FALSE',但没有明显的效果。 – 2013-03-06 23:47:32

+1

如果大数据导致你的问题,那么'biglm'可能是答案。 “biglm”类的对象小于“lm”,并且还有其他“大数据”效率 – mnel 2013-03-06 23:54:43

+0

实际上,这个问题并不是数据在内存中的大小,而是我用预测()功能。我的脚本创建了一个通过RPy2调用的夜间更新模型来为最终用户做出预测。使用142mb型号,它会永久加载每个请求。 – 2013-03-06 23:57:01

回答

6

您可以使用biglm来适合您的模型,biglm模型对象比lm模型对象小。您可以使用predict.biglm创建一个函数,您可以将新数据设计矩阵传递给返回预测值的函数。

另一种方法是使用saveRDS来保存文件,这些文件看起来略小,因为它们的开销较小,只是一个对象,不像保存可以保存多个对象。

library(biglm) 
m <- lm(log(Volume)~log(Girth)+log(Height), trees) 
mm <- lm(log(Volume)~log(Girth)+log(Height), trees, model = FALSE, x =FALSE, y = FALSE) 
bm <- biglm(log(Volume)~log(Girth)+log(Height), trees) 
pred <- predict(bm, make.function = TRUE) 
save(m, file = 'm.rdata') 
save(mm, file = 'mm.rdata') 
save(bm, file = 'bm.rdata') 
save(pred, file = 'pred.rdata') 
saveRDS(m, file = 'm.rds') 
saveRDS(mm, file = 'mm.rds') 
saveRDS(bm, file = 'bm.rds') 
saveRDS(pred, file = 'pred.rds') 

file.info(paste(rep(c('m','mm','bm','pred'),each=2) ,c('.rdata','.rds'),sep='')) 
#    size isdir mode mtime    ctime    atime    exe 
# m.rdata 2806 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:24:23 2013-03-07 11:29:30 no 
# m.rds  2798 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:29:30 2013-03-07 11:29:30 no 
# mm.rdata 2113 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:24:28 2013-03-07 11:29:30 no 
# mm.rds  2102 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:29:30 2013-03-07 11:29:30 no 
# bm.rdata 592 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:24:34 2013-03-07 11:29:30 no 
# bm.rds  583 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:29:30 2013-03-07 11:29:30 no 
# pred.rdata 1007 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:24:40 2013-03-07 11:29:30 no 
# pred.rds 995 FALSE 666 2013-03-07 11:29:30 2013-03-07 11:27:30 2013-03-07 11:29:30 no 
4

原来我解决了我自己的问题。使用以下内容:

model<-lm(form,data=ct,model=FALSE,x=FALSE,y=FALSE) 

大大减少了我的模型的大小。

6

几件事情:

  1. 这个问题确实是一个重复。

  2. 在狭义上model=FALSE已经在另一个问题中得到了回答。

  3. 在更广泛的意义上说,predict(fit, newdata)真的只是做一个矩阵向量乘法,所以你可以节省只是预测的向量,并用矩阵相乘。

  4. 有替代的拟合功能。以下是来自RcppArmadillo的fastLm()的一个例子,这个例子也更快。

查看下面的插图。

R> library(RcppArmadillo) 
Loading required package: Rcpp 
R> flm <- fastLm(Volume ~ Girth, data=trees) 
R> predict(flm, newdata=trees[1:5,])    ## can predict as with lm() 
[1] 5.10315 6.62291 7.63608 16.24803 17.26120 
R> object.size(flm)        ## tiny object size ... 
3608 bytes 
R> stdlm <- lm(Volume ~ Girth, data=trees) 
R> object.size(stdlm)       ## ... compared to what lm() has 
20264 bytes 
R> stdlm <- lm(Volume ~ Girth, data=trees, model=FALSE) 
R> object.size(stdlm)       ## ... even when model=FALSE 
15424 bytes 
R> 
相关问题