样本方差的公式的分母问题

在统计学中,通过从整体中抽取样本,可以估计整体的概率分布的一些参数。例如,以下这篇博文[1]讲述了从高斯分布的整体中抽取样本,根据样本估算整体的平均值\mu和方差\sigma^2的方式。

样本均值的期望等于总体期望,样本方差的期望等于总体方差。-CSDN博客

其中,样本方差的公式是:

S^2={\sum^n_{i=1}((X_i-\bar{X})^2)\over {n-1}}

刚接触统计学的人会有疑惑:为什么分母是n-1而不是n

博文[1]给出了数学证明。另外,刚开始学习统计学时,老师会说"这是因为自由度的问题"。这个解释比较模糊,所以本文通过另一种更直观的方式证明为什么分母是n-1。另外,也通过Matlab模拟,证实样本方差公式的分母确实应该是n-1

一、数学证明

首先,和[1]的大致思路一样,要计算S^2的数学期望值。但和[1]不同,本文不用完全平方公式将(X_i-\bar{X})^2展开,而是根据D(X)=E(X^2)-E^2(X)展开。因此,E((X_i-\bar{X})^2)=E^2(X_i-\bar{X})+D(X_i-\bar{X})

注:E(X)X的数学期望,D(X)X的方差。

[1]中已经证明,\bar{X}=\mu

所以E(X_i-\bar{X})=E(X_i)-E(\bar{X})=\mu-\mu=0

所以E((X_i-\bar{X})^2)=D(X_i-\bar{X})

X_i-\bar{X}=X_i-{X_1+X_2+. . .+X_n\over n}={(n-1)X_i-X_1-X_2-. . . -X_{i-1}-X_{i+1}-. . . - X_n\over n}  

={n-1\over n}X_i-{1\over n}X_1-. . . - {1\over n}X_{i-1}-{1\over n}X_{i+1} - .. .-{1\over n}X_n   

每一项X_i都是相互独立的,所以

D(X_i-\bar{X})

=({n-1\over n})^2D(X_i)+({1\over n})^2D(X_1)+.. . + ({1\over n})^2D(X_{i-1})+({1\over n})^2D(X_{i+1})+. . . +({1\over n})^2D(X_n)

={(n-1)^2\sigma^2+(n-1)\sigma^2\over n^2}={(n-1)(n-1+1)\sigma^2\over n^2}={n-1\over n}\sigma^2

由此可见,样本方差中的每一项,相比于整体方差,都被乘以n-1\over n,即缩小了一点。

凭直觉分析,这是因为样本方差中的每一项都是样本X_i减去平均值\bar{X},而对于这个平均值的计算,样本X_i确实贡献了1\over n,所以减去这一点"贡献",导致X_i前面的系数减小了,方差自然也缩减了一点。

所以E(S^2)={\sum_{i=1}^nE((X_i-\bar{X})^2)\over n-1}={n*{n-1\over n}\sigma^2\over n-1}=\sigma^2

二、Matlab模拟

现在,用Matlab随机生成正态分布的,以0为均值,1为方差的变量。用randn函数生成[2]。然后用错误的方法计算方差,比较一下和真实方差的差别。

实验步骤

(1)令样本容量n为2,5,10,50,100,500,1000,各生成10000个样本。

(2)对每一个样本,用S^2={\sum^n_{i=1}((X_i-\bar{X})^2)\over {n}}计算方差。

(3)将样本按照样本容量n分类。对每一类样本,计算所有算出的方差S^2的平均值。由于各有10000个样本,平均值的估算比较可靠。

(4)将算出的平均方差值和n-1\over n进行比较

代码:

该函数输入的sample是个10000*n的矩阵,每一行都是一个容量为n的样本。用分母为n的公式计算方差。代码的一开始,确保输入的sample是二维矩阵,不是三维或更高维的tensor。

function sample_variance = get_sample_variance(sample)
%sample is a matrix where each row is a sample, so the number of row is
%number of samples, and number of columns is sample size
%[4,5,2;6,1,6] means there are 2 samples each of which has size of 3: [4,5,2] is a sample, [6,1,6] is a
%sample
if ~ismatrix(sample)
    disp("only support 2 dimension matrix!")
    return
elseif size(sample,2) < 2
    disp("sample size must be at least 2!")
    return
end
squared_diff = (sample - mean(sample,2)).^2; %for every element, square it
sample_variance = mean(squared_diff,2); %divide by n
end

然后对每个样本容量,各产生10000个样本,算出各样本的方差后,计算方差的平均值并保存。

sample_sizes = [2,5,10,50,100,500,1000]; %different sample sizes
variances_avg = zeros(1,length(sample_sizes)); %prepare a vector to save the average variances calculated
for i = 1:length(sample_sizes)
    samples = randn(10000,sample_sizes(i)); %get 10000 samples of such sample size first
    sample_variances = get_sample_variance(samples); %calculate the variances with n as denominator
    avg_variances = mean(sample_variances,1); %get the average variance
    variances_avg(i) = avg_variances; %save result
end

由此,得到的variances_avg的每一个元素是对于每一种样本容量的样本计算方差的平均值。

最后制作一张表格,把每一种样本容量的样本计算方差的平均值一一对应,并和n-1\over n做比较。

sample_size_over_minus_one = (sample_sizes - 1)./sample_sizes;
table(sample_sizes',variances_avg',sample_size_over_minus_one','VariableNames',{'sample size n','calculated variance by /n', '(n-1)/n'})

Matlab制作表格的方法,请参见[3]。

实验结果

从实验结果可知,通过S^2={\sum^n_{i=1}((X_i-\bar{X})^2)\over {n}}计算出来的方差是真实方差1的n-1\over n倍,所以正确的计算方法是S^2={​{\sum^n_{i=1}((X_i-\bar{X})^2)\over {n}}\over{n-1\over n}}= {\sum^n_{i=1}((X_i-\bar{X})^2)\over {n-1}}

三、总结

样本方差的分母之所以是n-1,是因为若整体方差为\sigma^2,则样本中的每一项(X_i-\bar{X})^2的方差即期望值是{n-1\over n}\sigma^2

参考资料

[1] https://blog.csdn.net/KID_yuan/article/details/84783671

[2] https://www.mathworks.com/help/matlab/ref/randn_zh_CN.html

[3] https://blog.csdn.net/u011089523/article/details/81032979

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值