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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:21:41