如何基于A/B/C二进制变量的条件及概率生成二进制变量X?
解决方案
首先建议把独立的向量整合到数据框中,方便后续统一处理:
# 创建包含A、B、C的数据框 df <- data.frame( A = c(rep(1, 195), rep(0, 805)), B = c(rep(1, 90), rep(0, 910)), C = c(rep(1, 715), rep(0, 285)) )
情况1:A、B、C互斥(每个观测仅属于一个组)
如果你的数据中不存在同时满足多个条件的观测(比如没有观测同时A=1且B=1),可以先通过dplyr::case_when为每个观测匹配对应概率,再用rbinom生成二进制变量X:
library(dplyr) df <- df %>% mutate( # 匹配对应概率 prob = case_when( A == 1 ~ 0.4, B == 1 ~ 0.9, C == 1 ~ 0.1, TRUE ~ 0 # 所有不满足A/B/C=1的观测,概率设为0,可根据需求调整 ), # 生成X变量:n为观测总数,size=1表示单次伯努利试验,prob为对应概率 X = rbinom(nrow(df), size = 1, prob = prob) )
情况2:存在多条件重叠的观测
如果数据中存在同时满足多个条件的观测(比如某观测同时B=1且A=1),需要先定义优先级(比如B的优先级高于A,A高于C),调整case_when的条件顺序即可:
df <- df %>% mutate( prob = case_when( B == 1 ~ 0.9, # 优先级最高 A == 1 ~ 0.4, C == 1 ~ 0.1, TRUE ~ 0 ), X = rbinom(nrow(df), 1, prob) )
Base R 实现方式
如果不想使用dplyr,可以用嵌套的ifelse实现相同逻辑:
# 先匹配概率 df$prob <- ifelse(df$B == 1, 0.9, ifelse(df$A == 1, 0.4, ifelse(df$C == 1, 0.1, 0))) # 生成X变量 df$X <- rbinom(nrow(df), size = 1, prob = df$prob)
常见问题排查
如果你之前用case_when结合rbinom出错,大概率是以下原因:
- 未覆盖所有情况:缺少
TRUE ~ ...分支导致部分观测概率为NA,无法生成X - 条件顺序错误:多条件重叠时,优先级高的条件未放在前面,导致概率匹配错误
- 直接在
case_when分支中生成对应长度的rbinom:这种写法需要每个分支生成的向量长度严格匹配对应子集的长度,不如先统一匹配概率再生成X稳定
内容的提问来源于stack exchange,提问作者Sarah Bell
相关产品推荐
相关产品推荐

