fani
fani

Reputation: 13

Random samples from Lognormal distribution

I have a parameter X that is lognormally distributed with mean 15 and standard deviation 0.48. For monte carlo simulation in MATLAB, I want to generate 40,000 samples from this distribution. How could be done in MATLAB?

Upvotes: 1

Views: 1832

Answers (3)

SecretAgentMan
SecretAgentMan

Reputation: 2854

You can convert between the mean and variance of the Lognormal distribution and its parameters (mu,sigma) which correspond to the associated Normal (Gaussian) distribution using the formulas.

The approach below uses the Probability Distribution Objects introduced in MATLAB 2013a. More specifically, it uses the makedist, random, and pdf functions.

% Notation
% if X~Lognormal(mu,sigma) the E[X] = m & Var(X) = v
m = 15;     % Target mean for Lognormal distribution
v = 0.48;   % Target variance Lognormal distribution
getLmuh=@(m,v) log(m/sqrt(1+(v/(m^2))));
getLvarh=@(m,v) log(1 + (v/(m^2)));
mu = getLmuh(m,v);
sigma = sqrt(getLvarh(m,v));

% Generate Random Samples
pd = makedist('Lognormal',mu,sigma);
X = random(pd,1000,1);                  % Generates a 1000 x 1 vector of samples

Lognormal Histogram w/ PDF

You can verify the correctness via the mean and var functions and the distribution object:

>> mean(pd)
ans =
    15
>> var(pd)
ans =
    0.4800

Generating samples via the inverse transform is also made easy using the icdf (inverse CDF) function.

% Alternate way to generate X~Lognormal(mu,sigma)
U = rand(1000,1);       % U ~ Uniform(0,1)
X = icdf(pd,U);         % Inverse Transform

The graphic generated by following code (MATLAB 2018a).

Xrng = [0:.01:20]';
figure, hold on, box on
h(1) = histogram(X,'DisplayName','Random Sample (N = 1000)');
h(2) = plot(Xrng,pdf(pd,Xrng),'b-','DisplayName','Theoretical PDF');
legend('show','Location','northwest')
title('Lognormal')
xlabel('X')
ylabel('Probability Density Function')
% Options
h(1).Normalization = 'pdf';
h(1).FaceColor = 'k';
h(1).FaceAlpha = 0.35;
h(2).LineWidth = 2;

Upvotes: 0

Luis Mendo
Luis Mendo

Reputation: 112659

To generate an MxN matrix of lognornally distributed random numbers with parameter mu and sigma, use lognrnd (Statistics Toolbox):

result = lognrnd(mu,sigma,M,N);

If you don't have the Statistics Toolbox, you can equivalently use randn and then take the exponential. This exploits the fact that, by definition, the logarithm of a lognormal random variable is a normal random variable:

result = exp(mu+sigma*randn(M,N));

The parameters mu and sigma of the lognormal distribution are the mean and standard deviation of the associated normal distribution. To see how the mean and standard deviarion of the lognormal distribution are related to parameters mu, sigma, see lognrnd documentation.

Upvotes: 2

Daniel
Daniel

Reputation: 36710

To generate random samples, you need the inverted cdf. If you have done this, generating samples is nothing more than 'my_icdf(rand(n, m))'

First get the cdf (integrating the pdf) and then invert the function to get the inverted cdf.

Upvotes: 0

Related Questions