如何随机分配给不同规模的小组
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
假设我有一个数据集,我想将观察结果分配给不同的组,组的大小由数据决定。例如,假设这是数据:
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