我想lm()在一个包含2个预测变量的50M +观测值的大型数据集上运行.分析在远程服务器上运行,只有10GB用于存储数据.我已经对从数据中采样的10K观测值测试了'lm()',结果对象的大小为2GB +.
我需要从lm()ONLY 返回的类"lm"的对象来生成model(summary(lm_object))的摘要统计信息并进行预测(predict(lm_object)).
我做了一些实验用的选项model, x, y, qr的lm.如果我将它们全部设置为FALSE我将尺寸减小38%
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
Run Code Online (Sandbox Code Playgroud)
但
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).
Run Code Online (Sandbox Code Playgroud)
显然,我需要保持qr=TRUE与默认对象相比,将对象大小减少仅9%
fit3=lm(medv~lstat,data=Boston,model=F,x=F,y=F,qr=T)
size3 <- object.size(fit3)
print(size3, units = "Kb")
# 115.8 Kb
- ((as.integer(size1) - as.integer(size3)) / as.integer(size1)) * 100
# -9.142752
Run Code Online (Sandbox Code Playgroud)
如何在不将大量不需要的信息转储到内存和存储中的情况下,将"lm"对象的大小降至最低?
这里的链接提供了相关的答案(对于 glm 对象,它与 lm 输出对象非常相似)。
http://www.win-vector.com/blog/2014/05/trimming-the-fat-from-glm-models-in-r/
基本上,预测仅使用系数部分,它是 glm 输出的很小一部分。下面的函数(从链接复制)修剪预测不会使用的信息。
但它确实有一个警告。修剪后,它不能被 Summary(fit) 或其他汇总函数使用,因为这些函数需要的内容比预测需要的更多。
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$qr = c()
cm$linear.predictors = c()
cm$weights = c()
cm$prior.weights = c()
cm$data = c()
cm
}
Run Code Online (Sandbox Code Playgroud)
小智 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
Run Code Online (Sandbox Code Playgroud)