2

2 つのデータセットがあります。FIRSTは、サプライヤからの製品とその日次価格SECONDのリストであり、開始日と終了日 (および分析のためのその他の重要なデータ) のリストです。FIRST開始日の価格を取得し、次に終了日の価格を特定の日付から取得するように Stata に指示するにはどうすればよいですかSECOND。正確に一致する日付がない場合は、利用可能な最後の日付を取得したいことに注意してください。たとえばSECOND、日付が 2013FIRST年 1 月 1 日で、価格が 2012 年 12 月 30 日、2012 年 12 月 31 日、2013 年 1 月 2 日の場合、2012 年 12 月 31 日の価格が取得されます。 .

通常は Excel でこれを行いますが、何百万もの観察結果があり、実現可能ではありません。

FIRST最適なソリューションが出力として与えるものとSECOND同様に、例を挙げましたPOST_SECOND

FIRST
 Product          Price              Date
   1               3                1/1/2010
   1               3                1/3/2010
   1               4                1/4/2010
   1               2                1/8/2010
   2               1                1/1/2010
   2               5                2/5/2010
   3               7                12/26/2009
   3               2                1/1/2010
   3               6                4/3/2010

SECOND
Product          Start Date          End Date
   1              1/3/2010            1/4/2010
   2              1/1/2010            1/1/2010
   3              12/26/2009          4/3/2010

POST_SECOND
 Product         Start Date          End Date      Price_Start     Price_End
   1              1/3/2010            1/4/2010          3             4
   2              1/1/2010            1/1/2010          1             1
   3              12/26/2009          4/3/2010          7             6
4

2 に答える 2

0

Stata では、このようなことを 1 つのステップでうまく機能させることはできませんでした (SQL 呼び出しを介して SAS で実行できること)。いずれにせよ、 から中間ファイルを作成してから、との変数FIRST.dtaのそれぞれでその 2x をマージする方がよいと思います。StartDateEndDateSECOND.dta

2010 年 1 月 1 日から 2013 年 12 月 31 日までの価格調整のデータがあるとします (上記のようにさまざまな間隔で指定されています)。すべての日付変数が既に&date formatにあり、その変数名にスペースが含まれていないと仮定します。FIRST.dtaSECOND.dtaSECOND

tempfile prod prices

use FIRST.dta, clear
keep Product
duplicates drop
save `prod'

clear
set obs 1096
g Date=date("12-31-2009","MDY")+_n
format date %td
cross using `prod'

merge 1:1 Product Date using FIRST.dta, assert(1 3) nogen
gsort +Product +Date /*this ensures the data are sorted properly for the next step  */
replace price=price[_n-1] if price==. & Product==Product[_n-1]
save `prices'

use SECOND.dta, clear
foreach i in Start End {
rename `i'Date Date
merge 1:1 Product Date using `prices', assert(2 3) keep(3) nogen
rename Price Price_`i'
rename Date `i'Date 
}

これは、データ構造を正しく理解している場合に機能するはずであり、@Dimitriy の回答へのコメントで議論されている問題に対処する必要があります。私は何度かやらなければならなかったことなので、これをより良くする方法についての批評にオープンであり、これは私が通常それを行う方法です.

于 2013-10-05T01:40:39.933 に答える