gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:49:40 24 4
gpt4 key购买 nike

我正在尝试使用 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 发现可以通过提供非 NULL 来避免该问题。参数值sparsespeedglm的召唤下函数,因为它阻止 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

发生错误的原因是 sample当 X 是一个大矩阵且 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

关于r - 如何解决 R 估计中的整数溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44398763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com