我希望在大型数据集上运行lm()
,其中包含50个+观察值和2个预测变量。分析在远程服务器上运行,只有10GB用于存储数据。我已经对从数据中采样的10K观测值测试了'lm()',结果对象的大小为2GB +。
我需要从lm()
返回的类“lm”的对象,以生成模型的摘要统计信息(summary(lm_object)
)并进行预测(predict(lm_object)
)。
我已对model, x, y, qr
的{{1}}选项进行了一些实验。如果我将它们全部设置为lm
,我会将大小缩小38%
FALSE
但
library(MASS)
fit1=lm(medv~lstat,data=Boston)
size1 <- object.size(fit1)
print(size1, units = "Kb")
# 127.4 Kb bytes
fit2=lm(medv~lstat,data=Boston,model=F,x=F,y=F,qr=F)
size2 <- object.size(fit2)
print(size2, units = "Kb")
# 78.5 Kb Kb bytes
- ((as.integer(size1) - as.integer(size2)) / as.integer(size1)) * 100
# -38.37994
显然我需要保留summary(fit2)
# Error in qr.lm(object) : lm object does not have a proper 'qr' component.
# Rank zero or should not have used lm(.., qr=FALSE).
predict(fit2,data=Boston)
# Error in qr.lm(object) : lm object does not have a proper 'qr' component.
# Rank zero or should not have used lm(.., qr=FALSE).
,与默认对象相比,它只会将对象大小减少9%
qr=TRUE
如何在不将大量不需要的信息转储到内存和存储空间的情况下,将“lm”对象的大小降至最低?
答案 0 :(得分:4)
这里的链接提供了一个相关的答案(对于glm对象,它与lm输出对象非常相似)。
http://www.win-vector.com/blog/2014/05/trimming-the-fat-from-glm-models-in-r/
基本上,预测只使用系数部分,它是glm输出的很小一部分。下面的函数(从链接复制)修剪预测不会使用的信息。
但确实有一点需要注意。修剪后,它不能被摘要(拟合)或其他摘要函数使用,因为这些函数需要更多的预测需要。
cleanModel1 = function(cm) {
# just in case we forgot to set
# y=FALSE and model=FALSE
cm$y = c()
cm$model = c()
cm$residuals = c()
cm$fitted.values = c()
cm$effects = c()
cm$qr = c()
cm$linear.predictors = c()
cm$weights = c()
cm$prior.weights = c()
cm$data = c()
cm
}
答案 1 :(得分:0)
我也试图处理同样的问题。我使用的不是完美的其他东西,但适用于预测,你基本上可以取出lm中qr槽的qr槽:
lmFull <- lm(Volume~Girth+Height,data=trees)
lmSlim <- lmFull
lmSlim$fitted.values <- lmSlim$qr$qr <- lmSlim$residuals <- lmSlim$model <- lmSlim$effects <- NULL
pred1 <- predict(lmFull,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
pred2 <- predict(lmSlim,newdata=data.frame(Girth=c(1,2,3),Height=c(2,3,4)))
identical(pred1,pred2)
[1] TRUE
as.numeric((object.size(lmFull) - object.size(lmSlim)) / object.size(lmFull))
[1] 0.6550523
答案 2 :(得分:0)
xappp的答案很好但不是整个故事。您还可以执行一些巨大的环境变量(请参阅:https://blogs.oracle.com/R/entry/is_the_size_of_your)
将此添加到xappp的功能
e <- attr(cm$terms, ".Environment")
parent.env(e) <- emptyenv()
rm(list=ls(envir=e), envir=e)
或者使用此版本减少数据量,但仍允许您使用summary()
cleanModel1 = function(cm) {
# just in case we forgot to set
# y=FALSE and model=FALSE
cm$y = c()
cm$model = c()
e <- attr(cm$terms, ".Environment")
parent.env(e) <- emptyenv()
rm(list=ls(envir=e), envir=e)
cm
}