通过预设的 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 上有数百个帖子。
我 运行 在做一个相当基本的求和时遇到了问题。 我的数据集由公司 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 上有数百个帖子。