【问题标题】:Merging average of time series corresponding to time span in a different data set合并不同数据集中时间跨度对应的时间序列的平均值
【发布时间】:2015-11-19 20:07:03
【问题描述】:

我有两个数据集,一个包含合同,另一个包含市场价格。我要完成的要点是找到与横截面数据集中的一段时间相对应的时间序列的平均值。请看下文。

示例数据集 1:

Beginning Ending    Price
1/1/2014  5/15/2014 $19.50
3/2/2012  10/9/2015 $20.31
...
1/1/2012 1/8/2012 $19.00

在上面的示例中,有多个合同,第一个从 2014 年 1 月到 2014 年 5 月,第二个从 2012 年 3 月到 2015 年 10 月。每个合同都有一个价格。第二个数据集有每周市场价格。

示例数据集 2:

Date     Price
1/1/2012 $18
1/8/2012 $17.50
....
1/15/2015 $21.00

我想找到数据集 1 上每份合约的开始和结束期间的平均“市场价格”(即数据集 2 中的平均价格)。因此,对于 2012 年 1 月 1 日的第三份合约到 2012 年 1 月 8 日,从第二个数据集中输出将是 (18+17.50)/2 = 17.75。然后将此值合并回原始数据集。

我使用 Stata,但也可以使用 R 或 Excel。

另外,如果您对标题有更好的建议,我将不胜感激!

【问题讨论】:

  • 第二个数据集是面板还是单个时间序列?
  • 第二个数据集是单个时间序列,包含日期和市场价格。

标签: merge time-series stata


【解决方案1】:

您可以将合约横截面数据与时间序列交叉,形成每个成对组合,从日期范围外降低价格,然后计算平均值:

/* Fake Data */
tempfile ts ccs

clear
input str9 d p_daily
"1/1/2012" 18
"1/8/2012" 17.50
"1/15/2015" 21.00 
end
gen date = date(d,"MDY")
format date %td
drop d
rename date d
save `ts'
clear
input id str8 bd str9 ed p_contract
1 "1/1/2014"  "5/15/2014" 19.50
2 "3/2/2012"  "10/9/2015" 20.31
3 "1/1/2012"  "1/8/2012" 19.00
end
foreach var of varlist bd ed {
    gen date = date(`var',"MDY")
    format date %td
    drop `var'
    rename date `var'
}
save `ccs'

/* Calculate Mean Prices and Merge Contracts Back In */
cross using `ts'
sort id d
keep if d >= bd & d <=ed
collapse (mean) mean_p = p_daily, by(id bd ed p_contract)
merge 1:1 id using `ccs', nogen
sort id

这会让你得到这样的结果:

  id   p_contract          bd          ed   mean_p  
     1       19.5   01jan2014   15may2014        .  
     2      20.31   02mar2012   09oct2015       21  
     3         19   01jan2012   08jan2012    17.75  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 2011-03-06
    • 2021-12-16
    • 2019-10-21
    • 2016-04-05
    • 2013-09-11
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多