Bootstrap重采样进行参数估计
中心极限定理(CLT):样本的平均值约等于总体的平均值。不管总体是什么分布,任意一个总体的样本平均值都会围绕在总体的整体平均值周围,并且呈正态分布。
这描述了样本均值相对于总体均值的呈正态分布情况。
根据这个原理,我们可以进行估计一个鱼塘里的鱼有多少:
步骤:
承包鱼塘,不让别人捞鱼(规定总体分布不变)。
自己捞鱼,捞100条,都打上标签(构造样本)
把鱼放回鱼塘,休息一晚(使之混入整个鱼群,确保之后抽样随机)
开始捞鱼,每次捞100条,数一下,自己昨天标记的鱼有多少条,占比多少(一次重采样取分布)。
重复3,4步骤n次。建立分布。
经验 Bootstrap 法用 δ⋆ 的分布去近似 δ 的分布;之后再把误差加到原始样本均值的两侧,该置信区间是以样本均值为中心的。
'''
Bootstrap置信空间估计:经验Bootstrap法(Bootstrap回归)
通过进行多次有置换的重采样,得到多个 Bootstrap 样本,每一个样本中都可以计算出一个均值。
使用每一个 Bootstrap 样本均值减去原始样本均值(40.8,第一次Bootstrap计算的均值)就得到 \sigma* 的一个取值(\sigma* = x* - x_mean)。
利用计算机,很容易产生足够多的 Bootstrap 样本,即足够多的 \sigma* 的取值。
根据大数定理(law of large numbers),当样本个数足够多时, \sigma* 的分布是 \sigma 的分布好的近似。
'''
def empirical_bootstrap(mean,samples):
'''
:param mean: 第一次bootstrap的点估计(mean)
:param samples: 第二次bootstrap
:return: Bootstrap 样本计算的均值与原始样本均值之间的差
'''
ratio = bootstrap(samples)
sigma = ratio - mean
return sigma
if __name__ == '__main__':
...
'''80%置信空间估计'''
sigma_iter = []
for i in range(iter): #重复实验10000次
bootstrapSamples = resample(all, n_samples=100, replace=True) #每次有放回地抽取100个人
# print(bootstrapSamples)
sigma = empirical_bootstrap(mean, bootstrapSamples)
# print(tempscale)
sigma_iter.append(sigma)
#80%置信空间估计,则计算sigma_iter的(100 - 80) / 2 和 80 + (100 - 80) / 2分位数
confidence_range = 0.8
lower,upper = (100 - (0.8 * 100)) / 2, (0.8 * 100 + (100 - (0.8 * 100)) / 2)
sigma_lower = np.percentile(sigma_iter,upper) #sigma_0.1对应90%分位数(方差小越集中)
sigma_upper = np.percentile(sigma_iter,lower) #sigma_0.9对应10%分位数
print(f"{confidence_range * 100}%的置信区间 = {mean - sigma_lower} ~ {mean - sigma_upper}")
---
80.0%的置信区间 = 0.5858123816562637 ~ 1.0137254823804245