首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R估计中整数溢出误差的求解

R估计中整数溢出误差的求解
EN

Stack Overflow用户
提问于 2017-06-06 19:56:18
回答 2查看 2.9K关注 0票数 9

我正在尝试使用速度估计R中的一个模型,数据集很大(大约6988万行,38列)。将行数和列数相乘,结果是27亿行,超出了整数限制。我无法提供数据,但是下面的示例重新创建了这个问题。

代码语言:javascript
复制
library(speedglm)

# large example that works 
require(biglm)
n <- 500000
k <- 500
y <- rgamma(n, 1.5, 1)
x <- round(matrix(rnorm(n*k), n, k), digits = 3)
colnames(x) <- paste("s", 1:k, sep = "")
da <- data.frame(y, x)
fo <- as.formula(paste("y~", paste(paste("s", 1:k, sep = ""), collapse = "+")))   
working.example <- speedglm(fo, data = da, family = Gamma(log))

# repeat with large enough size to break 
k <- 5000       # 10 times larger than above
x <- round(matrix(rnorm(n*k), n, k), digits = 3)
colnames(x) <- paste("s", 1:k, sep = "")
da <- data.frame(y, x)
fo <- as.formula(paste("y~", paste(paste("s", 1:k, sep = ""), collapse = "+")))   
failed.example <- speedglm(fo, data = da, family = Gamma(log))

# attempting to resolve error with chunksize
attempted.fixed.example <- speedglm(fo, data = da, family = Gamma(log), chunksize = 10^6)

这将导致错误和整数溢出警告。

代码语言:javascript
复制
Error in if (!replace && is.null(prob) && n > 1e+07 && size <= n/2) .Internal(sample2(n,  :  
  missing value where TRUE/FALSE needed
In addition: Warning message:
In nrow(X) * ncol(X) : NAs produced by integer overflow 

我理解警告,但我不理解错误。在这种情况下,它们似乎是相关的,因为它们在每次尝试之后都出现在一起。

删除列允许完成估计。移除哪些列似乎并不重要;删除交互变量或非交互变量都将导致完成估计。在最初收到错误后添加了块大小选项,但没有起到帮助作用。

我的问题是:(1)导致第一个错误的原因是什么?(2)是否有一种方法可以使用数据来估计模型,使列数的行数大于整数限制?(3)在这种情况下是否使用更好的na.action?

谢谢,

JP。

运行:r版本3.3.3 (2017-03-06)

实际代码如下:

代码语言:javascript
复制
dft_var <- c("cltvV0", "cltvV60", "cltvV120", "VCFLBRQ", "ageV0", 
             "ageV1", "ageV8", "ageV80", "FICOV300", "FICOV650", 
             "FICOV900", "SingleHouse", "Apt", "Mobile", "Duplex", 
             "Row", "Modular", "Rural", "FirstTimeBuyer", 
             "FirstTimeBuyerMissing", "brwtotinMissing", "IncomeRatio", 
             "VintageBefore2001", "NFLD", "yoy.fcpwti:province_n") 
logit1 <- speedglm(formula = paste("DefaultFlag ~ ", 
                                   paste(dft_var, collapse = "+"), 
                                   sep = ""), 
                   family = binomial(logit), 
                   na.action = na.exclude, 
                   data = default.data,
                   chunksize = 1*10^7)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-06 20:25:21

更新:

根据下面的研究,詹姆斯指出,可以通过在调用NULL函数中为参数sparse提供非speedglm值来避免这个问题,因为它阻止了is.sparse函数的内部调用。

使用上面的示例,以下内容现在应该可以工作了:

代码语言:javascript
复制
speedglm(fo, data = da, family = Gamma(log), sparse = FALSE)

我最初的答案是:

警告和错误都来自包speedglm中函数speedglm中的同一行。

这一行是:

代码语言:javascript
复制
sample(X,round((nrow(X)*ncol(X)*camp),digits=0),replace=FALSE)

发生此警告的原因是对大型矩阵使用nrow(X)*ncol(X)nrowncol函数返回可能溢出的integer值。这是一个例子。

代码语言:javascript
复制
nr = 1000000L
nc = 1000000L
nr*nc
# [1] NA
# Warning message:
# In nr * nc : NAs produced by integer overflow

发生错误的原因是,当X是一个大矩阵和sample时,size = NA函数被混淆了。下面是一个例子:

代码语言:javascript
复制
sample(matrix(1,3000,1000000), NA, replace=FALSE)
# Error in if (useHash) .Internal(sample2(n, size)) else .Internal(sample(n,  : 
# missing value where TRUE/FALSE needed
票数 5
EN

Stack Overflow用户

发布于 2017-06-07 13:24:11

由于@Andrey的指导,我能够解决这个问题。问题是is.sparse检查中的示例函数。为了绕过这个问题,我在speedglm选项中设置了sparse=FALSE (虽然我还没有尝试,但它也适用于sparse=TRUE )。这是因为speedglm通过speedglm.wfit调用is.sparse的方式如下:

代码语言:javascript
复制
if (is.null(sparse))
    sparse <- is.sparse(x = x, sparsellim, camp)

因此,设置sparse可以避免is.sparse函数。

使用上面的示例,以下内容现在应该可以工作了:

代码语言:javascript
复制
speedglm(fo, data = da, family = Gamma(log), sparse = FALSE)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44398763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档