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

时间:2017-06-06 19:56:18

标签: r estimation computation speedglm

我试图在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

谢谢,

JP。

正在运行: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)

2 个答案:

答案 0 :(得分:2)

<强>更新

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

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

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

我原来的回答:

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

该行是:

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

警告的发生是因为nrow(X)*ncol(X)用于大型矩阵。 nrowncol函数返回integer值,这些值可能会溢出。这是一个例子。

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

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

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

答案 1 :(得分:1)

感谢@Andrey的指导,我能够解决问题。问题是is.sparse检查中的示例函数。为了绕过这一点,我在sparse=FALSE的选项中设置了speedglm(这也应该适用于sparse=TRUE,但我还没有尝试过。)这是因为speedglm调用{ {1}}通过is.sparse通过以下方式:

speedglm.wfit

因此设置if (is.null(sparse)) sparse <- is.sparse(x = x, sparsellim, camp) 会避免使用sparse函数。

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

is.sparse