我正在处理包含超过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)
}
Run Code Online (Sandbox Code Playgroud)
结果看起来很棒,一切都在顺利进行,直到用每个数据块更新模型的累计观测数超过2 ^ 31个观测值.然后,我得到一个错误,读取
In object$n + NROW(mm) : NAs produced by integer overflow
Run Code Online (Sandbox Code Playgroud)
如何解决这个溢出问题?在此先感谢您的帮助!
我相信我已经在biglm代码中找到了问题的根源.
观察数(n)存储为整数,其最大值为2^31 - 1.
该numeric类型不受此限制,并且据我所知,可以使用而不是整数来存储n.
这是github上的一个提交,显示如何通过一个额外的代码行来解决这个问题,该代码行将整数转换n为a 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))
Run Code Online (Sandbox Code Playgroud)
在原始的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
Run Code Online (Sandbox Code Playgroud)
我的修补版本输出:
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
Run Code Online (Sandbox Code Playgroud)
SE和p值不为零,只是在上面的输出中四舍五入.
我是R生态系统的新手,所以如果有人能告诉我如何提交这个补丁以便原始作者可以审阅并最终包含在上游包中,我将不胜感激.