r - 向量化嵌套 ifelse
问题描述
我正在尝试将我的函数固定在 R 中。它包含三个 ifelse 语句,其中一个是嵌套的。对于单个我进行了矢量化,这减少了我的计算时间。不幸的是,我看不到如何矢量化嵌套的。我应用它的每一种方式都会返回一个错误。此外,如果有任何其他怪癖我可以用来加速它?
cont.run <- function(reps=10000, n=10000, d=0.005, l=10 ,s=0.1) {
r <- rep(0, reps)
theta <- rep(0, n)
for (t in 1:reps) {
epsilon <- rnorm(1, 0, d)
Zt = sum(ifelse(epsilon > theta, 1,
ifelse(epsilon < -theta, -1, 0)))
r[t] <- Zt / (l * n)
theta <- ifelse(runif(n) < s, abs(r[t]), theta)
}
return(mean(r))
}
system.time(cont.run())
我有:
cont.run <- function(reps=10000, n=10000, d=0.005, l=10 ,s=0.1) {
r <- rep(0, reps)
theta <- rep(0, n)
for (t in 1:reps) {
epsilon <- rnorm(1, 0, d)
Zt = rep(NA, length(theta))
Zt = sum(Zt[epsilon > theta, 1])
Zt = sum(Zt[epsilon < -theta, -1])
r[t] <- Zt / (l * n)
theta = rep(theta, length(s))
theta[runif(n) < s] = abs(r[t])
}
return(mean(r))
}
system.time(cont.run())
解决方案
这是一些改进的代码。
主要变化是我们不使用 double ifelse
,而是对TRUE
向量 ( sum(epsilon > theta) - sum(epsilon < -theta)
) 执行两个求和(这里我们不关心零)。我添加了一些其他改进(例如,替换rep
为numeric
,将一些操作移到for
循环之外)。
contRun <- function(reps = 1e4, n = 1e4, d = 5e-3, l = 10, s = 0.1) {
# Replace rep with numeric
r <- numeric(reps)
theta <- numeric(n)
# Define before loop
ln <- l * n
# Don't use t as it's a function in base R
for (i in 1:reps) {
epsilon <- rnorm(1, 0, d)
# Sum two TRUE vectors
r[i] <- (sum(epsilon > theta) - sum(epsilon < -theta)) / ln
# Define before ifelse
absr <- abs(r[i])
theta <- ifelse(runif(n) < s, absr, theta)
}
return(mean(r))
}
library(microbenchmark)
microbenchmark(cont.run(), contRun())
Unit: seconds
expr min lq mean median uq max neval
cont.run() 13.652324 13.749841 13.769848 13.766342 13.791573 13.853786 100
contRun() 6.533654 6.559969 6.581068 6.577265 6.596459 6.770318 100
PS。对于这种计算,您可能会设置种子(set.seed()
在for
循环之前)以确保您可以重现您的结果。
推荐阅读
- excel - 我有一个很长的公式数组,替换函数没有填充单元格
- excel - 如何使用相关数据查找特定单元格?
- scala - 如何在 Apache Spark 中反转排列 DataFrame
- javascript - 如果我删除警报,Javascript 重定向不起作用
- android - 设备不与 Firebase 交互,但模拟器可以
- google-api - OAuth 同意屏幕
- rest - 如何使用 Bearer Token 认证和授权实现 Rest API 的自动化?
- sql-server - 如果 distinct 返回 2 行,如何选择前 1 个
- javascript - 无法在 FullCalendar 中对当前日期的事件进行排序
- python - 在 python 中,我无法以文本格式导出输出