gpt4 book ai didi

r - 将 for 循环转换为 foreach 循环

转载 作者:行者123 更新时间:2023-12-05 06:08:40 24 4
gpt4 key购买 nike

我想通过使用 foreach 包使下面的代码更高效。我尝试了很长时间,但无法获得与使用 for 循环时相同的结果。我想使用包含并行化的嵌套 foreach 循环...作为输出,我希望有两个带有暗淡 [R,b1] 的矩阵 我将非常感谢您提供一些建议!!

n  <- c(100, 300, 500)
R <- 100
b0 <- 110
b1 <- seq(0.01, 0.1, length.out = 100)

## all combinations of n and b1
grid <- expand.grid(n, b1)
names(grid) <- c("n", "b1")

calcPower <- function( R, b0, grid) {

cl <- makeCluster(3)
registerDoParallel(cl)

## n and b1 coefficients
n <- grid$n
b1 <- grid$b1

## ensures reproducibility
set.seed(2020)
x <- runif(n, 18, 80)
x.dich <- factor( ifelse( x < median( x), 0, 1))

## enables to store two outputs
solution <- list()

## .options.RNG ensures reproducibility
res <- foreach(i = 1:R, .combine = rbind, .inorder = TRUE, .options.RNG = 666) %dorng% {
p.val <- list()
p.val.d <- list()

for( j in seq_along(b1)) {

y <- b0 + b1[j] * x + rnorm(n, 0, sd = 10)

mod.lm <- lm( y ~ x)
mod.lm.d <- lm( y ~ x.dich)

p.val <- c( p.val, ifelse( summary(mod.lm)$coef[2,4] <= 0.05, 1, 0))
p.val.d <- c( p.val.d, ifelse( summary(mod.lm.d)$coef[2,4] <= 0.05, 1, 0))
}

solution[[1]] <- p.val
solution[[2]] <- p.val.d

return(solution)
}

dp.val <- matrix( unlist(res[,1], use.names = FALSE), R, length(b1), byrow = TRUE)
dp.val.d <- matrix( unlist(res[,2], use.names = FALSE), R, length(b1), byrow = TRUE)

stopCluster(cl)

df <- data.frame(
effectS = b1,
power = apply( dp.val, 2, function(x){ mean(x) * 100}),
power.d = apply( dp.val.d, 2, function(x){ mean(x) * 100}),
n = factor(n))

return(df)
}

## simulation for different n
tmp <- with(grid,
by( grid, n,
calcPower, R = R, b0 = b0))

## combines the 3 results
df.power <- rbind(tmp[[1]], tmp[[2]], tmp[[3]])

最佳答案

我在下面的代码中创建了一个 foreach 循环。必须做出一些改变。在 foreach 中返回一个列表比返回一个矩阵要容易得多,因为它与 rbind 相结合。特别是当你想返回多个时。我的解决方案是将所有内容保存在列表中,然后将其转换为长度为 100 的矩阵。

注意:您的代码中有一个错误。 summary(mod.lm.d)$coef[2,4] 不存在。我把它改成了[2]。根据您的需要进行调整

solution <- list()
df2<-foreach(i = 1:R, .combine = rbind, .inorder=TRUE) %dopar%{
set.seed(i)
p.val <- list()
p.val.d <- list()
counter <- list()
for( j in seq_along(b1)){

x <- sort( runif(n, 18, 80))
x.dich <- factor( ifelse( x < median(x), 0, 1))
y <- b0 + b1[j] * x + rnorm( n, 0, sd = 10)

mod.lm <- lm( y ~ x)
mod.lm.d <- lm( y ~ x.dich)

p.val <- c(p.val, ifelse( summary( mod.lm)$coef[2] <= 0.05, 1, 0))
p.val.d <- c(p.val.d, ifelse( summary( mod.lm.d)$coef[2] <= 0.05, 1, 0))
counter <- c(counter, j)
}
solution[[1]] <- p.val
solution[[2]] <- p.val.d
solution[[3]] <- counter
return(solution)
}

dp.val <- unlist(df2[,1], use.names = FALSE)
dp.val.d <- unlist(df2[,2], use.names = FALSE)

dp.val.matr <- matrix(dp.val, R, length(b1))
dp.val.d.matr <- matrix(dp.val.d, R, length(b1))

stopCluster(cl)

您的意见:

foreach 确实适用于普通的 for 循环。最小可重现示例:

df<-foreach(i = 1:R, .combine = cbind, .inorder=TRUE) %dopar%{
x <- list()
for(j in 1:3){
x <- c(x,j)
}
return(x)
}

关于r - 将 for 循环转换为 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65078132/

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