Random 如何随机分配到不同大小的组

Random 如何随机分配到不同大小的组,random,dataset,stata,assign,Random,Dataset,Stata,Assign,假设我有一个数据集,我想将观察值分配给不同的组,组的大小由数据决定。例如,假设这是数据: 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 *

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

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\u new
值为
NCntrl


我可能有一个类似的解决方案。这样做的想法是将
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

看起来您希望在观察值之间围绕存储在组变量中的值进行移动。可以通过将数据缩减为组变量、对包含随机值的变量进行排序,然后使用不匹配合并将随机组标识符与原始观测值关联来实现这一点。 假设数据示例存储在名为“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
另见