2014-11-08 49 views
1

我有4000个观测值,1000个观测值分别在4个不同的月份。我有一个全球宏,treatment,我想随机分配给我的观察。我想分开为每个月做这个。 treatment取35个值。对于每个月,我希望treatment的前20个值每个都有29个观察值,并且最后15个值为treatment每个都有28个观察值。这使得总共1000个月。例如,前1000个观察值是Jan。我想A01被随机分配到Jan内的29个观察。 ...和G05被随机分配到2833观察Jan如何从宏中随机分配字符串到观测

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个观察值等等。但我希望有一个比这更好的方法。

回答

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

+0

聪明。欣赏它! – bill999 2014-11-09 02:52:01