Wang Haihua
🍈 🍉🍊 🍋 🍌
前文《数学|概率统计07 大样本总体均值估计》基于的是中心极限定理,针对的是大样本情况下的总体均值估计,但当我们的样本量不大时,该定理便不适用了。如果总体标准差未知,且样本容量n较小,用样本标准差s代替σ时,正态近似失效。解决方法是使用一种不同的分布,称为自由度为n - 1的t分布。 那t-分布又是什么呢?我们来看t分布的生成过程:
t分布:$Y=\frac{Z}{\sqrt{U/k}}$,其中$Z$服从标准正态分布N(0,1),$U$服从自由度为$k$的卡方(Chi-square)分布,$U$与$Z$相互独立,则$Y$服从自由度为$k$的t分布,写作$Y\sim t(k)$
这里提到的卡方分布和自由度又是什么?我们继续来看卡方分布的生成过程:
卡方分布:$U=X_1^2+X_2^2+...+X_k^2$,其中$X_1,X_2,...,X_k$独立同分布于标准正态分布,$U$则服从于自由度为$k$的卡方分布,可写作$U\sim \chi^2(k)$.
从上面可以看出通过标准正态分布导出了卡方分布,卡方分布又和标准正态分布共同导出了t分布。
t分布的概率密度函数为 $$f(x)=\frac{\Gamma(\frac{n+1}{2})}{\sqrt{n\pi}\Gamma(\frac{n}{2})}(1+\frac{x^2}{n})^{-\frac{n+1}{2}}$$
其中$\Gamma(x)$为伽马函数,定义为$\Gamma(x)=\int_0^{+\infty}t^{x-1}e^{-t}dt(x>0)$
上述的概率密度公式太繁琐了,我们暂时没必要记忆。重点在于t分布的大致生成过程和应用。
我们来看不同自由度k情况下t分布的形态 随着k的增加我们可以发现数据的平均值没有发生变化,始终为0;标准差在不断变小;形态越来越接近正态分布。当k趋向无穷大时t分布几乎完全接近标准正态分布,实际上当自由度k大于20时,t分布与标准正态分布差距已经不大了。
小样本100(1−α)%总体均值置信区间可以通过下式获得 $$[\bar{X}-t_{\alpha/2}\frac{\sigma}{\sqrt{n}},\bar{X}+t_{\alpha/2}\frac{\sigma}{\sqrt{n}}]$$
与大样本估计类似,这里的$t_{\alpha/2}$是一个值,自由度为k的t分布,从该值至无穷大所在区间对应的概率密度和为$\alpha/2$. $s$为样本标准差.
本文介绍了t分布的概念的基本性质,说明了小样本总体均值估计的公式。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.family']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
k_list = [3,5,10,20,30]
figs = len(k_list)
fig_index = 1
x_array = 0
plt.figure(figsize=(12,5))
for i in k_list:
x_array = np.random.standard_t(i,1000000)
plt.subplot(1,figs,fig_index)
plt.hist(x_array,bins=80,density=True,alpha=0.3)
plt.xlim(-6,6)
plt.ylim(0,0.45)
plt.title(f'k={i} \n mean={np.round(x_array.mean(),2)} \n sd={np.round(x_array.std(),2)}')
fig_index += 1
x_array = 0
plt.savefig('images/08t01.png')
k_list = [3,5,10,20,30]
figs = len(k_list)
plt.figure(figsize=(12,5))
for i in k_list:
x_array = np.random.standard_t(i,1000000)
plt.hist(x_array,bins=80,density=True,alpha=0.3,label=f'k={i},mean={np.round(x_array.mean(),2)},sd={np.round(x_array.std(),2)}')
plt.xlim(-6,6)
plt.ylim(0,0.45)
plt.legend()
plt.savefig('images/08t02.png')
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
t_array = np.random.standard_t(20,100000)
plt.hist(t_array,bins=80,density=True,alpha=0.3,label='t(20)',color='red')
plt.legend()
plt.xlim(-5,5)
plt.subplot(1,2,2)
z_array = np.random.standard_normal(100000)
plt.hist(z_array,bins=80,density=True,alpha=0.3,label='标准正态分布',color='orange')
plt.legend()
plt.xlim(-5,5)
plt.savefig('images/08t03.png')