如何在 R 中为警告创建条件

How to create condition for warnings in R

我正在尝试创建一个“for”循环,其中 100 次试验中的每一次都有一组参数,每个参数都是从概率分布中随机选择的。从那里,一个模型将接受这些参数并吐出一个输出。输入和输出将存储在一个矩阵中,每一行代表一个成功的 运行 through。最终,这个矩阵将被转换成一个数据帧。我正在为下面的 for 循环的一种情况显示示例 运行:

#matrix M will have 100 rows for each trial, and 4 columns
#columns will be a val, b val, c val and output
M <- matrix(0, nrow=100, ncol=4)

for (i in 1:100){
#random values for a,b,c for 1st trial
a =runif(1)
b=runif(1)
c=runif (1)
v <- c(a,b,c)
#some model
output[i]=v[1]*v[2]/v[3]
M[i,4]=output[i]
#don't know how to populate first 3 columns with all diff values of a,b,c
}

我知道这段代码行不通,但这是我的第一个问题。我如何获得 a、b 和 c 值以在每次试验中重新生成,以便我可以为每次试验获得新的输出。从那里,我很确定我知道如何将它们存储在矩阵中。

我的最后一个问题是关于警告消息的。如果我有一条警告消息,因为我的输出没有为某些试验生成(这个没有问题,但如果我必须除以 0 或其他东西)......我怎么能告诉程序跳过那个试验并继续前进直到我们进行 100 次工作试验?

如果我应该编辑或澄清以上内容,请发表评论。提前致谢。

要回答您的第一个问题,您可以先生成参数向量,然后将您的函数应用于每个参数集。

ntrials <- 100
M <- matrix(0, nrow=ntrials, ncol=4)

## Generate parameter vectors
M[,1] <- runif(ntrials)
M[,2] <- runif(ntrials)
M[,3] <- runif(ntrials)

## Example model function
run_mod <- function(a, b, c) {

    return(a+b+c)

}

## Create output
M[, 4] <- run_mod(a = M[, 1], b = M[, 2], c = M[, 3])

要解决您的第二个问题,您可以使用 while 语句继续生成参数集并尝试获取有效的模型结果,直到获得足够的有效结果。您的模型函数将需要一种方法来处理可能发生的错误或警告,例如 tryCatch().

## Example model function with error handling
run_mod <- function(a, b, c) {

    tryCatch(

        a+b+c,
        error = function(e) print("Error"),
        warning = function(w) print("Warning")
    )

    return(a+b+c)

}

i <- 0
while(i < ntrials) {
  
  ## Generate a single set of parameters
  a <- runif(1)
  b <- runif(1)
  c <- runif(1)
  
  ## Example error
  if(floor(100*a) %% 2 == 0) {
    
    a <- "Bad parameter"
    
  }
  
  ## Try running your model
  output <- run_mod(a,b,c)
  
  ## If successful, save output and move on to the next set
  if(!is.character(output)) {
    
    M[i, 1] <- a
    M[i, 2] <- b
    M[i, 3] <- c
    M[i, 4] <- output
    i <- i + 1
    
  }
}