如何在R的paradox中生成带a>b约束的Sobol抽样设计?
解决paradox包中Sobol抽样的参数约束问题
你用.extra_trafo实现a > b约束没生效,是因为这个参数的作用是转换参数值,而非过滤不符合条件的样本。返回NULL不会让生成器丢弃该样本,而是直接保留原始值,所以约束起不到作用。
下面给两种可行的解决方案:
方案一:直接定义依赖型参数空间
把b的上限设为a,让参数空间本身就满足b < a,生成的样本天然符合约束:
test_ps <- paradox::ps( a = paradox::p_dbl(0, 1), # 让b的上限依赖a,自动保证b ∈ [0, a) b = paradox::p_dbl(0, expr = a) ) # 生成Sobol设计 test <- paradox::generate_design_sobol(test_ps, n = 100)$data # 验证约束 unique(test$a > test$b)
这种方法无需后续过滤,生成效率更高,样本分布也更均匀。
方案二:生成后过滤并补全样本
如果无法修改参数空间,可以先生成样本,过滤掉不符合a > b的部分,再循环补充直到达到目标数量:
test_ps <- paradox::ps( a = paradox::p_dbl(0, 1), b = paradox::p_dbl(0, 1) ) target_n <- 100 final_data <- data.frame() while(nrow(final_data) < target_n) { # 生成剩余需要的样本数 need_n <- target_n - nrow(final_data) new_samples <- paradox::generate_design_sobol(test_ps, n = need_n)$data # 筛选符合条件的样本 valid_samples <- new_samples[new_samples$a > new_samples$b, ] final_data <- rbind(final_data, valid_samples) } # 验证约束 unique(final_data$a > final_data$b)
这种方法适合参数空间无法修改的场景,但循环补全会增加一定计算开销。
内容的提问来源于stack exchange,提问作者Marine
相关产品推荐
相关产品推荐

