将对数正态均值和 SD 转换为正态均值和 SD

Transforming a Lognormal mean and SD into normal mean and SD

我有对数正态分布的均值和标准差。但是,为了从 python 中的对数正态分布提供样本,我需要将这些变量转换为基础正态分布的均值和标准差。

from numpy.random import seed
from numpy.random import normal
import numpy as np
mu = 25.2
sigma = 10.5
#pd.reset_option('display.float_format')
r = []
r = np.random.lognormal(mu, sigma, 1000)
for i in range(1000):
    while r[i] > 64 or r[i] < 4:
        y = np.random.lognormal(mu, sigma, 1)   
        r[i] = y[0]

df = pd.DataFrame(r, columns = ['Column_A'])
print(df)
sns.set_style("whitegrid", {'axes.grid' : False})
sns.set(rc={"figure.figsize": (8, 4)})
sns.distplot(df['Column_A'], bins = 70)

This is what I get

And this is what I want

但是,我不知道如何传递这些值

如果我对您的 post 的理解正确,您想要访问产生您的 log-normal 观察值的正态分布的基础 (mu sigma^2) 参数化?

TL;DR

假设您的 log-normal 观测值存储在 r:

mu = np.log(np.median(r))
var = 2*(np.log(np.mean(r)) - np.log(np.median(r)))
sd = np.sqrt(var)

理论部分

开始阅读 some statistics about log-normal distribution。似乎很难从 log-normal 样本的经验均值和方差中检索 (mu, sigma^2) ... 设 X 为 log-normal 随机变量并设 Y=ln(X)。看起来 Y 服从均值为 (mu, sigma^2) 的正态分布。设 MSX 的均值和方差。结果是:

M = exp(mu + sigma^2/2)
S = (exp(sigma^2) - 1) * exp(2*mu + sigma^2)

这很难得出 (mu, sigma^2).

的简单表达式

但是,根据 ,通过将方差 S 替换为中位数 Med 或众数 [=29],反转您的 (M, S) 系统会更容易=] 因为他们有一个更简单的表达式 wrt (mu, sigma^2):

Med = exp(mu)
Mode = exp(mu - sigma^2)

通过 Numpy 计算经验中位数会更容易,所以我们假设我们将在计算中使用它。倒置系统应导致 (mu, sigma^2) 的以下估计量:

mu = log(Med)
sigma2 = 2*(log(M) - log(Med))

Python 部分

假设您的 log-normal 观测值存储在您的 r 数组中:

mu = np.log(np.median(r))
var = 2*(np.log(np.mean(r)) - np.log(np.median(r)))
sd = np.sqrt(var)

quick-check 表明它很可能是正确的:

# random log-normal sample with (mu, sigma)=(1, 2)
r = np.random.lognormal(1, 2, size=(1000000))
# estimators
mu = np.log(np.median(r))
var = 2*(np.log(np.mean(r)) - np.log(np.median(r)))
sd = np.sqrt(var)

$> mu = 1.001368782773
$> sigma = 2.0024723139