如何使用具有超过 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 &lt;- edit(biglm)并在rval &lt;- list(...)之后添加您的修复rval$n&lt;-as.numeric(rval$n) @rawr 是否会“永久”更改我的本地版本包,还是每次我开始新的 R 会话时都必须这样做? 是的,您每次都必须这样做。您可以在编辑后rm(biglm) 取回原件,或重新编辑。它比创建另一个分支并且每次都必须重新安装要快。即使您自己编辑并保存,该函数仍然认为它在包中,因此不会出现任何范围界定或“未找到对象”问题

以上是关于如何使用具有超过 2^31 个观测值的 biglm的主要内容,如果未能解决你的问题,请参考以下文章

如何使用超过 5000 万个观测值的样本计算具有固定效应的 logit 模型的边际效应

是否可以导入包含超过 1,000,000 个观测值的 xpt 文件?

超过2组的R上的马氏距离

无法发布具有许多(超过 256 个)值的表单

如何在处理 r 中超过 500 万个观测值的数据框时加快迭代速度?

具有列表值的列,如果列表具有超过 1 个元素,则解码这两个值并包含在新列的同一行中的列表中