Большинство функций для генерации логически нормально распределенных случайных чисел принимают среднее значение и стандартное отклонение соответствующего нормального распределения в качестве параметров.
Моя проблема в том, что я знаю только среднее значение и коэффициент вариации логнормального распределения. Достаточно просто получить нужные мне параметры для стандартных функций из того, что у меня есть:
Если mu
и sigma
являются средним и стандартным отклонением соответствующего нормального распределения, мы знаем, что
coeffOfVar^2 = variance / mean^2
= (exp(sigma^2) - 1) * exp(2*mu + sigma^2) / exp(mu + sigma^2/2)^2
= exp(sigma^2) - 1
Мы можем изменить это на
sigma = sqrt(log(coeffOfVar^2 + 1))
Мы также знаем, что
mean = exp(mu + sigma^2/2)
Это переставляет на
mu = log(mean) - sigma^2/2
Вот моя реализация R
rlnorm0 <- function(mean, coeffOfVar, n = 1e6)
{
sigma <- sqrt(log(coeffOfVar^2 + 1))
mu <- log(mean) - sigma^2 / 2
rlnorm(n, mu, sigma)
}
Хорошо работает при малых коэффициентах вариации
r1 <- rlnorm0(2, 0.5)
mean(r1) # 2.000095
sd(r1) / mean(r1) # 0.4998437
но не для больших значений
r2 <- rlnorm0(2, 50)
mean(r2) # 2.048509
sd(r2) / mean(r2) # 68.55871
Чтобы проверить, что это не специфичная для R проблема, я переопределил ее в MATLAB. (Использует набор инструментов статистики.)
function y = lognrnd0(mean, coeffOfVar, sizeOut)
if nargin < 3 || isempty(sizeOut)
sizeOut = [1e6 1];
end
sigma = sqrt(log(coeffOfVar.^2 + 1));
mu = log(mean) - sigma.^2 ./ 2;
y = lognrnd(mu, sigma, sizeOut);
end
r1 = lognrnd0(2, 0.5);
mean(r1) % 2.0013
std(r1) ./ mean(r1) % 0.5008
r2 = lognrnd0(2, 50);
mean(r2) % 1.9611
std(r2) ./ mean(r2) % 22.61
Та же проблема. Вопрос в том, почему это происходит? Это просто, что стандартное отклонение не является устойчивым, когда вариация настолько велика? Или я где-то облажался?