2013-03-06 58 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> 
相關問題