Я пишу функцию, подходящую для многих моделей 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
fastglm
. Он позволяет пользователям назначать пороговый допуск для сходимости и максимальное количество итераций, но требует, чтобыx
был матричным объектом, что может быть неудобно для некоторых конечных пользователей. - person Zhiqiang Wang   schedule 18.10.2019numeric
иfactor
. Я хотел бы сделать функцию универсальной для разных типов предикторов. Я постараюсь разработать воспроизводимый пример. Спасибо. - person Zhiqiang Wang   schedule 18.10.2019openGL
или другие полностью основанные наc++
реализации могут быть немного быстрее. Что касается проблемы сfastglm
, разрешающей только числовыеx
иy
, я предлагаю использовать стандартный вызов glmglm(fo, data = df, family = binomial, method = "fastglm")
. Вызовglm
позаботится о преобразовании вашей формулы в матрицу модели и даст необходимые данные дляfastglm
. Обратите внимание, что печать вывода занимает много времени, если вы используете этот метод (по неизвестным мне причинам). - person Oliver   schedule 18.10.2019method =
! Я не могу использоватьfastglm
в своей функции по другой причине: не могуbroom::tidy()
использовать объектfastglm
.speedglm
работает нормально. Большое спасибо! - person Zhiqiang Wang   schedule 19.10.2019