r - 为什么应用比 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
解决方案
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
推荐阅读
- javascript - 为什么当组件存在时我看不到路由器的结果 React
- html - 你如何使标签后的文本没有超链接?
- ecmascript-6 - 为什么 es6 迭代器接口的可选 return() 方法接受一个值参数。为什么它需要返回一个 IteratorResult 对象?
- scala - 用于 Finatra Web 服务器的具有 Kerberos 身份验证的 HTTP/Spnego
- ios - 如何将 UIButtons 添加到我的 TableViewCell?
- mysql - 当数据库中的数据更新时,如何在前端更新检索到的数据?
- gdb - 如何将 GDB 格式的半字内存设为十六进制?
- javascript - 复制和粘贴自定义 FabricJS 对象
- ios - 当我从视图返回标签栏控制器时,标签栏不显示
- elm - 访问以前陡峭的 Html