如何解决R估计中的整数溢出错误

How to resolve integer overflow errors in R estimation

我正在尝试使用 R 中的 speedglm 估计模型。数据集很大(约 6988 万行和 38 列)。将行数和列数相乘得到约 27 亿,这超出了整数限制。我无法提供数据,但以下示例重现了该问题。

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)

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

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 

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

删除列可以完成估算。删除哪些列似乎无关紧要;删除交互或非交互变量都将导致完成估计。 chunksize 选项是在最初收到错误后添加的,但没有帮助。

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

谢谢,

日本.

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

实际代码如下:

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)

更新:

根据我下面的调查,@James 发现可以通过在 speedglm 函数的调用中为参数 sparse 提供非 NULL 值来避免该问题,因为它阻止了 is.sparse 函数的内部调用。

使用上面的示例,现在应该可以执行以下操作:

speedglm(fo, data = da, family = Gamma(log), sparse = FALSE)

我原来的回答:

警告和错误都来自包 speedglm.

中函数 is.sparse 的同一行

行是:

sample(X,round((nrow(X)*ncol(X)*camp),digits=0),replace=FALSE)

出现警告是因为对大型矩阵使用了 nrow(X)*ncol(X)nrowncol 函数 return integer 值,可能会溢出。这是一个插图。

nr = 1000000L
nc = 1000000L
nr*nc
# [1] NA
# Warning message:
# In nr * nc : NAs produced by integer overflow

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

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

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

if (is.null(sparse))
    sparse <- is.sparse(x = x, sparsellim, camp)

所以设置sparse避免了is.sparse函数。

使用上面的示例,现在应该可以执行以下操作:

speedglm(fo, data = da, family = Gamma(log), sparse = FALSE)