如何在Excel中创建遵循对数正态分布的随机数?

10

例如,要创建一个平均值为10,标准差为5的数据集,可以使用正态分布公式进行计算:

NORMINV(RAND(), Mean, Stdev)
NORMINV(RAND(), 10, 5)

这将产生大约从-5到25的数字,其频率分布看起来正常,大多数值都集中在平均值附近。

如何获得类似的数字集合,但让它们遵循对数正态分布,其中较大的数字具有更高的概率,而不会出现小于零的概率?

如何在不使用插件的情况下使用Excel实现此目标?

尝试过:

 LOGINV(RAND(), Mean, Stdev)
 LOGINV(RAND(), 10, 5)

不过,这会创建非常大的数字(如20的幂等),看起来毫无意义。

2个回答

11

对数正态分布是 e^N(m,s)。因此,使用您构建正态分布的方法,答案将是

=EXP( NORMINV(RAND(),Mean,Stdev) )

然而这将给出非常大的值。下一步是缩放均值和标准差。伪代码如下:

然而,这将会给您非常大的值。接下来的步骤是对均值和标准差进行缩放。伪代码如下:

scaled mean = ln( m^2 / sqrt( m^2 + s^2 ))
scaled sd = sqrt( ln(( m^2 + s^2 ) / m^2 )) 

我正在尝试运行一个蒙特卡洛模拟,从Excel生成的对数正态分布中提取数字。我理解第一个方程,但想知道为什么要缩放均值和标准偏差。谢谢。 - Joe D
5
我回答了我的问题。这篇来自SAS博客的文章解释了它。http://blogs.sas.com/content/iml/2014/06/04/simulate-lognormal-data-with-specified-mean-and-variance.html - Joe D

-1

我正在尝试按照上面的说明进行操作。如果我有任何错误,请告诉我。

Public Function LognormalRV(ByVal SampleMean As Double, ByVal SampleStDev As Double)
    'returns a random variable based on a lognormal distribution
    Dim ScaledMean As Double
    Dim ScaledStDev As Double
    ScaledMean = Log(SampleMean ^ 2 / Sqr(SampleMean ^ 2 + SampleStDev ^ 2))
    ScaledStDev = Sqr(Log((SampleMean ^ 2 + SampleStDev ^ 2) / SampleMean ^ 2))
    LognormalRV = WorksheetFunction.LogNorm_Inv(Rnd(), ScaledMean, ScaledStDev)
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接