gpt4 book ai didi

r - 如何在超过 2^31 个观察值中使用 biglm

转载 作者:行者123 更新时间:2023-12-04 18:02:03 24 4
gpt4 key购买 nike

我正在处理包含超过 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

我如何解决这个溢出问题?在此先感谢您的帮助!

最佳答案

我相信我已经在 biglm 代码中找到了问题的根源。

观察数 ( n ) 存储为整数,即 has a max value2^31 - 1 .
numeric type 不受此限制,据我所知,可以代替整数来存储 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 生态系统相当陌生,所以如果有人能告诉我如何提交此补丁,以便原作者对其进行审查并最终包含在上游包中,我将不胜感激。

关于r - 如何在超过 2^31 个观察值中使用 biglm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44486842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com