Stata 发行股票累计总和:最大值 1 不被认可

Stata issue with cumulative sum of shares: max value 1 not recognized as such

我会提前声明,出于保密原因,我无法在此处报告数据,并且我修改了报告收入的数字,但也许有人可以帮助我发现以下代码的任何错误,或者告诉我发生了什么使用 Stata。

我正在使用 sum() 函数和 generate 命令来获取属于特定组的公司年收入的累计总和占年度总收入的份额组.

* 1) Derive the shares
sort Group year rev_Tot
by   Group year:         egen rev_Tot_group = total(rev_Tot)

replace rev_Tot_group = rev_Tot / rev_Tot_group 

* 2) Compute the cumulative sum of the shares by group per year

by   Group year: gen Roll_sum_rev_Tot_group = sum(rev_Tot_group)
drop rev_Tot_group

到目前为止,显然还不错。然后我开始按 group/year 内的五分位数对观察结果进行分类 - 我只关心 3 个中的两组。

gen quintile = ""
replace quintile = "Group1 0.2" if Roll_sum_rev_Tot_group <= 0.2                                 & Group == "1"
replace quintile = "Group2 0.2" if Roll_sum_rev_Tot_group <= 0.2                                 & Group == "2"
replace quintile = "Group1 0.4" if Roll_sum_rev_Tot_group >  0.2 & Roll_sum_rev_Tot_group <= 0.4 & Group == "1"
replace quintile = "Group2 0.4" if Roll_sum_rev_Tot_group >  0.2 & Roll_sum_rev_Tot_group <= 0.4 & Group == "2"
replace quintile = "Group1 0.6" if Roll_sum_rev_Tot_group >  0.4 & Roll_sum_rev_Tot_group <= 0.6 & Group == "1"
replace quintile = "Group2 0.6" if Roll_sum_rev_Tot_group >  0.4 & Roll_sum_rev_Tot_group <= 0.6 & Group == "2"
replace quintile = "Group1 0.8" if Roll_sum_rev_Tot_group >  0.6 & Roll_sum_rev_Tot_group <= 0.8 & Group == "1"
replace quintile = "Group2 0.8" if Roll_sum_rev_Tot_group >  0.6 & Roll_sum_rev_Tot_group <= 0.8 & Group == "2"
replace quintile = "Group1 1"   if Roll_sum_rev_Tot_group >  0.8 & Roll_sum_rev_Tot_group <= 1   & Group == "1"
replace quintile = "Group2 1"   if Roll_sum_rev_Tot_group >  0.8 & Roll_sum_rev_Tot_group <= 1   & Group == "2"
replace quintile = "Whatever" if Group == "3"

至此,我认为quintile应该没有空值了。然而,我发现一个观察仍然是空的:

count if quintile == ""

报告 1

因此我浏览以查看围绕该观察的数据

br if quintile == ""
br

我看到的是如果累计和为1,quantile为空:

Group   year    rev_Tot Roll_sum_rev_Tot_group    quintile
2       2018      37200                .993623    Group2 1
2       2018      37300                .995001    Group2 1
2       2018      43800                .996619    Group2 1
2       2018      45000                .998288    Group2 1
2       2018      46000                      1  
2       2019          0                      0  Group2 0.2
2       2019          0                      0  Group2 0.2
2       2019          0                      0  Group2 0.2

我认为问题在于 Stata 从累积和变量中读取“1”的方式,鉴于

assert(Roll_sum_rev_Tot_group    == 1)  if quintile == ""

产量

assertion is false
r(9);

assert(Roll_sum_rev_Tot_group    != 1)  if quintile == ""

不会产生任何错误。

但是,如果我在阅读模式下单击单元格,我看到它是一个整齐的 1。如果我通过制表检查,我又得到 1:

tab Roll_sum_rev_Tot_group    if quintile == "",m 

产生

Roll_sum_re |
v_Tot_group |  Freq.   Percent     Cum.
------------+---------------------------
          1 |     1     100.00   100.00
------------+---------------------------
      Total |     1     100.00

这让我很费解。有人可以帮助我了解发生了什么吗?这对我来说当然是个小问题,因为我可以继续分析,但有点担心我需要手动更正它。

谢谢。

主要问题是精度。你知道逻辑上最后一个值应该是 1 但 Stata 不知道。

问题从

开始
sort Group year rev_Tot
by   Group year:         egen rev_Tot_group = total(rev_Tot)

replace rev_Tot_group = rev_Tot / rev_Tot_group

我会重写为

bysort Group year (rev_Tot) : gen double rev_Tot_group = sum(rev_Tot) 
by Group year : replace rev_Tot_group = rev_Tot_group / rev_Tot_group[_N]  

因为存在或应该保证每个观察块中的最后一个值恰好为 1。

换句话说,如果微小的差异困扰着您,首先要尝试使用 double 作为存储类型。

次要问题是显示格式。您将需要更改显示格式以更好地了解 Stata 所持有的内容。在极端情况下,格式 %21x 可能很有启发性。

您的五分位赋值代码看起来相当费力,对于在 0 和 1 之间变化的 input 可能会以

的风格开始
gen wanted = ceil(5 * input) 

如果需要,另请参阅 this paper