我试图在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)
答案 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)
用于大型矩阵。 nrow
和ncol
函数返回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