【发布时间】:2014-03-20 17:09:19
【问题描述】:
我想在一个大型数据集上运行 lm(),该数据集包含 5000 万多个观测值和 2 个预测变量。分析在只有 10GB 存储数据的远程服务器上运行。我已经对从数据中采样的 10K 观察结果进行了“lm()”测试,结果对象的大小为 2GB+。
我只需要从lm() 返回的“lm”类对象来生成模型的汇总统计信息 (summary(lm_object)) 并进行预测 (predict(lm_object))。
我对@987654327@ 的选项model, x, y, qr 做了一些实验。如果我将它们全部设置为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
但是
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).
显然我需要保留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
如何在不将大量不需要的信息转储到内存和存储中的情况下将“lm”对象的大小降至最低?
【问题讨论】:
-
+1 有趣的问题。您还没有尝试过自己切换每个选项吗?顺便说一句,写出 TRUE 和 FALSE 更安全,因为您以后可能会忘记并使用这些名称创建变量。
-
我相信您会在stackoverflow.com/questions/15260429/… 或链接的其中一个问题中找到答案
-
我看不出
lm仅使用 10000 个观察值如何产生 2GB 的对象。您的数据集中有多少列? -
@HongOoi 我在模型中使用了两个预测变量。我认为包含我没有建模的变量的数据集有 5 列
-
10000x5 的数据集不可能产生 2GB 的对象。我会检查以确保您不会意外包含大型环境。你是从另一个函数内部调用
lm来操作你的大数据集吗?