如何计算含缺失值矩阵各列的正确标准差?(Stata/Mata)
问题:带缺失值的矩阵列标准差计算偏差问题
我通过以下Stata代码生成矩阵:
matrix A = (1,2\2,5\.,7\.,10\.,2\.,13)
需要计算该矩阵每一列的标准差(共两列)。尝试了如下Mata代码:
mata: st_matrix("testing", diagonal(sqrt(variance(st_matrix("A"))))) matrix list testing
但运行结果和MS Excel计算的标准差不一致,推测是缺失值或方差计算逻辑导致的问题,请问如何得到正确的列标准差?
解决方案
问题根源
- 自由度差异:Mata的
variance()函数默认计算总体方差(除以观测数n),而Excel常用的STDEV.S函数计算的是样本方差(除以n-1),这是结果差异的核心原因。 - 缺失值处理:
variance()会自动忽略缺失值,但需确保计算时使用有效观测数对应的自由度。
修正后的Mata代码
要得到和Excel一致的样本标准差,需在variance()中指定第2个参数为1(表示使用样本方差,自由度为n-1):
mata: A = st_matrix("A") // 计算样本方差(自动忽略缺失值,自由度取n-1) col_vars = variance(A, 1) // 将标准差转为对角矩阵并输出到Stata矩阵 st_matrix("col_stds", diagonal(sqrt(col_vars))) end matrix list col_stds
验证结果
针对示例矩阵:
- 第一列有效观测值为
[1,2],样本标准差为0.7071 - 第二列有效观测值为
[2,5,7,10,2,13],样本标准差为4.6904
该结果与Excel的STDEV.S计算结果完全一致。
替代方案(无需Mata)
如果不想使用Mata,可将矩阵转为数据集后用Stata原生命令计算:
* 将矩阵转换为数据集 svmat A, names(col) * 计算每列的样本标准差 summarize col1 col2, detail * 提取标准差到矩阵 matrix col_stds = (r(sd_col1), r(sd_col2))' matrix list col_stds * 清理临时数据 drop col1 col2
内容的提问来源于stack exchange,提问作者Hosea
相关产品推荐
相关产品推荐

