Trimmed 稳健均值估计与 中位数-中位数配对偏差法估计标准差——理论与 Python 实现

Posted zhuo木鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Trimmed 稳健均值估计与 中位数-中位数配对偏差法估计标准差——理论与 Python 实现相关的知识,希望对你有一定的参考价值。

文章目录


本文主要根据标准 16269-4:2010 的条款 5.2.2 和 5.3.1 。

数据集为: x 1 , x 2 , ⋯   , x n x_1, x_2, \\cdots, x_n x1,x2,,xn n n n 是样本容量。

a-Trimmed 平均

a-Trimmed 的平均值的计算,是通过截断次序统计量的“头尾”,从而进行稳健估计,截取比例为 α \\alpha α

理论步骤

给定一个系数 α ∈ [ 0 , 0.5 ) \\alpha\\in[0,0.5) α[0,0.5),即样本的次序统计量为: x ( 1 ) , x ( 2 ) , ⋯   , x ( n ) x_(1), x_(2), \\cdots, x_(n) x(1),x(2),,x(n)

计算出截取比例 α \\alpha α 对应的截取个数 r = [ α ⋅ n ] r = [\\alpha\\cdot n] r=[αn],其中 [ α ⋅ n ] [\\alpha\\cdot n] [αn] 为计算小于 α ⋅ n \\alpha \\cdot n αn 的最大整数。并计算 α ⋅ n \\alpha \\cdot n αn 的浮点数部分为: g = α ⋅ n − r g = \\alpha\\cdot n - r g=αnr

从而计算出 a-trimmed 均值为:
x ˉ ( α ) = 1 n ( 1 − 2 α ) [ ( 1 − g ) ( x ( r + 1 ) + x ( n − r ) ) + ∑ i = r + 2 n − r − 1 x ( i ) ] \\barx(\\alpha) = \\frac1n(1-2\\alpha) [ (1-g)(x_(r+1) + x_(n-r)) + \\sum_i=r+2^n-r-1 x_(i) ] xˉ(α)=n(12α)1[(1g)(x(r+1)+x(nr))+i=r+2nr1x(i)]

即抛弃头尾 r 个数据(升序排序后),在将删除 r 个后,两个极端数据,按权重 ( 1 − g ) (1-g) (1g) 计算其影响。

Python 实现

def trimmed_mean(x, alpha=0.05):
    if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):
        x = x.astype('float').values
    if isinstance(x, list):
        x = np.array(x)
    # 样本个数
    n = len(x)
    r = int(alpha*n)
    g = alpha*n - r
    
    x_sorted = np.sort(x)
    coeff = 1/(n*(1-2*alpha))
    
    loc = coeff*((1-g)*(x_sorted[r] + x_sorted[n-r-1]) + sum(x_sorted[r+1:n-r-1]))
    return loc

中位数-中位数绝对偏差

理论步骤

S n = s n × Median i ( Median j ∣ x j − x i ∣ , i ≠ j , j = 1 , 2 , ⋯   , n ) S_n = s_n \\times \\textMedian_i ( \\textMedian_j |x_j - x_i|, i \\neq j, j=1,2,\\cdots,n ) Sn=sn×Mediani(Medianjxjxi,i=j,j=1,2,,n)
该式为对 1 , 2 , ⋯   , n 1,2,\\cdots, n 1,2,,n 每个 x i x_i xi,计算 Median ∣ x j − x i ∣ , j ≠ i , j \\textMedian|x_j - x_i|,j\\neq i, j Medianxjxij=i,j 为除了 x i x_i xi 之外的其他样本,从而得到 n 个中位数样本,之后,再在这些中位数样本中,选取出中位数,配合 s n s_n sn 进行计算。

s n s_n sn 为 ISO 16269-4:2010 的附件表 D.1 中规定的系数(具体怎么求,我也不清楚,有大神可补充的,在此感谢),表格如下:

Python 实现

将上述表格放在一个叫 correction_factor.xlsx 的 Excel 表格中,与代码文件在同一路径下:

def median_median_absolute_pairwise(x):
    if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):
        x = x.astype('float').values
    if isinstance(x, list):
        x = np.array(x)
    # 样本个数
    n = len(x)
    path = r'./correction_factors.xlsx'
    factor_data = pd.read_excel(path, header=0)
    n_list = factor_data['n']
    if n not in n_list:
        if n <= 150:
            n_list_interpolate = np.arange(2, 151)
            sn_list = factor_data['sn'].values
            f = interpolate.interp1d(n_list, sn_list, kind='cubic')
            sn_list = f(n_list_interpolate)
            sn = sn_list[n-2]
        elif 150 < n and n <= 200:
            sn = 0.9914
        elif 200 < n and n<=300:
            sn = 0.9912
        else:
            sn = 0.9910
    else:
        sn = factor_data.loc[factor_data['n']==n]['sn']
    
    sn = float(sn)
    pairwise_mad = []
    for i in range(n):
        x_exclude = np.delete(x, np.where(x==x[i]))
        diff = np.abs(x_exclude - x[i])
        diff_med = np.median(diff)
        pairwise_mad.append(diff_med)
    
    pairwise_mad = np.array(pairwise_mad)
    pairwise_mad_med = np.median(pairwise_mad)
    scale = sn*pairwise_mad_med
            
    return scale

以上是关于Trimmed 稳健均值估计与 中位数-中位数配对偏差法估计标准差——理论与 Python 实现的主要内容,如果未能解决你的问题,请参考以下文章

简单稳健估计法——原理与 Python 实现

简单稳健估计法——原理与 Python 实现

用于估计统计中位数、众数、偏度、峰度的“在线”(迭代器)算法?

在python的MeanShift模块中估计带宽时如何选择合适的分位数?

概率论与数理统计小结9 - 参数估计概述

稳健性估计—— M 估计