针对8万+次正态分布模拟观测的原假设检验:高效可复现实现方案问询
高效实现正态分布样本的批量假设检验方案
问题梳理
我懂你之前手动逐个生成样本的痛苦——8万次操作想想都头大!你的核心需求其实很明确:
- 针对400个不同的真实均值
theta(范围从-0.99到3),每个theta重复200次实验 - 每次实验从
N(theta, 1)中生成样本量为200的随机样本,检验原假设H0: mu ≤ 1 - 之前的手动方案效率极低,还没法保证结果可复现
核心优化思路
其实完全不用生成所有原始样本!利用正态分布的统计性质:样本均值x̄服从N(theta, 1/n)(n是单次实验的样本量),直接生成样本均值数组就行,这能把计算量从几十万次原始样本生成,降到仅需生成8万次均值(甚至连原始样本都不用碰)。再配合向量化操作代替循环,加上固定随机种子,既能大幅提升效率,又能彻底解决可复现性问题。
代码实现(Python为例)
用numpy做向量化计算,scipy.stats处理假设检验,代码简洁高效:
import numpy as np from scipy.stats import norm # 设置随机种子,彻底解决可复现性问题 np.random.seed(42) # 定义所有核心参数 n_repeats_per_theta = 200 # 每个theta重复实验的次数 sample_size = 200 # 单次实验的样本量n num_thetas = 400 # 真实theta的总数量 theta_start = -0.99 # 你的起始theta值 theta_end = 3 # 你的结束theta值 # 生成400个均匀分布的theta值(从-0.99到3,刚好400个) thetas = np.linspace(theta_start, theta_end, num_thetas) # 批量生成所有样本均值:shape=(400, 200),对应每个theta的200次实验均值 # 样本均值的分布是N(theta, 1/sample_size),所以scale取sqrt(1/200) sample_means = np.random.normal( loc=thetas[:, np.newaxis], # 用广播机制让每个theta对应200次实验 scale=np.sqrt(1 / sample_size), size=(num_thetas, n_repeats_per_theta) ) # 执行Z检验(方差已知,原假设H0: mu ≤1,备择假设H1: mu>1,属于右侧检验) # 检验统计量简化为:Z = (x̄ - 1) * √n(因为σ=1,σ/√n=1/√200) z_scores = (sample_means - 1) * np.sqrt(sample_size) # 计算右侧检验的p值:1减去标准正态分布的CDF值 p_values = 1 - norm.cdf(z_scores) # 统计每个theta的拒绝率(以显著性水平α=0.05为例) alpha = 0.05 rejection_rates = np.mean(p_values < alpha, axis=1) # 查看部分结果验证 print("部分theta的拒绝率:") for idx in [0, 100, 200, 300, 399]: print(f"Theta={thetas[idx]:.2f} → 拒绝率={rejection_rates[idx]:.2%}")
额外说明
- 可复现性保障:只要固定
np.random.seed()的数值,每次运行代码得到的结果完全一致,再也不用手动逐个生成样本。 - 如需原始样本:要是后续有其他分析必须用到原始数据,也可以批量生成(但内存占用会大很多):
# 生成所有原始样本:shape=(400, 200, 200) raw_samples = np.random.normal( loc=thetas[:, np.newaxis, np.newaxis], scale=1, size=(num_thetas, n_repeats_per_theta, sample_size) ) # 计算样本均值,和直接生成的结果完全一致 sample_means_from_raw = np.mean(raw_samples, axis=2) - 扩展性极强:如果后续要更换不同的样本量
n,只需要修改sample_size参数就行,整个代码逻辑不用调整,非常灵活。
内容的提问来源于stack exchange,提问作者eades
相关产品推荐
相关产品推荐

