我从来没有上过统计学课程,所以我希望在正确的位置提问。
假设我仅具有两个数据描述正态分布:平均值和方差σ 2。我想使用计算机从此分布中随机抽样,以便我尊重这两个统计数据。
很明显,我可以通过简单地将0左右归一化来处理均值:在输出样本之前,只需将添加到每个样本即可。但我不明白如何以编程方式生成样本尊重σ 2。
我的程序将使用传统的编程语言。我无权访问任何统计数据包。
我从来没有上过统计学课程,所以我希望在正确的位置提问。
假设我仅具有两个数据描述正态分布:平均值和方差σ 2。我想使用计算机从此分布中随机抽样,以便我尊重这两个统计数据。
很明显,我可以通过简单地将0左右归一化来处理均值:在输出样本之前,只需将添加到每个样本即可。但我不明白如何以编程方式生成样本尊重σ 2。
我的程序将使用传统的编程语言。我无权访问任何统计数据包。
Answers:
如果可以从均值为0的给定分布,方差为1样,然后可以对从一个容易样品尺度位置变换该分布的,其具有平均和方差σ 2。如果X是一个样品从一个均值为0,方差为1的分布则 σ X + μ 是均值的样本μ和方差σ 2。因此,您要做的就是在加上平均值μ之前,按标准偏差σ(方差的平方根)对变量进行缩放。
如何从均值为0和方差为1的正态分布中实际获得模拟是另一回事。知道如何实现这些事情很有趣,但是无论您是否使用统计软件包或编程语言,我都建议您获取并使用合适的函数或库来生成随机数。如果您需要有关使用哪种库的建议,则可能要添加有关所使用的编程语言的特定信息。
编辑:根据评论,其他答案以及Fixee接受此答案的事实,我将提供更多有关如何使用统一变量的转换来产生正态变量的详细信息。
归根结底,正确实施的方法并不比使用的统一伪随机数生成器好。就个人而言,我更喜欢依靠我认为值得信赖的特殊用途的库。我几乎总是依赖直接在R中或通过C / C ++中的API在R中实现的方法。显然,这并不是所有人的解决方案,但是我对其他库不够熟悉,无法推荐替代方法。
这实际上是对Michael Lew的回答和Fixee的评论,但由于我没有在此站点上的声誉发表评论,因此被发布为答案。
除了NRH的答案外,如果您仍然无法从“标准正态分布” N(0,1)生成随机样本,那么以下方法是一种很好且简单的方法(因为您提到的是没有统计信息包中,以下功能应以大多数标准编程语言提供)。
1.生成u和v为两个均匀地通过在范围分布的随机数,从-1到1
u = 2 r1 - 1
和v = 2 r2 - 1
2.计算w = u^2 + v^2
如果w> 1,则返回1
3.使用z= sqrt(-2ln(w)/w)
示例代码返回u * z和y = v * z 如下所示:
u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
z = sqrt((-2 * log(w)) / w);
x = u * z;
y = v * z;
}
然后使用MHR上面建议的方法从中获取随机偏差N(mu, sigma^2)
。
当人们将许多相似分布的随机值相加(我是说彼此相似)时,就会出现正态分布。如果将十个或更多均匀分布的随机值相加,则总和几乎是正态分布的。(如果您希望它更加正常,则添加十个以上,但十个就几乎可以满足所有用途。)
假设您的均匀随机值均匀地分布在0和1之间。那么总和将介于0和10之间。从总和中减去5,结果分布的平均值将为0。现在,将结果除以标准差(接近)正态分布,然后将结果乘以所需的标准偏差。不幸的是,我不确定十个均匀随机偏差之和的标准偏差是多少,但是如果幸运的话,有人会在评论中告诉我们!
我倾向于用这些术语与学生讨论正态分布,因为在许多系统中假设正态分布的效用完全源于许多随机影响之和导致正态分布的性质。