Home > Software design >  Read functions as text and use for plotting
Read functions as text and use for plotting

Time:09-17

I have a set of 500 equations listed in a single column of a .csv file. The equations are written as text like this (for example):

15 6.2*A-4.3*B 3.7*C-7.9*B*C 2*D^2

(this is the "right" side of the equation, which equals "y", but the text "y=" does not appear in the .csv file)

These are general linear models that have been written to a .csv file by someone else. Not all models have the same number of variables.

I would like to read these functions into R and format them in a way that will allow for using them to (iteratively) make simple line plots (one for each n = 500 models) of "y" across a range of values for A (shown on the x-axis), given values of B, C, and D.

Does anyone have any suggestions for how to do this?

CodePudding user response:

I thought of something based on this [post][1], it is not the best solution, but it seems to work.

Equations

Created two equations for an example

models <- c("15 6.2*A-4.3*B 3.7*C-7.9*B*C 2*D^2","50 6.2*A-4.3*B 3.7*C-7.9*B*C 2*D^2")
models_names <- c("model1","model2")

Data

Random data as an example

data <-
tibble(
  A = rnorm(100),
  B = rnorm(100),
  C = rnorm(100),
  D = rnorm(100)
)

Function

Then a created a function that uses those text equations and apply as function returning the values

text_model <- function(formula){
  eval(parse(text = paste('f <- function(A,B,C,D) { return(' , formula , ')}', sep='')))
  out <- f(data$A,data$B,data$C,data$D)
  return(out)
}

Applied equations

Finally, I apply each equation for the data, binding both.

data %>% 
  bind_cols(
    map(.x = models,.f = text_model) %>% 
      set_names(models_names) %>% 
      bind_rows(.id = "model") 
  )

# A tibble: 100 x 6
          A       B      C       D model1 model2
      <dbl>   <dbl>  <dbl>   <dbl>  <dbl>  <dbl>
 1 -0.0633   1.18   -0.409  2.01     9.52   54.9
 2 -0.00207  1.35    1.28   1.59     9.16   40.3
 3  0.798   -0.141   1.58  -0.123   20.6    63.2
 4 -0.162   -0.0795  0.408  0.663   14.3    52.0
 5 -1.11     0.788  -1.37   1.20     4.71   46.0
 6  2.80     1.84   -0.850  0.161   24.4    68.7
 7  1.03     0.550   0.907 -1.92    19.0    60.8
 8  0.515   -0.179  -0.980  0.0437  19.0    48.9
 9 -0.353    0.0643  1.39   1.30    12.5    55.3
10 -0.427   -1.01   -1.11  -0.547   16.7    39.3
# ... with 90 more rows
  • Related