Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 适合多种glm型号:提高速度_R_Glm - Fatal编程技术网

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