【问题标题】:Stata issue with cumulative sum of shares: max value 1 not recognized as such具有累积股份总数的Stata问题:最大值1未被识别为
【发布时间】:2020-05-13 15:04:27
【问题描述】:

我会提前说,我不能在这里报告数据以保密,并且我修改了报告的收入数字,但也许有人可以帮助我发现以下代码的任何错误,或者告诉我 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

显然,到目前为止,一切都很好。然后我开始按组/年内的五分位数对观察结果进行分类 - 我只关心 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

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

谢谢。

【问题讨论】:

    标签: stata cumulative-sum


    【解决方案1】:

    主要问题是精度。你知道逻辑上最后一个值应该是 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。

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多