如何使用biglm超过2 ^ 31观察
我正在处理包含超过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 value为2 ^ 31-1. 数字类型不受此限制,并且据我所知,可以使用而不是整数来存储n. Here is a commit on github显示了如何使用一行将整数n转换为数字的代码来解决此问题.随着模型的更新,新批次中的行数将添加到旧的n中,因此n的类型仍为数字. 我能够重现此问题中描述的错误,并验证我的修复程序是否适用于此代码: (警告:这会消耗大量内存,如果您有严格的内存限制,请考虑使用较小的阵列进行更多迭代) 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生态系统的新手,所以如果有人能告诉我如何提交这个补丁以便原始作者可以审阅并最终包含在上游包中,我将不胜感激. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |