Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何遍历for循环中的参数_R_For Loop_Iteration_Parameter Passing - Fatal编程技术网

如何遍历for循环中的参数

如何遍历for循环中的参数,r,for-loop,iteration,parameter-passing,R,For Loop,Iteration,Parameter Passing,我有一个作为for循环编写的模型,其中包含我指定的许多参数: ## functions needed to run the model learn <- function(prior, sensi, speci, e){ out <- ifelse(e == 1, (sensi*prior) / ((sensi*prior) + (1-speci)*(1-prior)), ((1-sensi)*prior) / (((1-sensi)*prior)

我有一个作为for循环编写的模型,其中包含我指定的许多参数:

## functions needed to run the model
learn <- function(prior, sensi, speci, e){
  out <- ifelse(e == 1, (sensi*prior) / ((sensi*prior) + (1-speci)*(1-prior)),
                ((1-sensi)*prior) / (((1-sensi)*prior) + (speci*(1-prior))))
  out
}

feed <- function(vec){
  prior <- 0.5
  for (i in vec){
    res <- learn(prior, sensi, speci, i)
    prior <- res
  }
  return(prior)
}

## specify parameters
iterations <- 100
N <- 10
BR <- 0.66
sensi <- 0.75
speci <- 0.45

## initialize results object
res <- NULL

## loop for number of iterations
for (j in 1:iterations){
  
  X <- as.numeric(rbinom(1, 1, BR))
  
  if (X == 1){ # if X is 1...
    agents <- c(1:N) 
    evidence <- vector("list", length(agents)) 
    for (i in agents) {
      n <- sample(10, 1, replace = TRUE) 
      evidence[[i]] <- rbinom(n, 1, sensi) 
    }
  } else { # if X is 0... 
    agents <- c(1:N)
    evidence <- vector("list", length(agents)) 
    for (i in agents) {
      n <- sample(10, 1, replace = TRUE) 
      evidence[[i]] <- rbinom(n, 1, sensi) 
      evidence[[i]] <- ifelse(evidence[[i]]==1, 0, 1) # flip evidence 
    }
  }
  
  # feed vectors of evidence through learn function
  t0 <- sapply(evidence, feed)
  
  # save dataframe 
  df <- data.frame("i" = j, 
                   "ID" = c(1:N), 
                   "E" = t0, 
                   "X" = X,
                   "N" = N, 
                   "BR" = BR,
                   "sensi" = sensi,
                   "speci" = speci)

  res <- rbind(res, df)
  
}

如何将每行参数值传递给我的模型,并自动运行
paramspace
中所述的所有参数?

如注释中所示,您可以创建一个函数,然后使用
apply
循环参数组合:


## functions needed to run the model
learn <- function(prior, sensi, speci, e){
  out <- ifelse(e == 1, (sensi*prior) / ((sensi*prior) + (1-speci)*(1-prior)),
                ((1-sensi)*prior) / (((1-sensi)*prior) + (speci*(1-prior))))
  out
}

feed <- function(vec,sensi,speci){
  prior <- 0.5
  for (i in vec){
    res <- learn(prior, sensi, speci, i)
    prior <- res
  }
  return(prior)
}

runModel <- function(iterations = 100,
                     N = 10,
                     BR = 0.66,
                     sensi = 0.75,
                     speci = 0.45 ) {
  ## initialize results object
  res <- NULL
  
  ## loop for number of iterations
  for (j in 1:iterations){
    
    X <- as.numeric(rbinom(1, 1, BR))
    
    if (X == 1){ # if X is 1...
      agents <- c(1:N) 
      evidence <- vector("list", length(agents)) 
      for (i in agents) {
        n <- sample(10, 1, replace = TRUE) 
        evidence[[i]] <- rbinom(n, 1, sensi) 
      }
    } else { # if X is 0... 
      agents <- c(1:N)
      evidence <- vector("list", length(agents)) 
      for (i in agents) {
        n <- sample(10, 1, replace = TRUE) 
        evidence[[i]] <- rbinom(n, 1, sensi) 
        evidence[[i]] <- ifelse(evidence[[i]]==1, 0, 1) # flip evidence 
      }
    }
    
    # feed vectors of evidence through learn function
    #t0 <- sapply(evidence, feed)
    t0 <- sapply(evidence,function(e){feed(e,sensi,speci)})
    
    # save dataframe 
    df <- list("i" = iterations, 
               "ID" = c(1:N), 
               "E" = t0, 
               "X" = X,
               "N" = N, 
               "BR" = BR,
               "sensi" = sensi,
               "speci" = speci)
    
    res <- rbind(res, df)
    
  }
  res
}

# Define parameter space
iterations <- 100
N_vec <- c(10, 50)
BR_vec <- c(0.25, 0.50, 0.75) 
sensi_vec <- c(0.45, 0.75)
speci_vec <- c(0.45, 0.75)

paramspace <- expand.grid(iterations = iterations, N = N_vec, BR = BR_vec, sensi = sensi_vec, speci = speci_vec)

# Loop over parameter space :
res <- apply(paramspace,1,function(paramset) {
  iterations = paramset[1]
  N = paramset[2]
  BR = paramset[3]
  sensi = paramset[4]
  speci = paramset[5]
  runModel(iterations = iterations, N = N, BR = BR , sensi = sensi, speci = speci )
})

##运行模型所需的函数

了解您还可以使用
foreach
包,该包与适当的后端一起使用,提供并行化功能,以防您的任务变得更加密集。这里有一个简单的例子来了解它是如何工作的

foreach(a=1:3, b=4:6) %do% (a + b)
然后我尝试将您的代码嵌入到
foreach


require(foreach)

## functions needed to run the model
learn <- function(prior, sensi, speci, e){
  out <- ifelse(e == 1, (sensi*prior) / ((sensi*prior) + (1-speci)*(1-prior)),
                ((1-sensi)*prior) / (((1-sensi)*prior) + (speci*(1-prior))))
  out
}

feed <- function(vec){
  prior <- 0.5
  for (i in vec){
    res <- learn(prior, sensi, speci, i)
    prior <- res
  }
  return(prior)
}


## set up for multiple parameterizations 
iterations <- 100
N_vec <- c(10, 50)
BR_vec <- c(0.25, 0.50, 0.75) 
sensi_vec <- c(0.45, 0.75)
speci_vec <- c(0.45, 0.75)

paramspace <- expand.grid(iterations = iterations, N = N_vec, BR = BR_vec, sensi = sensi_vec, speci = speci_vec)

res <- foreach(iterations = paramspace$iterations, 
               N = paramspace$N, 
               BR = paramspace$BR, 
               sensi = paramspace$sensi, 
               speci = paramspace$speci) %do% {
                 
                 ## initialize results object
                 res <- NULL
                 
                 ## loop for number of iterations
                 for (j in 1:iterations){
                   
                   X <- as.numeric(rbinom(1, 1, BR))
                   
                   if (X == 1){ # if X is 1...
                     agents <- c(1:N) 
                     evidence <- vector("list", length(agents)) 
                     for (i in agents) {
                       n <- sample(10, 1, replace = TRUE) 
                       evidence[[i]] <- rbinom(n, 1, sensi) 
                     }
                   } else { # if X is 0... 
                     agents <- c(1:N)
                     evidence <- vector("list", length(agents)) 
                     for (i in agents) {
                       n <- sample(10, 1, replace = TRUE) 
                       evidence[[i]] <- rbinom(n, 1, sensi) 
                       evidence[[i]] <- ifelse(evidence[[i]]==1, 0, 1) # flip evidence 
                     }
                   }
                   
                   # feed vectors of evidence through learn function
                   t0 <- sapply(evidence, feed)
                   
                   # save dataframe 
                   df <- data.frame("i" = j, 
                                    "ID" = c(1:N), 
                                    "E" = t0, 
                                    "X" = X,
                                    "N" = N, 
                                    "BR" = BR,
                                    "sensi" = sensi,
                                    "speci" = speci)
                   
                   res <- rbind(res, df)
                   
                 }
                 
                 res
                 
               }


需要(foreach)
##运行模型所需的函数

了解另一种方法是创建函数并使用
Map(…)
Map
的优点是,您的
paramspace
不会被强制转换为矩阵,从而使所有内容都具有相同的类型(即数字、字符等)

我还做了一些其他的修改,以允许R为我们做会计。主要是:

  • X
    现在是一个逻辑表达式,因此我们可以简化
    if
    语句。此外,分配是一次完成的,而不是循环
  • 我们更改
    feed()
    函数以同时生成
    证据。这使我们能够
  • 使用
    replicate
    重复循环
  • learn22 10 0.66 0.75 0.45假0.43103448 0.006827641
    #>3 3 10 0.66 0.75 0.45真实0.43103448 0.775671866
    #>4 4 10 0.66 0.75 0.45真实0.71716957 0.431034483
    #>5 5 10 0.66 0.75 0.45假0.2417679 0.016593958
    #>61010.66 0.75 0.45假0.30303324 0.008992838
    #>7100.66 0.75 0.45真值0.82967106 0.865405260
    #>8100.66 0.75 0.45假0.43103448 0.439027817
    #>9 9 10 0.66 0.75 0.45假0.57692308 0.050262167
    #>101010.66 0.75 0.45假0.02178833 0.296208531
    
    这个输出比您最初的方法要宽一点。我们总是可以重塑
    E#
    列,但这可能最终更适合您的实际用例

    最后,这里是正在运行的
    Map()


    iterations您可以将代码转换为函数,然后使用
    apply(paramspace,1,my_函数)
    paramspace
    逐行传递到函数中。您提供的代码遇到了一些问题。请看我在原始帖子中添加的回复。我猜这是由于
    t0这就是它:我更新了feed函数以传递给它speci/sensi参数。仍然有一些警告,但当您单独运行
    RunModel()
    时(即设置初始参数时)不会出现。我猜某些参数组合会产生这些警告。循环模型运行正常,警告来自保存结果的dataframe调用:df我的意图是在结果中标记迭代。也许我的变量在某个地方混在一起了。我可以调查一下。
    
    require(foreach)
    
    ## functions needed to run the model
    learn <- function(prior, sensi, speci, e){
      out <- ifelse(e == 1, (sensi*prior) / ((sensi*prior) + (1-speci)*(1-prior)),
                    ((1-sensi)*prior) / (((1-sensi)*prior) + (speci*(1-prior))))
      out
    }
    
    feed <- function(vec){
      prior <- 0.5
      for (i in vec){
        res <- learn(prior, sensi, speci, i)
        prior <- res
      }
      return(prior)
    }
    
    
    ## set up for multiple parameterizations 
    iterations <- 100
    N_vec <- c(10, 50)
    BR_vec <- c(0.25, 0.50, 0.75) 
    sensi_vec <- c(0.45, 0.75)
    speci_vec <- c(0.45, 0.75)
    
    paramspace <- expand.grid(iterations = iterations, N = N_vec, BR = BR_vec, sensi = sensi_vec, speci = speci_vec)
    
    res <- foreach(iterations = paramspace$iterations, 
                   N = paramspace$N, 
                   BR = paramspace$BR, 
                   sensi = paramspace$sensi, 
                   speci = paramspace$speci) %do% {
                     
                     ## initialize results object
                     res <- NULL
                     
                     ## loop for number of iterations
                     for (j in 1:iterations){
                       
                       X <- as.numeric(rbinom(1, 1, BR))
                       
                       if (X == 1){ # if X is 1...
                         agents <- c(1:N) 
                         evidence <- vector("list", length(agents)) 
                         for (i in agents) {
                           n <- sample(10, 1, replace = TRUE) 
                           evidence[[i]] <- rbinom(n, 1, sensi) 
                         }
                       } else { # if X is 0... 
                         agents <- c(1:N)
                         evidence <- vector("list", length(agents)) 
                         for (i in agents) {
                           n <- sample(10, 1, replace = TRUE) 
                           evidence[[i]] <- rbinom(n, 1, sensi) 
                           evidence[[i]] <- ifelse(evidence[[i]]==1, 0, 1) # flip evidence 
                         }
                       }
                       
                       # feed vectors of evidence through learn function
                       t0 <- sapply(evidence, feed)
                       
                       # save dataframe 
                       df <- data.frame("i" = j, 
                                        "ID" = c(1:N), 
                                        "E" = t0, 
                                        "X" = X,
                                        "N" = N, 
                                        "BR" = BR,
                                        "sensi" = sensi,
                                        "speci" = speci)
                       
                       res <- rbind(res, df)
                       
                     }
                     
                     res
                     
                   }