Stata16中splitsample如何按变量存储的可变比例拆分样本
问题原因
原生Stata的splitsample命令split()参数仅支持输入全局固定的数值比例列表,不支持按观测/组别变化的异质性分组概率,因此直接传入概率变量会触发报错。
本次分组有两个不可突破的约束:
- 同一队列、同一个体的所有年度观测必须固定归属同一组,不能随年龄增长跨组
- 每个队列内部的分组比例必须严格匹配预设的队列专属概率
通过原生Stata的分层抽样逻辑即可实现需求,无需依赖第三方命令。
实现步骤
以下代码完全匹配你的分组规则,默认你的面板数据中个体唯一标识变量名为pid,如果实际变量名不同,替换为你数据中的对应变量名即可:
* 1. 暂存原始全量面板数据 preserve * 2. 提取个体-队列层级的唯一数据集,避免同个个体被重复抽样 keep pid individualnumber Chanceofbeingcontrol_1517 Chanceofbeingtreated Chanceofbeingcontrol_2325 duplicates drop pid, force * 3. 设置随机种子保证结果可复现,可自行替换种子数值 set seed 20240520 * 4. 按队列分层生成均匀分布随机数 bysort individualnumber: gen rand = runiform() * 5. 按队列专属概率分配分组 * 分组编码规则:0=对照组A(15-17岁),1=处理组(18-22岁),2=对照组B(23-25岁) gen treatedornot = . bysort individualnumber: replace treatedornot = 0 if rand <= Chanceofbeingcontrol_1517 bysort individualnumber: replace treatedornot = 1 if rand > Chanceofbeingcontrol_1517 & rand <= (Chanceofbeingcontrol_1517 + Chanceofbeingtreated) bysort individualnumber: replace treatedornot = 2 if rand > (Chanceofbeingcontrol_1517 + Chanceofbeingtreated) * 6. 保存分组结果临时文件 keep pid treatedornot tempfile group_res save `group_res' * 7. 恢复原始面板数据,合并分组结果 restore merge m:1 pid using `group_res', nogen
整数取整优化(匹配原rround参数需求)
如果需要和splitsample的rround参数效果一致,即每个队列各组分配的样本量为四舍五入后的整数(例如你举例的7号队列100个个体,正好分配43个到对照组A、57个到处理组),可以把上述步骤5的分配逻辑替换为以下代码:
* 队列内按随机数排序 bysort individualnumber: gen sort_id = _n * 统计每个队列的总个体数 bysort individualnumber: gen cohort_total = _N * 计算各组应分配的整数样本量 gen n_a = round(cohort_total * Chanceofbeingcontrol_1517) gen n_t = round(cohort_total * Chanceofbeingtreated) * 按排序分配分组 gen treatedornot = . bysort individualnumber: replace treatedornot = 0 if sort_id <= n_a bysort individualnumber: replace treatedornot = 1 if sort_id > n_a & sort_id <= (n_a + n_t) bysort individualnumber: replace treatedornot = 2 if sort_id > (n_a + n_t)
结果校验
运行以下代码验证分组是否符合要求:
* 查看每个队列的分组占比,确认和预设概率一致 tab individualnumber treatedornot, row * 校验同个个体是否存在多组归属,无输出即代表无跨组错配 bysort pid: gen group_mismatch = sd(treatedornot) tab group_mismatch if group_mismatch != 0
内容的提问来源于stack exchange,提问作者J.G.A. Wijlhuizen
相关产品推荐
相关产品推荐

