You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的合成逻辑,具体步骤如下:

  1. 保留正确的访问序列,确保float1和float3先被合成
  2. 为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 23:35:08