R Synthpop:无法配置规则确保float1 <= float2 <= float3
Synthpop约束规则设置问题
我研究Synthpop规则已有数日,但仍无法理解规则定义的相关文档。需要设置规则让浮点列满足float1 <= float2 <= float3的约束,尝试调整访问序列和预测矩阵以确保float1和float3先被合成,但均未奏效,出现报错:
Error: Variable(s) used in missing data rules for float2 have to be synthesised BEFORE the variables they apply to
测试代码如下:
library(synthpop) # Create a dummy dataset size <- 100 # Number of rows float1 <- runif(size, min = 0, max = 50) float2 <- runif(size, min = 0, max = 100) float3 <- runif(size, min = 50, max = 100) df <- data.frame(float1 = float1, float2 = float2, float3 = float3) # Define the rules for restricted values rules <- list( float2 = c("float2 < float1", "float2 > float3") ) rvalues <- list( float2 = c("float1", "float3") ) # Set the visit sequence to ensure float1 and float3 are synthesized before float2 visit.sequence <- c("float1", "float3", "float2") # Adjust predictor matrix to ensure proper dependency predictor.matrix <- matrix(0, ncol = ncol(df), nrow = ncol(df)) colnames(predictor.matrix) <- rownames(predictor.matrix) <- colnames(df) predictor.matrix["float2", "float1"] <- 1 predictor.matrix["float2", "float3"] <- 1 # Use the syn function with the custom rule syn_data <- syn(df, rules = rules, rvalues = rvalues, visit.sequence = visit.sequence, predictor.matrix = predictor.matrix, seed = 123)
问题原因与解决方案
核心问题
报错根源在于synthpop的rules和rvalues参数是针对缺失值插补设计的规则,而非直接的合成值约束。当前写法会让程序误判为处理缺失值场景,导致依赖检查逻辑与合成序列的约束不匹配。
正确实现方式
要实现float1 <= float2 <= float3的约束,需使用synthpop的custom.synthesizer自定义float2的合成逻辑,具体步骤如下:
- 保留正确的访问序列,确保float1和float3先被合成
- 为float2编写自定义合成函数,基于已合成的float1和float3生成符合区间要求的值
修改后的代码:
library(synthpop) # 创建模拟数据集 size <- 100 float1 <- runif(size, min = 0, max = 50) float2 <- runif(size, min = 0, max = 100) float3 <- runif(size, min = 50, max = 100) df <- data.frame(float1 = float1, float2 = float2, float3 = float3) # 定义自定义合成函数:为float2生成满足float1 <= float2 <= float3的值 custom_float2 <- function(y, x, xp, yp, ...) { # 获取已合成的float1和float3值 synth_float1 <- xp$float1 synth_float3 <- xp$float3 # 为每个样本生成在[synth_float1[i], synth_float3[i]]区间内的随机值 synth_float2 <- mapply(function(a, b) runif(1, min = a, max = b), synth_float1, synth_float3) return(synth_float2) } # 设置访问序列 visit.sequence <- c("float1", "float3", "float2") # 定义合成方法:指定float2使用自定义函数 method <- rep("", ncol(df)) names(method) <- colnames(df) method["float2"] <- "custom" # 执行合成 syn_data <- syn(df, visit.sequence = visit.sequence, method = method, custom.synthesizer = list(float2 = custom_float2), seed = 123) # 验证约束是否满足 all(syn_data$syn$float1 <= syn_data$syn$float2 & syn_data$syn$float2 <= syn_data$syn$float3)
关键说明
custom.synthesizer允许完全控制变量的合成逻辑,适配这种依赖其他已合成变量的区间约束场景- 访问序列必须确保float1和float3在float2之前合成,这样自定义函数才能获取到它们的合成值
- 自定义函数中,
xp参数代表已完成合成的变量数据集,可直接从中提取float1和float3的值
内容的提问来源于stack exchange,提问作者user26365787
相关产品推荐
相关产品推荐

