如何从宏中随机分配字符串到观察

时间:2014-11-08 19:19:14

标签: string random stata

我有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个观测值,依此类推。但我希望有一种比这更好的方法。

1 个答案:

答案 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页面中查看。