Lognormal分布的随机样本

时间:2014-05-24 12:09:49

标签: matlab random statistics distribution

我有一个参数X,它是对数正态分布的,平均值为15,标准差为0.48。对于MATLAB中的蒙特卡罗模拟,我想从这个分布中生成40,000个样本。如何在MATLAB中完成?

3 个答案:

答案 0 :(得分:2)

要使用参数MN生成mu x sigma矩阵的日志分布随机数,请使用lognrnd(统计工具箱):

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

如果您没有统计工具箱,则可以等效地使用randn,然后取指数。根据定义,对数正态随机变量的对数是一个正态的随机变量:

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

对数正态分布的参数musigma是相关正态分布的均值和标准差。要了解对数正态分布的均值和标准偏差如何与参数musigma相关,请参阅lognrnd documentation

答案 1 :(得分:0)

要生成随机样本,您需要反转cdf。如果你这样做了,生成样本只不过是' my_icdf(rand(n,m))'

首先获取cdf(集成pdf),然后反转函数以获得反转的cdf。

答案 2 :(得分:0)

您可以使用formulas在对数正态分布的均值和方差及其参数(mu,sigma)之间进行转换,该参数对应于关联的正态(高斯)分布。

以下方法使用了MATLAB 2013a中引入的概率分布对象。更具体地说,它使用makedistrandompdf函数。

% 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

您可以通过meanvar函数以及分发对象来验证正确性:

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

使用icdf(逆CDF)功能,通过inverse transform生成样本也很容易。

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

由以下代码生成的图形(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;