首页 > 解决方案 > 通过预设的 N 个观测值对变量求和

问题描述

我在做一个相当基本的总结时遇到了问题。我的数据集由公司 ID (cusip8) 及其每日(日期)异常收益 (AR) 组成。我需要总结每家公司的异常收益,从 t+3 天到 t+60 天。

cusip8  year date                    ret                  vwretd            AR 
"00030710" 2014 19998                     .            .0007672172             . .
"00030710" 2014 19999   .008108087815344334             .009108214  -.0010001262 .
"00030710" 2014 20002    .03163539618253708             -.00158689    .033222288 .
"00030710" 2014 20003                     0   -.014999760000000001     .01499976 .
"00030710" 2014 20004  -.005717287305742502               .0158898    -.02160709 .
"00030710" 2014 20005   .006272913888096809             -.02121511    .027488023 .
"00030710" 2014 20006  -.012987012974917889             -.01333873    .000351717 .

我尝试了以下方法:

sort cusip8 date
    by cusip8: gen CAR = AR if _n==1
(24,741,003 missing values generated)
    by cusip8: replace CAR = AR +CAR[_n-1] if _n>3 & if _n<60

并且在新生成的变量中只剩下 .'s。有谁知道如何解决这个问题?

我正在使用 Stata 16.0。

标签: sumstatacumulative-sum

解决方案


你的问题不止一个。首先,让我们解决您的问题报告。

在每个面板中,CAR[2]由您的代码创建缺少,该代码CAR仅在第一次观察中创建。这会打乱所有后续计算,例如CAR[3]is AR[3] + CAR[2], and so missing, CAR[4]is AR[4] + CAR[3]and so missing 等等。

与您的说法相反,在每个面板中CAR[1]都应该是不丢失AR的。

其次,显然您在周末的第 20000 天和第 20001 天有间隙。dow()从每日日期开始,星期六返回 6,星期日返回 0(其中 0 是 1960 年 1 月 1 日)。

. di dow(20000)
6

. di dow(20001)
0

. di %td 20000
04oct2014

因此,要么设置一个业务日历以排除周末和节假日,要么决定只使用基于每日日期的特定窗口中可用的任何内容。

第三,你的措辞不足以让那些不经常处理你的数据的人明白你的问题。您似乎在寻求累积(运行)总和,但窗口可能只是一个窗口(正如您的问题字面暗示的那样)或移动窗口(我猜是这样)。该函数sum()给出累积或运行总和:见help sum()。只是可能,

bysort cusip8 (date): gen wanted = sum(AR) 

是您解决方案的开始。否则,ssc describe rangestat向您显示一个适合移动窗口计算的命令。

在这个领域有数百个关于Statalist的帖子。


推荐阅读