【发布时间】:2015-08-22 14:53:00
【问题描述】:
我正在为 R 中 GWmodel 包中的 gwr.basic 函数运行以下 for 循环。我需要做的是收集任何给定带宽的估计参数的平均值。
代码如下:
library(GWmodel)
data("DubVoter")
#Dub.voter
LARentMean = list()
for (i in 20:21)
{
gwr.res <- gwr.basic(GenEl2004 ~ DiffAdd + LARent + SC1 + Unempl + LowEduc + Age18_24 + Age25_44 + Age45_64, data = Dub.voter, bw = i, kernel = "bisquare", adaptive = TRUE, F123.test = TRUE)
a <- mean(gwr.res$SDF$LARent)
LARentMean[i] <- a
}
outcome = unlist(LARentMean)
> outcome
[1] -0.1117668 -0.1099969
但是返回结果非常慢。我需要更大的范围,例如 20:200。有没有办法加快这个过程?如果没有,如何有一个步进范围,比如 20 到 200 步,步长为 5 以减少操作次数?
我是 R 的新 Python 用户。我在 SO 上读到 R 以 for 循环速度慢而闻名,并且有更有效的替代方案。欢迎更清楚地说明这一点。
【问题讨论】:
-
您的问题似乎表明
for循环的每次迭代 非常昂贵,而不是for循环本身。在这种情况下,for循环替代方案(*apply或dplyr)可能没有多大帮助。或者您正在寻找并行化代码的解决方案? -
我只有两个核心。我不知道并行计算是否会有所改进
-
GWR 模型需要一段时间才能连接到计算机。其中 200 个需要更长的时间。您的瓶颈不在代码设计中。
-
你能定义“非常慢”吗?我的 MacBook Pro 上的一次迭代 (
bw=20) 的microbenchmark说它需要大约 9 秒才能运行。我不知道更改bw值是否会导致模型变慢。如果您有更多的迭代,2 个内核可能会有所帮助,因为内存可能不是一个因素,因为DubVoter只有 1MB(它将为每个并行任务复制),但对于这少数它可能只会让你25-33% 的加速(可能更多,我不知道你的架构)。您可以使用seq(20,200,5)来提前 5 分钟,我建议安装beeppkg 以在任务完成时发出声音通知。 -
顺便说一句,在我的 Mac Pro 上迭代需要大约 7 秒。即使有 Matt 的回答,您也可能不喜欢它在系统上花费的时间。在强大的 EC2 实例上并行运行模型几乎不需要时间,并且花费您大约 5.00 美元。