我有4000次观察,每次观察4次,每次观察4个月。我有一个全局宏treatment
,我想随机分配给我的观察。我想每个月分别做这件事。 treatment
占用了35个值。对于每个月,我希望treatment
的前20个值每个都有29个观察值,并且每个treatment
的最后15个值每个都有28个观察值。这使得每月1000个。例如,前1000个观测值为Jan
。我希望A01
被随机分配到Jan
内的29个观察点。 ...... G05
被随机分配到Jan
的28个观察值。
clear
set obs 4000
gen ID = _n
gen month = "Jan" if _n<=1000
replace month = "Feb" if _n>=1001 & _n<=2000
replace month = "Mar if _n>=2001 & _n<=3000
replace month = "Apr" if _n>=3001 & _n<=4000
*Create treatment
global letters A B C D E F G
global numbers 01 02 03 04 05
global treatment ""
foreach i in $letters {
foreach j in $numbers {
global treatment $treatment `i'`j'
}
}
此时,将treatment
随机分配给观察的最佳方法是什么 - 每个月分别?
我想到的方法是创建一个runiform()变量;按此变量排序,也按月份排序;然后继续将treatment
的第一个值分配给前29个观测值,依此类推。但我希望有一种比这更好的方法。
答案 0 :(得分:3)
我可能就是这样做的:
clear
set more off
*----- example data -----
set obs 2000
gen month = cond(_n <= 1000, 1, 2)
*----- what you want -----
bysort month: gen orig = _n
set seed 3596
gen runi = runiform()
bysort month (runi): egen treat1 = seq() if orig <= 580, from(1) to(20)
by month: egen treat2 = seq() if orig >= 581, from(21) to(35)
gen treat = max(treat1, treat2)
sort orig
drop treat?
tab treat month
然后您需要做的就是将整数1-35映射到您可以使用值标签进行的处理。我在我的例子中使用了数字,但很容易使它更通用。
还有其他创建序列的方法,您可以在Stata FAQ页面中查看。