生成 3 年时间间隔的累计交易价值总和

Generating cumulative sum of deal values for 3 year intervals

请注意,此内容已发布在 statalist 中。重新发布在这里是因为 link 到我的 dta.file 在 statalist 中不起作用。这是该帖子中的 link: 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: Events in intervals 中给出的类似代码,但无法获得所需的结果。

我用来生成此总和的代码(我不确定如何生成累积总和)作为 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 每次收购的公告日期 deal/acquisition,1098 = 366*3(3 年间隔)。

我不明白 yr3_cum_dealval 栏中的内容,为什么我在 3 年的跨度内总是将“0”作为起始交易价值,而它应该是第一次收购中支付的实际金额, 第二次收购的第一笔交易金额和第二笔交易金额的总和,同样是前两次支付的金额加上第三次收购的累计交易金额的总和(前提是前两次收购发生在 3 年内)第三笔交易)等等。 此外,当同一天宣布 2 次收购时,每个日期的累计交易价值应该不同(对于 2 次相同日期的收购,我得到相同的 yr3_cum_dealval),第一个相同日期的总和应该是前 3 年交易支付的金额以及当前交易金额,而第 2 个相同日期的第一个 event_date 支付金额应包含在与前 3 年金额的累计总和中,以及对应于当前收购。

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

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

请帮我更正此代码。

谢谢,Suparna Ray

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

. 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() 是 returns 的累加和。

变量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' 
}