欢迎光临散文网 会员登陆 & 注册

Bootstrap重采样进行参数估计

2023-02-15 11:28 作者:Co-酱  | 我要投稿

中心极限定理(CLT):样本的平均值约等于总体的平均值。不管总体是什么分布,任意一个总体的样本平均值都会围绕在总体的整体平均值周围,并且呈正态分布

这描述了样本均值相对于总体均值的呈正态分布情况。

根据这个原理,我们可以进行估计一个鱼塘里的鱼有多少:

步骤:

  1. 承包鱼塘,不让别人捞鱼(规定总体分布不变)。

  2. 自己捞鱼,捞100条,都打上标签(构造样本)

  3. 把鱼放回鱼塘,休息一晚(使之混入整个鱼群,确保之后抽样随机)

  4. 开始捞鱼,每次捞100条,数一下,自己昨天标记的鱼有多少条,占比多少(一次重采样取分布)。

  5. 重复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


Bootstrap重采样进行参数估计的评论 (共 条)

分享到微博请遵守国家法律