使用lme
函数,我在一个大型数据集上拟合了一个模型,该数据集具有接近470K的观测值和大约40个变量。这个拟合的大小(object.size(fit)
)接近300 Mb,这在存储在服务器中是不可行的。目标是让用户以交互方式定义newdata
(最多有500个观察值),然后调用predict(fit, newdata, level = 0, na.action = na.omit)
输出预测值。问题是如果在服务器中有限的存储空间,我如何减小fit
的大小?
已经在this post尝试了几种方法,但它并没有缩小到我真正需要的大小。
有什么想法?谢谢!
答案 0 :(得分:3)
lme
对象与任何类一样,旨在包含任何已编写为要在其上调用的函数所需的所有内容。如果你只想使用裸骨,你只需要拔出你需要的东西并重新分配类,这样就可以调用正确的S3方法。要查看所需的组件,您必须查看源nlme:::predict.lme
。以下是Orthodont
数据集的示例。
library(nlme)
data(Orthodont)
# Just fit a model
fm1 <- lme(distance ~ age, data = Orthodont)
# pull out the minimal components needed for prediction
min_fm1 <- list(modelStruct = fm1$modelStruct,
dims = fm1$dims,
contrasts = fm1$contrasts,
coefficients = fm1$coefficients,
groups = fm1$groups,
call = fm1$call,
terms = fm1$terms)
# assign class otherwise the default predict method would be called
class(min_fm1) <- "lme"
# By dropping this like fm1$data you trim it down quite a bit
object.size(fm1)
63880 bytes
object.size(min_fm1)
22992 bytes
# make sure output identical
identical(predict(min_fm1, Orthodont, level = 0, na.action = na.omit),
predict(fm1, Orthodont, level = 0, na.action = na.omit))
[1] TRUE