PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Wednesday, April 27, 2022

[FIXED] How to create condition for warnings in R

 April 27, 2022     for-loop, r, warnings     No comments   

Issue

I am trying to create a "for" loop where each of 100 trials has a set of parameters, each randomly chosen from probability distributions. From there, a model will take in these parameters and spit out an output. The input and output will be stored in a matrix, with each row representing a successful run through. Eventually, this matrix will be converted into a dataframe. I am displaying a sample run through for one case of the for loop below:

#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
}

I know this code will not work, but that's my first question. How do I get the a,b, and c values to regenerate from trial to trial so I can have new outputs for each trial. From there, I am pretty sure I know how to store them in the matrix.

My last question is about warning messages. If I have a warning message because my output did not generate for some trial (no problems with this one, but if I had to divide by 0 or something)... how could I just tell the program to skip that trial and keep going until we get to 100 working trials?

Please comment if I should edit or clarify something above. Thanks in advance.


Solution

To answer your first question, you can first generate parameter vectors and then apply your function to each parameter set.

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

To address your second question, you could use a while statement to continue generating parameter sets and trying to obtain valid model results until you have enough valid results. Your model function will need a way to handle errors or warnings that could occur, such as 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
    
  }
}


Answered By - dallenr
Answer Checked By - Pedro (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing