通过预设的 N 个观察值对变量求和

Summing up variable by preset N observations

我 运行 在做一个相当基本的求和时遇到了问题。 我的数据集由公司 ID 的 (cusip8) 和他们每天的(日期)异常 returns (AR) 组成。我需要总结每家公司的异常returns,从第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。

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

在每个面板中,您的代码创建的 CAR[2] 缺失,它仅在第一次观察中创建 CAR。这会打乱所有后续计算,例如 CAR[3]AR[3] + CAR[2],因此丢失,CAR[4]AR[4] + CAR[3],因此丢失,等等。

与您的说法相反,在每个面板中,只要 AR 存在,CAR[1] 就应该是非缺失的。

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

. di dow(20000)
6

. di dow(20001)
0

. di %td 20000
04oct2014

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

第三,您的措辞不够准确,无法让任何不经常处理您的数据的人明白您的问题。似乎您寻求的是累积 (运行) 总和,但 window 可能只是一个 window (正如您的问题字面意思)或移动 window (我猜在)。函数 sum() 给出累积或 运行 总和:参见 help sum()。有可能,

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

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

这个地区在 Statalist 上有数百个帖子。