如何在不调用整个 'object' 的情况下使用 nlme::predict.lme 进行预测

How to predict with with nlme::predict.lme without calling the whole 'object'

使用 lme 函数,我在具有近 470K 个观测值和大约 40 个变量的大型数据集上拟合了一个模型。此拟合 (object.size(fit)) 的大小接近 300 Mb,无法存储在服务器中。目标是让用户交互式地定义一个 newdata(最多有 500 个观察值),然后调用 predict(fit, newdata, level = 0, na.action = na.omit) 来输出预测值。问题是如何在服务器中有限的存储 space 的情况下减小 fit 的大小?

已经在 this post 中尝试了几种方法,但它并没有将大小缩小到我真正需要的大小。

有什么想法吗?谢谢!


lme 对象,与任何 class 对象一样,旨在包含它们可能需要的所有内容,以便调用已编写的任何函数。如果你只想使用裸机,你只需要拉出你需要的东西并重新分配 class 以便调用正确的 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