在Stata在金融場(chǎng)景里使用的兩個(gè)例子里,我們討論了如何下載美聯(lián)儲(chǔ)加息前后兩天的美國(guó)國(guó)債利率期限結(jié)構(gòu)的數(shù)據(jù),。自從2017年以來(lái),,美國(guó)總共加過(guò)7次息, 2017年3月16,, 6月15,,12月14;2018年3月20,,6月12,,9月25和12月18日,。 當(dāng)時(shí)有位讀者留言,說(shuō)Stata因?yàn)闆](méi)有列表格式,,所以循環(huán)起來(lái)有點(diǎn)麻煩,。最近想到了另外一個(gè)辦法來(lái)解決這個(gè)問(wèn)題。而這個(gè)辦法的核心思想就是從定義的暫元集里取出子元素,,這和列表(list)的思維有異曲同工之妙,。 最初看到這個(gè)例子是在Stata官網(wǎng),他們需要做一個(gè)平行(parallel)的循環(huán),,即從暫元集A取出的元素和暫元集B取出的元素要并列地展示在一起,。下面這個(gè)例子: local agrp 'cat dog cow pig' local bgrp 'meow woof moo oinkoink ' local n : word count `agrp' local m: word count `bgrp'
forvalues i = 1/`n' { local a : word `i' of `agrp' local b : word `i' of `bgrp' di '`a' says `b'' }
我們得到的結(jié)果是: cat says meow dog says woof cow says moo pig says oinkoink
如果我們掌握了這種從暫元集里取元素的循環(huán)方式,對(duì)于上面尋找加息前后兩天數(shù)據(jù)的例子,,我們可以使用如下的程序: clear freduse DGS30 DGS20 DGS10 DGS7 DGS5 DGS3 DGS2 DGS1 DGS6MO DGS3MO DGS1MO save fred_data,replace
clear input year month day 2017 3 16 2017 6 15 2017 12 14 2018 3 20 2018 6 12 2018 9 25 2018 12 18 end
gen daten=mdy(month,day,year) format daten %td keep daten levelsof daten,local(fdate) save daten,replace
use fred_data,clear keep if year(daten)>=2017
levelsof daten,local(fulldate)
local n : word count `fdate' local m: word count `fulldate'
tempname memhold
postfile `memhold' day using date.dta,replace
forvalue i=1/`n'{ forvalue j=1/`m'{
local a : word `i' of `fdate' local b : word `j' of `fulldate'
if `a'==`b'{
local b1 : word `=`j'-2' of `fulldate' post `memhold' (`b1') local b2 : word `=`j'-1' of `fulldate' post `memhold' (`b2') local b3 : word `=`j'+1' of `fulldate' post `memhold' (`b3') local b4 : word `=`j'+2' of `fulldate' post `memhold' (`b4')
} } }
postclose `memhold'
use date,clear format day %td sort day
|