请注意,此内容已发布在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
答案 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'
}