如何解决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)
。 nrow
和 ncol
函数 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)
我正在尝试使用 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)
。 nrow
和 ncol
函数 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)