首页 > 解决方案 > 为什么应用比 for 循环慢?

问题描述

我需要为矩阵的每一行拟合一个 glm。我可以编写一个 for 循环来做到这一点。我也可以使用 apply 来做到这一点,这通常是推荐的。但是,使用 for 循环,代码运行得更快。有人可以告诉我为什么会这样,编写这样的代码的正确方法是什么?

#some dummy data

response_mat<-matrix(0,10000,100)
response_mat<-apply(response_mat, c(1,2), function(x) sample(c(0,1),1)) 
predictor<-rnorm(100)

#fit glm to each row using a for loop 

ptm <- proc.time()
for (i in 1:nrow(response_mat)){
    model<-glm(response_mat[i,]~predictor,family="binomial")}
proc.time() - ptm


#fit glm using apply    

glm_function<-function(x){model<-glm(x~predictor,family="binomial")}
ptm <- proc.time()  
apply(response_mat,1,glm_function)
proc.time() - ptm

标签: r

解决方案


apply将每个模型存储到一个列表中,如果您不将调用分配给变量,它将打印此列表。在你的for循环中,这两件事都不会发生。

如果您for像下面的代码一样修改循环,您将获得更接近的运行时间(可能在for循环中更高)。

# Create an empty list to store the models
models_list <- list()

ptm <- proc.time()

for (i in 1:nrow(response_mat)) {
  model <- glm(response_mat[i, ] ~ predictor, family = "binomial")

  # Store each model as an element of the list
  models_list [[i]] <- model
}

# Print the list
print(models_list)

proc.time() - ptm

推荐阅读