连续随机量的生成-从t分布采样
- 1. t t t 分布
- 2. 从 t t t 分布采样
- 3. Python编程实现
1. t t t 分布
t t t 分布作为 t t t 检验的抽样分布出现。 令 z 1 , ⋯ , z n z_1, \cdots, z_n z1,⋯,zn 为 i.i.d,分布为 N ( μ , σ 2 ) N\left(\mu, \sigma^2\right) N(μ,σ2),样本均值和样本方差分别为:
X ˉ = 1 n ( X 1 + ⋯ + X n ) , S 2 = 1 n − 1 ∑ i = 1 n ( X i − X ˉ ) 2 . {\bar{X}}=\frac{1}{n}\left(X_1+\cdots+X_n\right), \quad S^2=\frac{1}{n-1} \sum_{i=1}^n\left(X_i-\bar{X}\right)^2 . Xˉ=n1(X1+⋯+Xn),S2=n−11i=1∑n(Xi−Xˉ)2.
t t t-统计量定义为
T = X ˉ − μ S 2 / n , T=\frac{\bar{X}-\mu}{\sqrt{S^2 / n}}, T=S2/nXˉ−μ,
T T T 有度为 n − 1 n-1 n−1的 t t t-分布, 密度函数定义为
f ( x ) = τ ( n 2 ) ( n − 1 ) π τ ( n − 1 2 ) ( 1 + x 2 n − 1 ) − n 2 f(x)=\frac{\tau\left(\frac{n}{2}\right)}{\sqrt{(n-1) \pi} \tau\left(\frac{n-1}{2}\right)}\left(1+\frac{x^2}{n-1}\right)^{-\frac{n}{2}} f(x)=(n−1)πτ(2n−1)τ(2n)(1+n−1x2)−2n
其中 τ ( ⋅ ) \tau(\cdot) τ(⋅) 定义为 τ ( z ) = ∫ 0 ∞ x z − 1 e − x d x \tau(z)=\int_0^{\infty} x^{z-1} e^{-x} d x τ(z)=∫0∞xz−1e−xdx,对于 z > 0 z>0 z>0.
2. 从 t t t 分布采样
如何从度为 ( n − 1 ) (n-1) (n−1)的 t t t-分布的随机量 Z Z Z采样?
一个关于 T T T的重要定理是
T = Z Y n − 1 T=\frac{Z}{\sqrt{\frac{Y}{n-1}}} T=n−1YZ
其中 Z ∼ N ( 0 , 1 ) Z \sim N(0,1) Z∼N(0,1)和 Y ∼ χ 2 ( n − 1 ) Y \sim \chi^2(n-1) Y∼χ2(n−1), 关于度为 n − 1 n-1 n−1的 χ \chi χ-平方分布, 此外 Z Z Z和 Y Y Y独立。
- Sample a random quantity Y Y Y from the distribution χ 2 ( n − 1 ) \chi^2(n-1) χ2(n−1),
-
- Sample a random quantity Z ∼ N ( 0 , Y n − 1 ) Z \sim N\left(0, \frac{Y}{n-1}\right) Z∼N(0,n−1Y)
-
- Return X = Z X=Z X=Z.
-
3. Python编程实现
作业: 通过编程实现上述伪代码,生成1000个随机量,并绘制直方图。
import numpy as np
import matplotlib.pyplot as plt# 定义自由度和样本数量
n = 10 # 自由度(可以根据需要更改)
sample_size = 1000 # 样本数量# 生成随机量chi_squared_samples = np.random.chisquare(df=n - 1, size=sample_size)
normal_samples = np.random.normal(loc=0, scale=np.sqrt(chi_squared_samples / (n - 1)), size=sample_size)# 绘制直方图
plt.hist(normal_samples, bins=30, density=True, alpha=0.6, color='b', label='Generated Samples')
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.title('Histogram of Generated t-Distribution Samples')
plt.legend()
plt.grid(True)
plt.show()