sum - 通过预设的 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。
解决方案
你的问题不止一个。首先,让我们解决您的问题报告。
在每个面板中,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的帖子。
推荐阅读
- sftp - 如何使用 bash 从 SFTP 下载最新文件(连接使用密钥文件和密码)
- rdf - 如何检查默认凭据以首次登录 anzograph?
- pandas - 如何在熊猫中创建多列数据透视表?
- node.js - 如何使用 passport-azure-ad 实现身份验证代码流
- php - 将 vb.net Rijndael 加密移植到 PHP OpenSSL
- android - 如何控制android kotlin中的后退按钮?
- java - 我无法访问命名空间
ruby-on-rails - 如何使用 XPath 捕获部分 ap 标签 - spring - 无法在 Spring Boot 应用程序的 application.properties 中获取环境变量
- sql - Oracle SQL 自动创建 VARCHAR 递增 PK