假设我有一个数据集,我想将观察结果分配给不同的组,即由数据确定的组的大小。例如,假设这是数据:
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
的结果保存到宏或矩阵中,然后使用循环并替换循环查看,这些观察按随机数排序。假设在这个玩具示例中有比这四个更多的组。有没有更合理的方法来实现这个目标?
答案 0 :(得分:2)
看起来你想要在整个观察中围绕存储在组变量中的值进行混洗。您可以通过将数据减少到组变量,对包含随机值的变量进行排序,然后使用不匹配的合并将随机组标识符与原始观察值相关联来实现此目的。 假设数据示例存储在名为“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