将对数正态均值和 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)
理论部分
开始阅读 ref some statistics about log-normal distribution。似乎很难从 log-normal 样本的经验均值和方差中检索 (mu, sigma^2)
...
设 X
为 log-normal 随机变量并设 Y=ln(X)
。看起来 Y
服从均值为 (mu, sigma^2)
的正态分布。设 M
和 S
为 X
的均值和方差。结果是:
M = exp(mu + sigma^2/2)
S = (exp(sigma^2) - 1) * exp(2*mu + sigma^2)
这很难得出 (mu, sigma^2)
.
的简单表达式
但是,根据 ref,通过将方差 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
我有对数正态分布的均值和标准差。但是,为了从 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)
理论部分
开始阅读 ref some statistics about log-normal distribution。似乎很难从 log-normal 样本的经验均值和方差中检索 (mu, sigma^2)
...
设 X
为 log-normal 随机变量并设 Y=ln(X)
。看起来 Y
服从均值为 (mu, sigma^2)
的正态分布。设 M
和 S
为 X
的均值和方差。结果是:
M = exp(mu + sigma^2/2)
S = (exp(sigma^2) - 1) * exp(2*mu + sigma^2)
这很难得出 (mu, sigma^2)
.
但是,根据 ref,通过将方差 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