使用scipy.stats.linregress中的标准误差生成线性拟合样本

k0pti3hp  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(225)

我使用scipy.stats.linregress来拟合一组点,如下图所示。点是蓝色的圆圈,线性拟合是黑色的线,灰色的线是使用stderrintercept_stderr的值来采样slopeintercept的值(代码如下)。

我的问题是:假设stderrintercept_stderr是 * 标准误差 *,而numpy.random.normal期望 * 标准差 *,那么在采样时,我应该将stderrintercept_stderr乘以$\sqrt{N}$吗?

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

x = np.array([-4.12078708, -3.89764352, -3.77248038, -3.66125475, -3.56117129,
       -3.47019951, -3.3868179 , -3.30985686, -3.2383979 , -3.17170652,
       -3.10918616, -3.05034566, -2.99477581, -2.94213208, -2.89212166,
       -2.84449361, -2.79903124, -2.75554612, -2.71387343, -2.67386809,
       -2.63540181, -2.59836054, -2.56264246, -2.52815628, -2.49481986,
       -2.462559  , -2.43130646, -2.40100111, -2.37158722, -2.34301385,
       -2.31523428, -2.28820561, -2.2618883 , -2.23624587, -2.21124457,
       -2.18685312, -2.16304247, -2.13978561, -2.11705736, -2.09483422,
       -2.07309423, -2.05181683, -2.03098275, -2.01057388])
y = np.array([10.54683181, 10.37020828, 10.93819231, 10.1338195 , 10.68036321,
       10.48930797, 10.2340761 , 10.52002056, 10.20343913, 10.29089844,
       10.36190947, 10.26050936, 10.36528216, 10.41799894, 10.40077834,
       10.2513676 , 10.30768792, 10.49377725,  9.73298189, 10.1158334 ,
       10.29359023, 10.38660209, 10.30087358, 10.49464606, 10.23305099,
       10.34389097, 10.29016557, 10.0865885 , 10.338077  , 10.34950896,
       10.15110388, 10.33316701, 10.22837808, 10.3848174 , 10.56872297,
       10.24457621, 10.48255182, 10.39029786, 10.0208671 , 10.17400544,
        9.82086658, 10.51361151, 10.4376062 , 10.18610696])

res = stats.linregress(x, y)

s_vals = np.random.normal(res.slope, res.stderr, 100)
i_vals = np.random.normal(res.intercept, res.intercept_stderr, 100)
for i in range(100):
    plt.plot(x, i_vals[i] + s_vals[i]*x, c='grey', alpha=.1)

plt.scatter(x, y)
plt.plot(x, res.intercept + res.slope*x, c='k')
plt.show()
kninwzqo

kninwzqo1#

TL;DR的名称

实际上,它是标准差的估计值,因为 * 标准误差 * 意味着 * 特定参数的误差的标准差 *。不,不需要通过乘以np.sqrt(n)来“反归一化”。但是,最后,您可能需要使用t-distribution的分布来更改从中对模拟参数进行采样的分布。

定性解释

无进一步乘法(例如,np.sqrt(n)),也就是说,标准化保持不变。为什么?直观地说,斜率和截距参数在某种意义上是由 xy 对组成的数据集的汇总统计量。它们将数据集作为一个整体来表征,而不是像 * 这样的单对点(x_i,y_i)。类似于对汇总统计量进行抽样(例如x上的平均值),我们使用标准差的归一化估计量。在回归的情况下,数据集中所有数据点的平均变异性影响所得截距的估计变异性。样本量的平方根仅平衡了数据点相对于其绝对数的变异性总和。
一个更严格的解释是关于估计量的方差-协方差矩阵(β^)。其中,沿着对角线的元素的平方根是估计量元素的标准误差。特别地,对角线上第一个元素的平方根表示截距参数的标准误差。通过一点线性代数,可以在每个参数标准误差之间建立联系由于回归模型的标准误差 s 是数据中噪声的标准差 * σ
的渐近无偏估计值,因此,回归模型的标准误差 s 是数据中噪声的标准差 σ 的渐近无偏估计值。可以建立定量的基本原理而不需要截距的标准误差的重新定标。
关于从中抽样/模拟截距和斜率的分布。标准误差遵循(Student 's)t分布,而不是正态分布。请参阅slide 18

s_vals = np.random.standard_t(df=len(x)-2, size=100) * res.stderr + res.slope
i_vals = np.random.standard_t(df=len(x)-2, size=100) * res.intercept_stderr + res.intercept

然而,当样本量超过 n=30 时,与从高斯分布中采样的样本相比,这些实现在统计上几乎是不可区分的,这是因为t分布收敛到标准正态分布的速度相当快。

视觉解释

不过,我们可以跳过定量的论证。我们对基于数据集的估计值有什么期望?我们拥有的数据越多,我们对固定但未知的位置就越确定。反过来,如果我们增加数据的大小 n,模拟的灰线应该更靠近。当我们使用标准误差作为scale参数时,会发生这种情况。将样本大小增加14倍会使灰线更接近。相反,使用标准误差乘以np.sqrt(n)会使灰线距离相等,即使数据集大小急剧增加。实际上,通过乘以 n 的平方根,我们正好抵消了较高样本大小的优势。

相关问题