MakeParamSet function (ParamHelpers package): include formulas with parameters already defined

Viewed 197

I am building parameter sets from makeParamSet and generateDesignfunctions (ParamHelpers package) in R. How can I include a formula using parameters that are already defined in the makeParamSet function ? Here is an example where I would like that g is the product of a and c:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688), 
                   makeIntegerParam("f", lower=0, upper=45))
Y <- generateDesign(10, ps, trafo = T)

Here are my attempts:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688), 
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("g", lower = 1, upper = 1, trafo = function(x,a,c) x*a*c))
Y <- generateDesign(10, ps, trafo = T)

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688), 
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("g", require = quote(a*c)))
Y <- generateDesign(10, ps, trafo = T)

Edit:

The g parameter should be defined in makeParamSet because my goal is to add forbidden region using g as follows:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200), ## bT
                   makeIntegerParam("c", lower=632, upper=5688), ## kR
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688), 
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("g", require = a*c),
                   makeIntegerParam("h", lower=0, upper= max(g), ## Depends on g
                   forbidden = quote(h > g)))
Y <- generateDesign(10, ps, trafo = T)
1 Answers

I think the best solution to this problem, since you're using generateDesign to sample from the parameter space, would be to just add in the parameter after the fact instead of defining it in the initial parameter set:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688), 
                   makeIntegerParam("f", lower=0, upper=45))
Y <- generateDesign(10, ps)
Y$g <- Y$a*Y$c

This will only give you the values of g that would correspond to the sampled values of a and c:

> Y
      a    c  e    b    d  f        g
1  5994 2813 27 4389 3321 11 16861122
2  3758 5392 32 1009 3684  1 20263136
3  1197 2446 19 2736  116  8  2927862
4  2530 3753  8 1827 2279 34  9495090
5  1675  649 37 3811 1303 19  1087075
6  5335 4878 14 5321 4271 45 26024130
7  3306 3396 42 6261 4753 38 11227176
8  6563 1155 40  333 5662 15  7580265
9  4224 4298 23 7180 1134 23 18154752
10 4805 1755 11 3145 2006 29  8432775

If you want to cover all possible values of g, it seems like the best solution would be to just hard code the limits (i.e., lower(g) = lower(a)*lower(c) = 800*632, etc.), but if you really want to define it based on the other parameter definitions, I think you'd need to create the original parameter set first, and then call it to get the previous parameters:

ps2 <- makeParamSet(makeIntegerParam("a", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("c", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("e", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("b", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("d", lower=ps$pars$a$lower, upper=ps$pars$a$upper), 
               makeIntegerParam("f", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("g", lower= ps$pars$a$lower*ps$pars$c$lower, upper=ps$pars$a$upper*ps$pars$c$upper))
Y2 <- generateDesign(10, ps2)

But these wouldn't directly correspond to the respective sampled a*c:

> Y2
  a    c    e    b    d    f        g
 1  2434 1740 1033 3497  939 3001  9866916
 2  1895 2749 4762 3340 5161 1000 36786092
 3  4505 2378 6415 7183 2454 7119   713409
 4  5140 1028 4400 5798 3633 2560 28261522
 5  6904 6635 1928 5168 6607 6551 16555299
 6  2876 3761 2369 1912 4422 5877 40896236
 7  3563 5822 3110 2141 5624 4800 20026607
 8  5855 5242 5762 4628 1453 4381 31900665
 9  1143 4384 6648 1002 2967 3920 23614328
 10 6301 6153 3766 6094 6390 1978  5320086

Edit:

Try something like this to set a bound on h:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688), 
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("h", lower=0, upper=5688*7200), 
                   forbidden=expression(h >= a*c))
Y <- generateDesign(10, ps)
Y$g <- Y$a*Y$c

> Y
      a    c  e    b    d  f        h        g
2  5226 4721 16 5808 2114  7 12630546 24671946
3  3587 2518 35 4989  212 14  5104204  9032066
4  6536 4237 38 7074  896 28  2853768 27693032
10 7135 3950  7  369 3426 38 23501987 28183250
31 4768 5541 26  216 3960 24 19840182 26419488
5  1164 3658 16 1600  794 39  1998994  4257912
41 5047 4653 20 4340 3261 40  6628254 23483691
1  4900 2880 22 6847 2566 19  1945704 14112000
21 3664 3625 36 7027 3955 15  2772633 13282000
11 3389 4229 22  468  593 36  2334981 14332081
Related