我正在尝试使用速度估计R中的一个模型,数据集很大(大约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 我理解警告,但我不理解错误。在这种情况下,它们似乎是相关的,因为它们在每次尝试之后都出现在一起。
删除列允许完成估计。移除哪些列似乎并不重要;删除交互变量或非交互变量都将导致完成估计。在最初收到错误后添加了块大小选项,但没有起到帮助作用。
我的问题是:(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)发布于 2017-06-06 20:25:21
更新:
根据下面的研究,詹姆斯指出,可以通过在调用NULL函数中为参数sparse提供非speedglm值来避免这个问题,因为它阻止了is.sparse函数的内部调用。
使用上面的示例,以下内容现在应该可以工作了:
speedglm(fo, data = da, family = Gamma(log), sparse = FALSE)我最初的答案是:
警告和错误都来自包speedglm中函数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发布于 2017-06-07 13:24:11
由于@Andrey的指导,我能够解决这个问题。问题是is.sparse检查中的示例函数。为了绕过这个问题,我在speedglm选项中设置了sparse=FALSE (虽然我还没有尝试,但它也适用于sparse=TRUE )。这是因为speedglm通过speedglm.wfit调用is.sparse的方式如下:
if (is.null(sparse))
sparse <- is.sparse(x = x, sparsellim, camp)因此,设置sparse可以避免is.sparse函数。
使用上面的示例,以下内容现在应该可以工作了:
speedglm(fo, data = da, family = Gamma(log), sparse = FALSE)https://stackoverflow.com/questions/44398763
复制相似问题