循环样本中位数重复随机抽样

时间:2018-09-16 15:33:21

标签: python matplotlib plot statistics

repeat = 50
samplesize = 14
samplesize_list = [2, 5, 7] 
std_list = [10, 20, 30]
mean_list = [1000, 2000, 3000]

repeat_median = np.empty(repeat, dtype = float)
for j in range(len(samplesize_list)):
    size = samplesize_list[j]
    for z in range(len(std_list)):
        std_list = std_list[z]
        for m in range(len(mean_list)):
            mean_list = mean_list[m]
            for i in range(repeat):
                sample_data = np.random.normal(mean_list, std_list, size)
                repeat_median[i] = np.median(sample_data)
    plt.subplot(len(samplesize_list), 1, j+1)
    sns.distplot(repeat_median, color = 'blue')
    plt.legend(loc = "upper right")
    plt.show()

我的代码中的for循环有点问题。我正在尝试使用50个不同结果的重复随机抽样来找到样本中位数的样本分布。因此,我应该只有一张图来显示14个样本的样本中位数的分布(组成14个样本的3个不同的子组(2、5、7)分别以各自的均值和标准差正态分布)。 / p>

例如:总体2的子群正态分布为标准偏差10,平均值为1000。总体5的子群正态分布为标准偏差20,平均值为2000,依此类推。在这种情况下,如何将它们循环在一起?

1 个答案:

答案 0 :(得分:1)

我最近在昨天用类似的输出回答了类似的问题。我不确定是否是您再次发布了它。尽管如此,在代码中定义变量还是有一些错误。以下是带有输出的工作版本。修改/添加的行带有注释#

repeat = 50
samplesize = 14
samplesize_list = [2, 5, 7] 
std_list = [10, 20, 30]
mean_list = [1000, 2000, 3000]

repeat_median = np.empty(repeat, dtype = float)
for j in range(len(samplesize_list)):
    size = samplesize_list[j]
    for z in range(len(std_list)):
        std = std_list[z] # modified, you used the same name as variable
        for m in range(len(mean_list)):
            mean = mean_list[m] # modified, you used the same name as variable
            for i in range(repeat):
                sample_data = np.random.normal(mean, std, size)
                repeat_median[i] = np.median(sample_data)
    plt.subplot(len(samplesize_list), 1, j+1)
    sns.distplot(repeat_median, color = 'blue', label='Size %d'%samplesize_list[j]) # added legend
    plt.legend(loc = "upper right")
plt.tight_layout() # added for better subplot adjustment

输出

enter image description here


使用列表推导的方式编写代码的详细方式

for j, size in enumerate(samplesize_list):
    for z, std in enumerate(std_list):
        for m, mean in enumerate(mean_list):
            for i in range(repeat):
                sample_data = np.random.normal(mean, std, size)
                repeat_median[i] = np.median(sample_data)