scipy 对数范数中的部分期望公式
Formula for partial expectation in scipy lognorm
我一直在尝试将对数正态分布的 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 的值结束。
如有任何帮助,我们将不胜感激。
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
我一直在尝试将对数正态分布的 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 的值结束。
如有任何帮助,我们将不胜感激。
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