Есть ли способ "сжать" объект lm() для последующего предсказания?

Есть ли способ "сжать" объект класса lm, чтобы я мог сохранить его на диск и загрузить его позже для использования с предсказуемым прогнозом?

У меня есть объект lm, который при сохранении составляет ~ 142 мб, и я с трудом верю, что для получения линейного предсказания для прогнозирования требуется все исходные наблюдения/установленные значения/остатки и т.д. Можно ли удалить информацию, чтобы уменьшенная модель была меньше?

Я попытался установить некоторые переменные (fit.values, остатки и т.д.) в NA, но, похоже, это не влияет на размер сохраненного файла.

Ответ 1

Вы можете использовать biglm для соответствия вашим моделям, объект модели biglm меньше, чем объект модели lm. Вы можете использовать predict.biglm создать функцию, через которую вы можете передать матрицу проектирования newdata, которая возвращает предсказанные значения.

Другим вариантом является использование 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

Ответ 2

Несколько вещей:

  • Этот вопрос действительно является дубликатом.

  • В узком смысле model=FALSE, как уже было сказано в другом вопросе.

  • В более широком смысле predict(fit, newdata) действительно просто умножает вектор-матрицу, поэтому вы можете сохранить только вектор прогнозов и умножить его на матрицу.

  • Существуют альтернативные функции подгонки. Ниже приведен пример из fastLm() в RcppArmadillo, который также случается быстрее.

См. ниже иллюстрацию.

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> 

Ответ 3

Оказывается, я решил свою проблему. Используя следующее:

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

существенно уменьшил размер моей модели.