将@Risk中的对数正态和对数正态截断的模拟转换为Python

时间:2018-06-20 13:11:13

标签: python numpy

我已经完成了将Excel插件@Risk中的模拟转换为Python的任务。给定分布类型和mu,sigma或高低值,这些功能与numpy的随机数模拟紧密结合。我正在做的一个例子是here

在链接的示例中,mu = 2和sigma = 1。使用numpy,我得到的分布与@Risk相同。

dist = np.random.lognormal(2, 1, 1000)

但是,当我将numpy与以下参数一起使用时-我无法再复制@Risk分布。

mu = 0.4,@Risk中的sigma = 0.16: Histogram for 1000 rsamples

和在Python中: histogram for 1000 rsamples

对于相同的mu和sigma,结果是两个完全不同的分布。因此,我现在对numpy对mu和sigma输入的期望感到非常困惑。我已经阅读了链接here的文档,但是为什么会有一组参数给我匹配的分布,而另一组值却不能。

我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

再看看链接到的@RISK文档和numpy.random.lognormal的文档字符串。参数与numpy.random.lognormal匹配的@RISK函数为RiskLognorm2。 numpy.random.lognormalRiskLognorm2的参数是正态分布的平均值和标准偏差。换句话说,它们描述了数据的对数的分布。

@RISK文档解释了RiskLognorm的参数是对数正态分布本身的均值和标准分布。给出了在两种参数化分布方法之间进行转换的公式。

如果您确定@RISK代码中的参数正确,则必须将这些参数转换为numpy.random.lognormal使用的格式。给定值meanstddev作为RiskLognorm使用的参数,您可以获取mu的参数sigmanumpy.random.lognormal,如下所示:

sigma_squared = np.log((stddev/mean)**2 + 1)
mu = np.log(mean) - 0.5*sigma_squared
sigma = np.sqrt(sigma_squared)

例如,假设均值和标准差。开发。的分布是

In [31]: mean = 0.40

In [32]: stddev = 0.16

计算musigma

In [33]: sigma_squared = np.log((stddev/mean)**2 + 1)

In [34]: mu = np.log(mean) - 0.5*sigma_squared

In [35]: sigma = np.sqrt(sigma_squared)

使用numpy.random.logormal生成样本,并检查其统计信息:

In [36]: sample = np.random.lognormal(mu, sigma, size=1000)

In [37]: np.mean(sample)
Out[37]: 0.3936244646485409

In [38]: np.std(sample)
Out[38]: 0.16280712706987954

In [39]: np.min(sample), np.max(sample)
Out[39]: (0.1311593293919604, 1.7218021130668375)
相关问题