Stata:计算每个公司本年及之前年份的标准差 or 计算累计标准差

有个小伙伴问了这样一个问题:

如果是求 N 年的投资支出的标准差呢?比如一个公司有 2011~2015 的投资支出数据,2012 年的标准差是用 2011 年和 2012 年的数据,2013 年的标准差是用 2011 2012 2013 的数据,以此类推。

实际上也就是如何计算累计标准差。

我准备了一个示例数据:

*- 计算每个公司本年及之前年份的标准差
use data1, clear
list in 1/10, sep(0)

按照企业名称和年份排序:

gsort 企业名称 年份

根据总体方差公式 D(x) = E(x^2) - [E(x)]^2

首先计算 [E(x)]^2:

bysort 企业名称: gen cumsum = sum(资产总计千元)
bysort 企业名称: gen n = _n
gen mean2 = (cumsum / n) ^ 2

然后计算 E(x^2):

bysort 企业名称: gen x2cumsum = sum(资产总计千元^2) / n

方差等于两者的差值:

gen var = x2cumsum - mean2

不过我们这里实际上是要计算样本标准差,所以需要进行无偏性调整:

回忆一下,总体方差公式里面的分母是 n,样本方差公式里面的分母是 (n - 1),所以这里需要乘以 n/(n-1) 进行转换:

replace var = var * (n / (n - 1))

还可以通过循环计算前面的一些来检查下:

*- 标准差
gen sd = sqrt(var)

*- 检查
gen sd2 = .
forval i = 2/17 {
qui sum 资产总计千元 in 1/`i'
replace sd2 = r(sd) in `i'
}

list in 1/10, sep(0)

*> +---------------------+
*> | sd sd2 |
*> |---------------------|
*> 1. | . . |
*> 2. | 7137.542 7137.536 |
*> 3. | 18516.39 18516.4 |
*> 4. | 32341 32341 |
*> 5. | 60917.46 60917.46 |
*> 6. | 100088.9 100088.9 |
*> 7. | 120013.5 120013.5 |
*> 8. | 137161.5 137161.5 |
*> 9. | 157010.7 157010.7 |
*> 10. | 180440.3 180440.4 |
*> +---------------------+

*- 基本一致,删除中间变量
drop cumsum n mean2 x2cumsum sd2

点击这里跳转到 RStata 短书平台获取附件:Stata:计算每个公司本年及之前年份的标准差 or 计算累计标准差

评论