生成3年间隔的交易值的累积总和

时间:2015-02-18 10:15:19

标签: stata

请注意,此内容已发布在statalist中。重新发布在这里beacuse链接到我的dta.file在statalist中不起作用。这是该帖子的链接: http://www.statalist.org/forums/forum/general-stata-discussion/general/852325-generating-cumulative-sum-of-deal-values-for-3-year-intervals

我试图在任何收购公告之前的3年间内为目标公司的收购产生累计交易价值(英镑)。我尝试过使用Stata Journal(2007)7中给出的类似代码:间隔事件,但无法得到理想的结果。

我用来生成这个总和的代码(我不知道如何生成累积和)作为yr3_cum_dealval在3年的时间间隔内:

gen yr3_cum_dealval = .
quietly forval i = 1/`= _N' {
sum (deal_value_mn) if lspdno == lspdno[`i'] & inrange(event_date[`i'] – event_date, 1, 1098)
replace yr3_cum_dealval = r(sum) in `i'
}

这里,deal_value_mn是以英镑支付的金额。对于每次收购,lspdno是每个收购公司的唯一ID,每个交易/收购的event_date公告日期,1098 = 366 * 3(3年间隔)。

我在yr3_cum_dealval栏中不明白,为什么我总是在3年的时间内获得'0'作为起始交易价值,而它应该是第一次收购时支付的实际金额,即第一笔交易的总和第二次收购的金额和第二笔交易金额,同样是第一笔两笔金额的总和加上第三笔收购累计交易价格的第三笔金额(前两笔收购发生在第三笔交易的3年内)等等。 此外,当在同一天宣布了2次收购时,每个日期的累计交易价值应该不同(我在同一日期收购时获得相同的yr3_cum_dealval),第1个相同的日期应该具有为此支付的金额总和。之前的3年期交易以及当前交易金额,而第2个相同的日期应该具有第一个相同的event_date金额,其中包括累积金额与之前的3年金额,以及与当前收购相对应的金额。

我正在粘贴到dta.file的dropbox链接,其中包含我的数据快照,只有一家公司从1994年到2006年进行了多次收购,其中名称为yr3_cum_dealval的列显示了我使用上述代码获得的内容,而Correct_yr3_cum_dealval显示我需要得到什么。

https://dl.dropboxusercontent.com/u/64545449/cumul_dealvalue_ranks.dta

请帮我纠正此代码。

谢谢,Suparna Ray

1 个答案:

答案 0 :(得分:0)

此处给出了样本数据的相关部分以及另一个变量wanted。 (像这样直接发布样本数据通常比发布文件链接更有帮助。)

. l lspdno deal_value_mn event_date yr3 correct event_date wanted

      +--------------------------------------------------------------------------+
      | lspdno   deal_v~n   event_d~e   yr3_cu~l   correc~l   event_d~e   wanted |
      |--------------------------------------------------------------------------|
   1. |    286      214.1   03oct1994          0      214.1   03oct1994    214.1 |
   2. |    286        100   11jul1995      214.1      314.1   11jul1995    314.1 |
   3. |    286      126.1   19oct1998          0      126.1   19oct1998    126.1 |
   4. |    286      214.1   01nov1999      126.1      340.2   01nov1999    340.2 |
   5. |    286      214.1   26may2000      340.2      554.3   26may2000    554.3 |
      |--------------------------------------------------------------------------|
   6. |    286      214.1   06jul2000      554.3      768.4   06jul2000    768.4 |
   7. |    286        5.6   01aug2000      768.4        774   01aug2000      774 |
   8. |    286       58.4   04jul2002      647.9      492.2   04jul2002    706.3 |
   9. |    286      170.6   08oct2002      706.3      662.8   08oct2002    876.9 |
  10. |    286      214.1   31dec2002      662.8      876.9   31dec2002    876.9 |
      |--------------------------------------------------------------------------|
  11. |    286      214.1   22jul2004      443.1      657.2   22jul2004   1395.4 |
  12. |    286      738.2   22jul2004      443.1     1395.4   22jul2004   1395.4 |
  13. |    286      214.1   25sep2005       1337     1551.1   25sep2005   1551.1 |
  14. |    286      299.8   19may2006     1166.4     1466.2   19may2006   1680.3 |
  15. |    286      214.1   19may2006     1166.4     1680.3   19may2006   1680.3 |
      +--------------------------------------------------------------------------+

我在这里看到三个混淆:

首先,正如您在评论中已经指出的那样,当您想要包含当前交易时,您的inrange()条件应为

   inrange(event_date[`i'] - event_date, 0, 1098) 

N.B。 0不是1.

其次,您对正确的指示似乎部分不正确:特别是观察11和12是相同的日期,如14和15.据我所知,你想要的变量的值应该是同样的,没有什么不同。

第三,你认为这是一个累积和,但至少就Stata而言,它是一个区间的和,累积和语法是无关紧要的。请注意,函数(非命令)sum()是返回累积总和的函数。

变量wanted

计算
gen wanted = . 

quietly forval i = 1/`=_N' {
    sum (deal_value_mn) if lspdno == lspdno[`i'] & inrange(event_date[`i'] - event_date, 0, 1098)
    replace wanted = r(sum) in `i' 
}