在统计学中,通过从整体中抽取样本,可以估计整体的概率分布的一些参数。例如,以下这篇博文[1]讲述了从高斯分布的整体中抽取样本,根据样本估算整体的平均值和方差
的方式。
样本均值的期望等于总体期望,样本方差的期望等于总体方差。-CSDN博客
其中,样本方差的公式是:
刚接触统计学的人会有疑惑:为什么分母是而不是
?
博文[1]给出了数学证明。另外,刚开始学习统计学时,老师会说"这是因为自由度的问题"。这个解释比较模糊,所以本文通过另一种更直观的方式证明为什么分母是。另外,也通过Matlab模拟,证实样本方差公式的分母确实应该是
。
一、数学证明
首先,和[1]的大致思路一样,要计算的数学期望值。但和[1]不同,本文不用完全平方公式将
展开,而是根据
展开。因此,
。
注:指
的数学期望,
指
的方差。
[1]中已经证明,
所以
所以
每一项都是相互独立的,所以
由此可见,样本方差中的每一项,相比于整体方差,都被乘以,即缩小了一点。
凭直觉分析,这是因为样本方差中的每一项都是样本减去平均值
,而对于这个平均值的计算,样本
确实贡献了
,所以减去这一点"贡献",导致
前面的系数减小了,方差自然也缩减了一点。
所以
二、Matlab模拟
现在,用Matlab随机生成正态分布的,以0为均值,1为方差的变量。用randn函数生成[2]。然后用错误的方法计算方差,比较一下和真实方差的差别。
实验步骤
(1)令样本容量为2,5,10,50,100,500,1000,各生成10000个样本。
(2)对每一个样本,用计算方差。
(3)将样本按照样本容量分类。对每一类样本,计算所有算出的方差
的平均值。由于各有10000个样本,平均值的估算比较可靠。
(4)将算出的平均方差值和进行比较
代码:
该函数输入的sample是个10000*的矩阵,每一行都是一个容量为
的样本。用分母为
的公式计算方差。代码的一开始,确保输入的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的每一个元素是对于每一种样本容量的样本计算方差的平均值。
最后制作一张表格,把每一种样本容量的样本计算方差的平均值一一对应,并和做比较。
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]。
实验结果
从实验结果可知,通过计算出来的方差是真实方差1的
倍,所以正确的计算方法是
三、总结
样本方差的分母之所以是,是因为若整体方差为
,则样本中的每一项
的方差即期望值是
。
参考资料
[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