如何在 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
}
}
我正在尝试创建一个“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
}
}