【问题标题】:Formula for partial expectation in scipy lognormscipy lognorm中的部分期望公式
【发布时间】:2021-07-17 17:23:40
【问题描述】:

我刚刚尝试将对数正态分布的 scipy 输出与wikipedia 上的公式相匹配。

而且我被困在具有下限的部分期望上。

如果我使用这个简单的对数正态分布:

k = .25
sigma = .5
mu = .1 # from the logged variable
lnorm = scist.lognorm(s=sigma, scale=np.exp(mu))

其中 k 是下限,

据我了解,部分期望由以下公式给出:

很好。所以我们只是在讨论对数正态分布的平均值和具有 z 分数的 CDF。 scipy 提供了部分

lnorm.expect(lambda x:x, lb=k)
>>> 1.25199...

确实,我们可以通过根据条件期望检查它来确认这是部分。直接计算或使用上面的部分产生相同的结果:

 lnorm.expect(lambda x:x, lb=k) / (1 - lnorm.cdf(k))
 >>> 1.25385... 
 lnorm.expect(lambda x:x, lb=k, conditional=True)
 >>> 1.25385...

但是,scipy 的 cdf 函数采用 x 变量,而不是 z 分数,我不确定如何转换它:

转换为x 值。我尝试了很多不同的口味。

我本来以为:

可以解决当 scipy 的 cdf(大概)在内部计算 z 分数时必须减去 mu 的问题。

我使用的任何公式都以非常小的值或 0 结束。

任何帮助将不胜感激。

【问题讨论】:

  • 对不起,我不清楚你的问题到底是什么。您想使用公式计算带有def 的部分期望吗?

标签: python python-3.x scipy scipy.stats


【解决方案1】:

IIUC,您可以简单地计算 (mu+sigma^2-ln(k))/2 中的正态分布 N(0,1) 的 CDF,即

import numpy as np
import scipy.stats as sps

def partial_expectation(mu, sigma, k):
    """
    Returns partial expectation given
    mean, standard deviation and k.
    
    https://en.wikipedia.org/wiki/Log-normal_distribution
    """
    # compute cumulative density function
    # of Normal distribution N(0,1) in x=x_phi
    x_phi = (mu + sigma**2 - np.log(k))/sigma
    phi = sps.norm.cdf(x_phi, loc=0, scale=1)
    # mean of lognormal
    lognorm_mu = np.exp(mu + .5*(sigma**2))
    # result
    return lognorm_mu * phi

k = .25
sigma = .5
mu = .1 # from the logged variable
lnorm = sps.lognorm(s=sigma, scale=np.exp(mu))

print('from def:', partial_expectation(mu, sigma, k))
print('from sps:', lnorm.expect(lb=k))

from def: 1.251999952174895
from sps: 1.2519999521748952

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多