Я пишу функцию, подходящую для многих glm
моделей. Чтобы просто дать вам некоторое представление о функции, я включил небольшой раздел своего кода. С помощью нескольких пользователей SO функция теперь работает для моего анализа. Однако иногда, особенно когда размер образца относительно невелик, может потребоваться довольно много времени для завершения всего процесса. Чтобы сократить время, я рассматриваю возможность изменения некоторых деталей итеративной максимизации, таких как максимальное количество итераций. Я не нашел способа сделать это, возможно, потому что я все еще не знаком с R
терминологией. Будем благодарны за любые предложения сделать это или другие способы сократить время.
all_glm <- function(crude, xlist, data, family = "binomial", ...) {
# md_lst include formula for many models to be fitted
comb_lst <- unlist(lapply(1:n, function(x) combn(xlist, x, simplify=F)), recursive=F)
md_lst <- lapply(comb_lst,function(x) paste(crude, "+", paste(x, collapse = "+")))
models <- lapply(md_lst, function(x) glm(as.formula(x), family = family, data = data))
OR <- unlist(lapply(models, function(x) broom::tidy(x, exponentiate = TRUE)$estimate[2]))
}
EDIT Благодаря @BenBolker, который направил меня к пакету fastglm
, я получил несколько r
пакетов, которые могли бы предоставить более быстрые альтернативы glm
. Я пробовал fastglm
и speedglm
. Похоже, что оба быстрее, чем glm
на моей машине.
library(fastglm)
library(speedglm)
# from
set.seed(1)
n <- 25000
k <- 500
y <- rbinom(n, size = 1, prob = 0.5)
x <- round( matrix(rnorm(n*k),n,k),digits=3)
colnames(x) <-paste("s",1:k,sep = "")
df <- data.frame(y,x)
fo <- as.formula(paste("y~",paste(paste("s",1:k,sep=""),collapse="+")))
# Fit three models:
system.time(m_glm <- glm(fo, data=df, family = binomial))
system.time(m_speedglm <- speedglm(fo, data= df, family = binomial()))
system.time(m_fastglm <- fastglm(x, y, family = binomial()))
> system.time(m_glm <- glm(fo, data=df, family = binomial))
user system elapsed
56.51 0.22 58.73
> system.time(m_speedglm <- speedglm(fo, data= df, family = binomial()))
user system elapsed
17.28 0.04 17.55
> system.time(m_fastglm <- fastglm(x, y, family = binomial()))
user system elapsed
23.87 0.09 24.12