for loop;样本中位数;重复随机抽样

问题描述 投票: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_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个样本的样本中位数的分布(3个不同的子组(2,5,7)组成14个样本,每个样本正常分布有自己的均值和标准差)。

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

python matplotlib plot statistics
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.