TL; DR: lme4
tối ưu hóa dường như là tuyến tính trong số các thông số mô hình theo mặc định, và là cách chậm hơn so với một tương đương glm
mô hình với biến giả cho các nhóm. Có bất cứ điều gì tôi có thể làm để tăng tốc nó?
Tôi đang cố gắng phù hợp với mô hình logit phân cấp khá lớn (~ 50k hàng, 100 cột, 50 nhóm). Kết hợp mô hình logit bình thường với dữ liệu (với các biến giả cho nhóm) hoạt động tốt, nhưng mô hình phân cấp dường như bị kẹt: giai đoạn tối ưu hóa đầu tiên hoàn thành tốt, nhưng lần thứ hai trải qua rất nhiều lần lặp mà không có gì thay đổi và không dừng lại .
EDIT: Tôi nghi ngờ vấn đề chủ yếu là tôi có quá nhiều tham số, bởi vì khi tôi cố gắng đặt thành maxfn
giá trị thấp hơn, nó sẽ đưa ra cảnh báo:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
Tuy nhiên, ước tính tham số không thay đổi trong suốt quá trình tối ưu hóa, vì vậy tôi vẫn bối rối không biết phải làm gì. Khi tôi cố gắng thiết lập maxfn
trong các điều khiển tối ưu hóa (bất chấp cảnh báo), nó dường như bị treo sau khi hoàn thành tối ưu hóa.
Đây là một số mã tái tạo vấn đề cho dữ liệu ngẫu nhiên:
library(lme4)
set.seed(1)
SIZE <- 50000
NGRP <- 50
NCOL <- 100
test.case <- data.frame(i=1:SIZE)
test.case[["grouping"]] <- sample(NGRP, size=SIZE, replace=TRUE, prob=1/(1:NGRP))
test.case[["y"]] <- sample(c(0, 1), size=SIZE, replace=TRUE, prob=c(0.05, 0.95))
test.formula = y ~ (1 | grouping)
for (i in 1:NCOL) {
colname <- paste("col", i, sep="")
test.case[[colname]] <- runif(SIZE)
test.formula <- update.formula(test.formula, as.formula(paste(". ~ . +", colname)))
}
print(test.formula)
test.model <- glmer(test.formula, data=test.case, family='binomial', verbose=TRUE)
Kết quả này:
start par. = 1 fn = 19900.78
At return
eval: 15 fn: 19769.402 par: 0.00000
(NM) 20: f = 19769.4 at 0 <other numbers>
(NM) 40: f = 19769.4 at 0 <other numbers>
Tôi đã thử thiết lập ncol
các giá trị khác và có vẻ như số lần lặp được thực hiện là (khoảng) 40 mỗi cột. Rõ ràng, điều này trở thành một nỗi đau lớn khi tôi thêm nhiều cột. Có những chỉnh sửa nào tôi có thể thực hiện đối với thuật toán tối ưu hóa sẽ làm giảm sự phụ thuộc vào số lượng cột?
glmer
khá chậm, đặc biệt đối với các mô hình có cấu trúc hiệu ứng ngẫu nhiên phức tạp (ví dụ: nhiều độ dốc ngẫu nhiên, hiệu ứng ngẫu nhiên chéo, v.v.). Đề nghị đầu tiên của tôi sẽ là thử lại với cấu trúc hiệu ứng ngẫu nhiên đơn giản hóa. Tuy nhiên, nếu bạn chỉ gặp vấn đề này với một mô hình chặn ngẫu nhiên, vấn đề của bạn có thể chỉ đơn giản là số lượng các trường hợp, trong trường hợp đó bạn sẽ cần thử một số công cụ chuyên dùng cho dữ liệu lớn.