如何随机分配给不同规模的小组

How to Randomly Assign to Groups of Different Sizes

假设我有一个数据集,我想将观察结果分配给不同的组,组的大小由数据决定。例如,假设这是数据:

sysuse census, clear
keep state region pop
order state pop region
decode region, gen(reg)
replace reg="NCntrl" if reg=="N Cntrl"
drop region
*Create global with regions
global region NE NCntrl South West
*Count the number in each region
bys reg (pop): gen reg_N=_N
tab reg

有四个 reg 组,大小不一。现在,我想将观察值随机分配给四个组。这是通过以下方式实现的:生成一个随机数,然后根据随机数将观察结果分配给其中一组。

*Generate random number
set seed 1
gen random = runiform()
sort random
*Assign observations to number based on random sorting
egen reg_rand = seq(), from(1) to (4)
*Map number to region
gen reg_new = ""
global count 1
foreach i in $region {
    replace reg_new = "`i'" if reg_rand==$count
    global count = $count + 1
}
bys reg_new: gen reg_new_N = _N
tab reg_new

但这不是我想要的。我不想使用创建大小相等的组的 seq() 命令(假设 N 除以组数是整数),而是想根据原始组的大小随机分配。在这种情况下,这相当于 reg_N。例如,将有 12 个观测值的 reg_new 值为 NCntrl

我可能有一种类似于 https://stats.idre.ucla.edu/stata/faq/how-can-i-randomly-assign-observations-to-groups-in-stata/ 的解决方案。这个想法是将 tab reg 的结果保存到宏或矩阵中,然后使用循环和替换来循环观察按随机数排序的观察结果。假设有比这个玩具示例中的四个多得多的组。有没有更合理的方式来实现?

您似乎想在观察中随机排列存储在组变量中的值。为此,您可以将数据减少到组变量,对包含随机值的变量进行排序,然后使用不匹配的合并将随机组标识符与原始观察值相关联。 假设数据示例存储在名为 "data_example.dta" 的文件中并且当前已加载到内存中,这看起来像:

set seed 234
keep reg
rename reg reg_new
gen double u = runiform()
sort u reg_new
merge 1:1 _n  using "data_example.dta", nogen

tab reg reg_new