MakeParamSet函数(ParamHelpers包):包含已定义参数的公式

MakeParamSet函数(ParamHelpers包):包含已定义参数的公式,r,R,我正在从R中的makeParamSet和generateDesign函数(ParamHelperspackage)构建参数集。如何使用makeParamSet函数中已定义的参数包含公式?下面是一个例子,我希望g是a和c的产物: ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200), makeIntegerParam("c", lower=632, upper=5688),

我正在从R中的
makeParamSet
generateDesign
函数(
ParamHelpers
package)构建参数集。如何使用
makeParamSet
函数中已定义的参数包含公式?下面是一个例子,我希望
g
a
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)
> 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

我认为这个问题的最佳解决方案是,因为您正在使用
generateDesign
从参数空间采样,只需在事实之后添加参数,而不是在初始参数集中定义它:

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
如果你想覆盖g的所有可能值,最好的解决方案似乎就是硬编码限制(例如,下限(g)=下限(a)*下限(c)=800*632,等等),但是如果你真的想根据其他参数定义来定义它,我认为你需要先创建原始参数集,然后调用它以获取前面的参数:

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)
编辑:

尝试以下操作以在
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
ps=a*c))

非常感谢你的回答。我添加了一些细节来解释为什么
g
必须对应
a
c
中的
makeParamSet
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)
> 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
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