首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将日志正常和日志正常截断模拟转换为Python的@Risk

将日志正常和日志正常截断模拟转换为Python的@Risk
EN

Stack Overflow用户
提问于 2018-06-20 13:11:13
回答 1查看 738关注 0票数 0

我的任务是将Excel插件@Risk中的模拟转换为Python。这些函数与numpy的随机数模拟密切一致,给出了一种分布类型和mu、sigma或高低值。我正在做的一个例子是这里

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

代码语言:javascript
复制
dist = np.random.lognormal(2, 1, 1000)

但是,当我使用numpy与以下参数-我不能再复制@Risk分布。

mu=0.4,sigma=0.16 in @Risk:1000 r样本直方图

在Python中:1000 r样本直方图

结果是,对于相同的mu和sigma,两个完全不同的分布。所以我现在很困惑于numpy对mu和sigma输入的期望是什么。我已经阅读了docs链接的这里,但是为什么一组参数会给出匹配的发行版,而另一组值则不会。

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-19 15:48:32

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

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

如果您确信@RISK代码中的参数是正确的,则必须将这些参数转换为numpy.random.lognormal使用的表单。给定meanstddev作为RiskLognorm使用的参数的值,您可以获得numpy.random.lognormal的参数musigma,如下所示:

代码语言:javascript
复制
sigma_squared = np.log((stddev/mean)**2 + 1)
mu = np.log(mean) - 0.5*sigma_squared
sigma = np.sqrt(sigma_squared)

例如,假设平均值和std。dev.的分布是

代码语言:javascript
复制
In [31]: mean = 0.40

In [32]: stddev = 0.16

计算musigma

代码语言:javascript
复制
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生成一个示例,并检查其统计信息:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50949089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档