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

问题描述 投票:0回答:1

在 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

当前数据:

permno 日期 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 19年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 19年2月1日 154.8000031 2019m2 155.28 2019m1

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

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

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

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

stata lag
1个回答
1
投票

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

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
条件,因为
m
n
在同一观察块中永远不会相等。

你想要的可以用

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 |
     +----------------------------------------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.