R 适合多种glm型号:提高速度
我正在编写一个函数来适应许多R 适合多种glm型号:提高速度,r,glm,R,Glm,我正在编写一个函数来适应许多glm模型。为了给你一些关于函数的想法,我在代码中加入了一小部分。在几个SO用户的帮助下,该函数现在可以用于我的分析目的。然而,有时,特别是当样本量相对较小时,完成整个过程可能需要相当长的时间。 为了减少时间,我正在考虑更改迭代最大化的一些细节,例如最大迭代次数。我还没有找到一种方法,可能是因为我还不熟悉R术语。任何建议,这样做或其他方式,以减少时间将不胜感激 all_glm <- function(crude, xlist, data, family = "b
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]))
}
通常用于拟合glms的IRLS算法需要在每次迭代时进行矩阵求逆/分解
fastglm
提供了几种不同的分解选项,默认选项是较慢但更稳定的选项(带列旋转的QR)。如果您唯一感兴趣的是速度,那么两种可用的Cholesky类型分解中的一种将显著提高速度,这比仅仅更改IRLS迭代次数更可取。fastglm
和标准IRLS实现之间的另一个显著区别是它小心地使用了半步,以防止分歧(在许多情况下,IRLS在实践中可能会分歧)
fastglm
的方法
参数允许更改分解。选项2给出了vanilla Cholesky分解,选项3给出了一个稍微更稳定的版本。在我的计算机上,您提供的示例的计时为:
> system.time(m_glm <- glm(fo, data=df, family = binomial))
user system elapsed
23.206 0.429 23.689
> system.time(m_speedglm <- speedglm(fo, data= df, family = binomial()))
user system elapsed
15.448 0.283 15.756
> system.time(m_fastglm <- fastglm(x, y, family = binomial(), method = 2))
user system elapsed
2.159 0.055 2.218
> system.time(m_fastglm <- fastglm(x, y, family = binomial(), method = 3))
user system elapsed
2.247 0.065 2.337
>system.time(m_glm system.time)(m_speedglm system.time)(m_fastglm system.time(m_fastglm你试过这个软件包吗?@BenBolker谢谢。没有,我没有,我会试试看它是否有什么不同。@BenBolker我试过fastglm
。它允许用户指定收敛的阈值容差和最大迭代次数,但它要求x
必须是矩阵对象,这可能是不可更改的对于一些终端用户来说,是不是所有的预测值都是数字的,还是一些因素(分类的)?A最好。你的问题的典型维度是什么(观察的数量,预测值的数量)?你是否考虑过惩罚(套索/脊线)方法?这是最微小的注释。我不知道在R中有更快的实现,但是通过一些技巧可能openGL
或其他完全基于c++
的实现可能会稍微快一点。至于fastglm
的问题,我建议使用st标准glm调用glm(fo,data=df,family=binomial,method=“fastglm”)
。调用glm
将负责将公式转换为模型矩阵,并为fastglm
提供必要的输入。请注意,如果使用此方法(我不知道原因),打印输出确实需要很长时间.非常感谢。我从你的回答中学到了一些有趣和有益的东西。
> system.time(m_glm <- glm(fo, data=df, family = binomial))
user system elapsed
23.206 0.429 23.689
> system.time(m_speedglm <- speedglm(fo, data= df, family = binomial()))
user system elapsed
15.448 0.283 15.756
> system.time(m_fastglm <- fastglm(x, y, family = binomial(), method = 2))
user system elapsed
2.159 0.055 2.218
> system.time(m_fastglm <- fastglm(x, y, family = binomial(), method = 3))
user system elapsed
2.247 0.065 2.337