Я пытаюсь оценить модель с помощью speedglm в R. Набор данных большой (~69,88 млн строк и 38 столбцов). Умножение количества строк и столбцов дает ~ 2,7 миллиарда, что выходит за пределы целочисленного ограничения. Я не могу предоставить данные, но следующие примеры воссоздают проблему.
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)