R中ParamHelpers包makeParamSet含依赖参数的拉丁超立方采样问题
解决ParamHelpers中动态参数范围的拉丁超立方采样问题
嘿,我懂你遇到的困扰了——ParamHelpers的makeParamSet本身不支持直接把另一个参数作为当前参数的上下限,因为它的参数定义是静态的,没法动态关联已经采样出来的其他参数值。不过咱们有两种实用的方法能实现你想要的效果:让每行的b都落在0到对应行a的范围内,同时保持拉丁超立方采样的特性。
方法1:先采样a,再逐个生成对应范围的b
这种方法最直观,先完成a的拉丁超立方采样,再针对每个a的值,在0到a的范围内生成b。如果需要b也遵循拉丁超立方分布,可以搭配lhs包来实现:
library(ParamHelpers) set.seed(1) # 第一步:生成a的拉丁超立方设计 ps_a <- makeParamSet(makeNumericParam("a", lower = 200, upper = 500)) design_a <- generateDesign(100, ps_a) # 方法1a:生成简单均匀分布的b design_a$b <- sapply(design_a$a, function(x) runif(1, min = 0, max = x)) # 方法1b:生成拉丁超立方分布的b(需要先安装lhs包) # install.packages("lhs") library(lhs) design_a$b <- sapply(design_a$a, function(x) x * randomLHS(1, 1))
解释一下:randomLHS(1,1)会生成一个0-1之间的拉丁超立方样本,乘以当前行的a后,就得到了0-a范围内的拉丁超立方分布的b值。
方法2:用缩放变量+转换实现动态范围
如果你想尽量沿用ParamHelpers的原生采样流程,可以先定义一个0-1范围的缩放变量,采样完成后再通过转换得到实际的b值:
set.seed(1) # 定义包含a和缩放变量的参数集 ps <- makeParamSet( makeNumericParam("a", lower = 200, upper = 500), makeNumericParam("b_scaled", lower = 0, upper = 1) ) # 生成完整的拉丁超立方设计 design <- generateDesign(100, ps) # 将缩放变量转换为实际的b(上限为对应行的a) design$b <- design$b_scaled * design$a # 可以删除中间的缩放变量(可选) design$b_scaled <- NULL
这种方法的好处是a和b_scaled都是严格的拉丁超立方采样,转换后的b相对于每个a依然保持均匀分布的特性。
针对你提供的test数据框的处理
如果已经有了像test这样预先定义好a值的数据框,只需要对每行的a生成对应范围的b即可:
set.seed(1) test <- data.frame(a = round(runif(5, min=200, max=500)), b = NA) # 生成均匀分布的b test$b <- sapply(test$a, function(x) runif(1, 0, x)) # 或者生成拉丁超立方分布的b library(lhs) test$b <- sapply(test$a, function(x) x * randomLHS(1, 1))
内容的提问来源于stack exchange,提问作者Mesy
相关产品推荐
相关产品推荐

