如何使用具有超过 2^31 个观测值的 biglm
Posted
技术标签:
【中文标题】如何使用具有超过 2^31 个观测值的 biglm【英文标题】:How to use biglm with more than 2^31 observations 【发布时间】:2017-06-11 17:43:53 【问题描述】:我正在处理包含超过 2^31 个观察值的大量数据。实际观测次数接近 35 亿次。
我正在使用 R 包“biglm”来运行包含大约 70 个预测变量的回归。我一次读取一百万行数据并更新回归结果。数据已使用 R 库“ffdf”以 ffdf 格式保存,以快速加载并避免耗尽我所有的 RAM。
这是我正在使用的代码的基本大纲:
library(ff,ffbase,biglm)
load.ffdf(dir='home')
dim(data) #the ffdf contains about 70 predictors and 3.5 billion rows
chunk_1 <- data[1:1000000,]
rest_of_data <- data[1000000:nrow(data),]
# Running biglm for first chunk
b <- biglm(y~x1+x2+...+x70, chunk_1)
chunks <- ceiling((nrow(rest_of_data)/1000000)
# Updating biglm results by iterating through the rest of the data chunks
for (i in seq(1,chunks))
start <- 1+((i-1))*1000000
end <- min(i*1000000,nrow(d))
d_chunk <- d[start:end,]
b<-update(b,d_chunk)
结果看起来不错,一切运行顺利,直到使用每个数据块更新模型的累积观察次数超过 2^31 次观察。然后,我收到一个错误,内容为
In object$n + NROW(mm) : NAs produced by integer overflow
如何解决这个溢出问题?提前感谢您的帮助!
【问题讨论】:
@DavidArenburg 我目前使用的是 64 位系统,并且我使用的是 R 3.4.0。但是,我仍然遇到整数溢出问题。 你真的有一个 1.8TB 的数据集吗? 【参考方案1】:我相信我已经在 biglm 代码中找到了问题的根源。
观察次数 (n
) 以整数形式存储,has a max value 是 2^31 - 1
。
numeric
类型不受此限制,据我所知,它可以用来代替整数来存储 n
。
Here is a commit on github 展示了如何通过另外一行将整数 n
转换为 numeric
的代码来解决此问题。随着模型的更新,新批次的行数会添加到旧的n
,所以n
的类型仍然是numeric
。
我能够重现此问题中描述的错误并验证我的修复是否适用于此代码:
(警告:这会消耗大量内存,如果您有严格的内存限制,请考虑使用较小的数组进行更多迭代)
library(biglm)
df = as.data.frame(replicate(3, rnorm(10000000)))
a = biglm(V1 ~ V2 + V3, df)
for (i in 1:300)
a = update(a, df)
print(summary(a))
在原来的 biglm 库中,这段代码输出:
Large data regression model: biglm(ff, df)
Sample size = NA
Coef (95% CI) SE p
(Intercept) -1e-04 NA NA NA NA
V2 -1e-04 NA NA NA NA
V3 -2e-04 NA NA NA NA
我的补丁版本输出:
Large data regression model: biglm(V1 ~ V2 + V3, df)
Sample size = 3.01e+09
Coef (95% CI) SE p
(Intercept) -3e-04 -3e-04 -3e-04 0 0
V2 -2e-04 -2e-04 -1e-04 0 0
V3 3e-04 3e-04 3e-04 0 0
SE 和 p 值不为零,只是在上面的输出中四舍五入。
我是 R 生态系统的新手,所以如果有人能告诉我如何提交此补丁,以便原作者审核并最终包含在上游包中,我将不胜感激。
【讨论】:
不幸的是 biglm 包看起来被放弃了;上一个版本是 4 年前。幸运的是,由于它是开源的,任何人都可以接受您的更改并在自己的系统上编译 (+1)。 哇,这太棒了。非常感谢您的帮助!这对我来说意义重大,我希望它对其他使用大数据的人有所帮助:) 不是自动化的,但更快的解决方案是使用biglm <- edit(biglm)
并在rval <- list(...)
之后添加您的修复rval$n<-as.numeric(rval$n)
@rawr 是否会“永久”更改我的本地版本包,还是每次我开始新的 R 会话时都必须这样做?
是的,您每次都必须这样做。您可以在编辑后rm(biglm)
取回原件,或重新编辑。它比创建另一个分支并且每次都必须重新安装要快。即使您自己编辑并保存,该函数仍然认为它在包中,因此不会出现任何范围界定或“未找到对象”问题以上是关于如何使用具有超过 2^31 个观测值的 biglm的主要内容,如果未能解决你的问题,请参考以下文章
如何使用超过 5000 万个观测值的样本计算具有固定效应的 logit 模型的边际效应
是否可以导入包含超过 1,000,000 个观测值的 xpt 文件?