R语言模拟保留自定义相关结构的离散数据方法
R语言模拟带自定义关联规则的二元离散数据方案
你当前使用的「多元正态连续数据阈值切分转二元数据」的方法,虽然能保留一定的相关结构,但存在两个明显问题:一是随机生成的协方差矩阵无法精准匹配你设定的自定义关联规则,二是连续变量经阈值切分后,相关系数会出现压缩,无法精确控制特定变量组合下result列的取值概率。
针对你需要自定义关联规则的需求,逐列生成+按条件概率赋值结果列的方法可控性最强,能100%匹配你设定的规则,实现代码和步骤如下:
具体实现步骤
1. 生成预测变量p1-p10
你可以根据自身需求选择预测变量的生成逻辑:
- 如果不需要p1-p10之间存在特定相关,直接用二项分布独立生成即可
- 如果需要控制p1-p10之间的二元相关结构,可以借助
bindata包生成带指定相关矩阵的二元数据
2. 按自定义规则生成result列
先给所有样本设置一个result=1的基础概率,再针对你定义的特殊变量组合,单独调整对应样本的result=1概率,最后按概率逐行生成0/1值即可。
可直接运行的示例代码
# 若需控制预测变量间的二元相关,可安装bindata包 # install.packages("bindata") library(bindata) set.seed(123) # 设置随机种子保证结果可复现 n <- 1000 # 自定义样本量 # ------------ # 第一步:生成p1-p10的二元数据 # ------------ # 方案A:p1-p10独立生成,每个变量取1的边际概率设为0.6,可自行调整 p_mat <- matrix(rbinom(n*10, 1, prob = 0.6), ncol = 10) # 方案B:如果需要给p1-p10设置基础相关,替换成下面的代码即可 # 下面示例设置p1-p10两两相关系数为0.1,边际取1概率为0.6 # cor_mat <- matrix(0.1, nrow = 10, ncol = 10) # diag(cor_mat) <- 1 # p_mat <- rmvbin(n, margprob = rep(0.6, 10), bincorr = cor_mat) colnames(p_mat) <- paste0("p", 1:10) my_data <- as.data.frame(p_mat) # ------------ # 第二步:按自定义规则生成result列 # ------------ # 先设置所有样本result=1的基础概率为0.3 prob_result <- rep(0.3, n) # 规则1:p1=p5=p9=1时,result=1的概率提升至0.9 rule1_idx <- with(my_data, p1 == 1 & p5 == 1 & p9 == 1) prob_result[rule1_idx] <- 0.9 # 规则2:p3=p4=0且p9=1时,result=1的概率降至0.1(即result=0的概率为0.9) rule2_idx <- with(my_data, p3 == 0 & p4 == 0 & p9 == 1) # 若样本同时满足多个规则,可自行调整优先级,此处规则2优先级高于规则1 prob_result[rule2_idx] <- 0.1 # 可按照上述格式继续添加任意多的自定义关联规则 # 逐行按设定概率生成result的0/1值 my_data$result <- rbinom(n, 1, prob = prob_result)
效果验证方法
生成数据后,直接分组统计对应样本集的result取值占比,即可确认规则是否生效:
# 验证规则1:p1=p5=p9=1的样本中result=1的占比 prop.table(table(my_data[rule1_idx, "result"])) # 验证规则2:p3=p4=0且p9=1的样本中result=0的占比 prop.table(table(my_data[rule2_idx, "result"]))
样本量足够大时,统计得到的比例会和你预设的概率高度吻合。
关于你原有方法的补充说明
如果你坚持使用连续数据切分的思路,需要做两处调整才能得到可控的结果:
- 不能随机生成协方差矩阵,需要根据你想要的二元变量四分相关,反推多元正态分布的协方差参数,计算过程比较繁琐
- 不能用统一阈值9做切分,需要根据每个变量取1的边际概率单独计算切分阈值,否则各变量取1的比例会完全失控
这种方法仅适合需要严格控制所有变量两两相关系数的场景,针对你需要自定义特定组合关联规则的需求,前面的条件概率生成法实现更简单、结果更可控。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

