我在编写一个在Python中对样本应用统计自助法的函数时,提出了两种解决方案,一种是完全向量化的,另一种使用列表推导式。
import seaborn as snsimport numpy as npimport matplotlib.pyplot as pltsample = np.array([80,75,91,97,88,77,94])bs_sample_1 = np.random.choice(sample,size = (10000,7)).mean(axis = 1)bs_sample_2 = np.array([np.random.choice(sample,size = 7).mean() for i in range(10000)])plt.figure()sns.distplot(sample)plt.figure()sns.distplot(bs_sample_1)plt.figure()sns.distplot(bs_sample_2)
我对随机数生成器(RNG)的了解不多,但我不确定这两个操作是否同样有效地生成自助样本。
回答:
通常自助法是在拟合过程中应用的,而不是对单个数组。另外,你调用random.choice从7个元素的数组中选择7个元素,这有点没有意义。
在曲线拟合中应用自助法的方式如下:
- 给定n个样本(x,y),已知y的不确定性。y的不确定性可能由仪器提供,或者通过计算y的多次连续测量的标准差来计算。
- 使用某个函数进行拟合,例如f(x,a,b),其中a和b是我们想要提取的参数,拟合x和y的值。保存通过拟合过程获得的a和b的结果。
- 生成n个y*值的样本。每个y*使用与相应y相同均值的高斯分布生成,sigma值如第1点所给。(sigma值可能对于所有点相同,也可能根据相应的x值不同)。使用第2点描述的相同过程拟合x,y*的值,并保存通过拟合程序获得的参数a和b。
- 重复第3点的操作,重复次数根据需要(通常1000次或更多)。你将得到许多参数a和b的值。
- 此时,你可以说描述函数y = f(x,a,b)的最佳a-b值是之前获得的许多参数a和b的均值,你可以说它们的uncertainty由这些值的标准差给出。你还可以查看a和b的分布,并做出进一步的考虑。
在你的代码中,你只是多次计算数组中7个元素的平均值。但由于“平均值的平均值”就是整个数据集的平均值,你最终得到的是这7个元素的平均值(希望这有意义)。
理想情况下,自助法意味着你根据每个已知分布生成模拟数据,然后使用这些数据在每次不同的生成中计算某些量。然后你可以计算所得量的均值和标准差。