gpt4 book ai didi

r - 向量化嵌套 ifelse

转载 作者:行者123 更新时间:2023-12-01 00:14:36 24 4
gpt4 key购买 nike

我试图在 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())

最佳答案

这里有一点改进的代码。
主要变化是我们不使用双 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

附注。对于这种计算,您可能需要设置种子( set.seed()for 循环之前)以确保您可以重现结果。

关于r - 向量化嵌套 ifelse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54158538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com