2014-11-08 50 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