我正在从以下正态分布的子群体中进行300次重复随机抽样,样本大小为50(14 + 20 + 16):
sub_pop = [14, 20, 16]
mean_list = [100, 200, 300]
std_list = [40, 70, 80]
我的目标是通过300次重复随机采样来可视化该样本的样本中值的采样分布。
这就是我所做的:
groups = [{'label': 'sub_one', 'mean': 100, 'std_dev': 40, 'size': 14},
{'label': 'sub_two', 'mean': 200, 'std_dev': 70, 'size': 20},
{'label': 'sub_three', 'mean': 300, 'std_dev': 80, 'size': 16}]
def median(mean, std_dev):
data = np.random.normal(mean, std_dev) # indented function
get_median = np.median(data)
return get_median
group_all = []
for i in range(300):
for i in range(groups[0]['size']):
group_all.append(median(groups[0]['mean'], groups[0]['std_dev']))
for i in range(groups[1]['size']):
group_all.append(median(groups[1]['mean'], groups[1]['std_dev']))
for i in range(groups[2]['size']):
group_all.append(median(groups[2]['mean'], groups[2]['std_dev']))
sample = [abs(x) for x in group_all]
sns.distplot(sample, color = 'blue')
plt.show()
我的疑问是...我不太了解前4行代码。 python是否认识到我想从3个正态分布的子总体中随机抽取300个样本,并且每个子群体均以各自的均值和标准差正态分布? 非常感谢!
答案 0 :(得分:2)
函数本身和您的组创建都是正确的,但是存在一些小错误,还有一些可以做得更好的事情。
您可以按照自己的方式做,并在组大小上迭代中值函数。但是np.random.normal函数可以采用第三个参数。因此该功能可以重写
def median(mean, std_dev, size):
data = np.random.normal(mean, std_dev, size)
get_median = np.median(data)
return get_median
循环有点问题。您重复进行300次,等于进行300次所需的模拟,但是随后每个人都被添加到group_all中。不是我想您想要的每个人口的中位数。上面的函数中使用size参数对此进行了修复。
然后有两个具有相同变量名的嵌套循环。在这种情况下,它确实可以工作,但是这是不好的做法。不使用第一个for循环变量,因此最好将其称为_。另外,其他两个循环也位于第一个for循环之外,不会被迭代。循环可以更改为
groups_data = [[] for _ in range(3)]
for _ in range(300):
for i, group in enumerate(groups):
groups_data[i].append(median(group['mean'], group['std_dev'], group['size']))
您还可以在同一图中绘制多个组。只需将它们堆叠在plt.show()调用之前即可。
for group in groups_data:
sns.distplot(group)
plt.show()
我认为这段代码更加简洁,希望更接近于您想要实现的目标。祝你好运!