如何使用nlme :: predict.lme进行预测,而无需调用整个对象'

时间:2015-02-16 15:43:24

标签: r nlme

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

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

有什么想法?谢谢!


1 个答案:

答案 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