如何将上个月的最后一个观测值复制到其他观测值?



在Stata 中

  • 每日价格数据,permno是公司标识符
  • 对于每个permno month,我想要上个月底的价格
tsset permno date
gen m= mofd(date)
format m %tm
* price end of each month 
bys permno m: gen prc_end= prc[_N]
* price end of the prior month
gen n=m-1
format n %tm
bys permno m: gen prc_endpm= prc_end if n==m[_n-1]
* no results

当前数据:

永久日期prc m prc_end n

10026 2019年1月24日145.8000031 2019m1 154.35 2018m12

10026 2019年1月25日144.5500031 2019m1 154.35 2018m12

10026 2019年1月28日140 2019m1 154.35 2018m12

10026 2019年1月29日156.8200073 2019m1 154.35 2018m12

10026 2019年1月30日150.5 2019m1 154.35 2018m12

10026 2019年1月31日154.3500061 2019m1 154.35 2018m12

10026 2019年2月1日154.8000031 2019m2 155.28 2019m1

10026 2019年2月4日158.4400024 2019m2 155.28 2019m1

10026 2019年2月5日158.2599945 2019m2 155.28 2019m1

10026 2019年2月6日158.2400055 2019m2 155.28 2019m1

10026 2019年2月7日156.4100037 2019m2 155.28 2019m1

为了让事情更清楚,考虑一个愚蠢的示例数据集。

clear 
set obs 6 
gen permno = 1 
gen date = mdy(1 + (_n > 3), real(word("1 15 31 1 15 28", _n)), 2022)
format date %td 
gen m = mofd(date)
format m %tm 
gen n = m - 1 
format n %tm 
gen price = _n 
list, sepby(permno m)

+-----------------------------------------------+
| permno        date        m         n   price |
|-----------------------------------------------|
1. |      1   01jan2022   2022m1   2021m12       1 |
2. |      1   15jan2022   2022m1   2021m12       2 |
3. |      1   31jan2022   2022m1   2021m12       3 |
|-----------------------------------------------|
4. |      1   01feb2022   2022m2    2022m1       4 |
5. |      1   15feb2022   2022m2    2022m1       5 |
6. |      1   28feb2022   2022m2    2022m1       6 |
+-----------------------------------------------+

现在

bys permno m: gen prc_end= price[_N]

可能会起作用,但这会更安全:

bys permno m (date): gen prc_end= price[_N]

时出现问题

bys permno m: gen prc_endpm= prc_end if n==m[_n-1]

by:的作用是将计算限制在具有相同permno和月日期的块中。这里的[_n-1]是合法的,但它指的是同一观察块中的前一个观察(如果有,则有用;如果没有,则代码仍然合法(。

您希望[_n-1]引用前一个月(以及相同的permno(,但这不是您的语法含义。此外,该示例显示,尽管您的语法是合法的,但没有满足if条件的观测结果,因为mn在同一观测块内永远不相等。

你想要的可以用by:来完成,但你需要跨越几个月。

这应该做到:

bysort permno (m date) : gen previous = price[_n-1] if m[_n-1] == m -1 
bysort permno m (date) : replace previous = previous[1]
list, sepby(permno m)
+----------------------------------------------------------+
| permno        date        m         n   price   previous |
|----------------------------------------------------------|
1. |      1   01jan2022   2022m1   2021m12       1          . |
2. |      1   15jan2022   2022m1   2021m12       2          . |
3. |      1   31jan2022   2022m1   2021m12       3          . |
|----------------------------------------------------------|
4. |      1   01feb2022   2022m2    2022m1       4          3 |
5. |      1   15feb2022   2022m2    2022m1       5          3 |
6. |      1   28feb2022   2022m2    2022m1       6          3 |
+----------------------------------------------------------+

相关内容

最新更新