मैं foreach पैकेज का उपयोग करके नीचे दिए गए कोड को और अधिक कुशल बनाना चाहता हूं। मैंने इसे बहुत लंबे समय तक आजमाया लेकिन मैं फॉर-लूप का उपयोग करते समय समान परिणाम प्राप्त करने का प्रबंधन नहीं करता। मैं समांतरता सहित नेस्टेड फ़ोरैच-लूप का उपयोग करना चाहता हूं ... और आउटपुट के रूप में मैं मंद [आर, बी 1] के साथ दो मैट्रिक्स रखना चाहता हूं, मैं कुछ सुझावों के लिए बहुत आभारी रहूंगा !!

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]])

1
Andrea 30 नवम्बर 2020, 20:17

1 उत्तर

सबसे बढ़िया उत्तर

मैंने निम्नलिखित कोड में एक 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 लूप के लिए सामान्य के साथ काम करता है। न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण:

df<-foreach(i = 1:R, .combine = cbind, .inorder=TRUE) %dopar%{
  x <- list()
  for(j in 1:3){
    x <- c(x,j)
  }
  return(x)
}
0
mischva11 5 पद 2020, 11:18