MATLAB Examples

EXAMPLE

This is an illustration of the generation of a non-gaussian random process based on a gaussian one. This method applies well for low skewness, and high kurtosis.

  • First, the gaussian-distributed sample x is created.
  • Then the non-gausian sample y is computed.
  • Finally a verification procedure is carried out.

Contents

Input

clear all;close all;clc
% Set the input
N = 1e6; % number of data point
m1 = 10; % mean  of x
m2 = 4; % variance of x
x = m1+sqrt(m2).*randn(1,N); % random gaussian vector of mean m1 and variance m2

% Target:
m3 = 0.5; % target skewness. NB: m3 is equal to 0 for a gaussian variable
m4 = 4 ; % target kurtosis. NB: m4 is equal to 3 for a gaussian variable

Computation

compute the new random variable y that is non-gaussian.

[y] = MBHTM(x,m3,m4);
applicability condition is verified 
4.49 >= m3^2 = 0.25 

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the default value of the function tolerance, and
the problem appears regular as measured by the gradient.



Verification

Let's compare m1, m2, m3, and m4 between x and y. In addition we see how it affects the distributions.

N.B. : The statistical toolbox may be required for the verification step, since I call the function "fitdist" inside "fitDistEtienne"

A good agreement between the computed and target m3 and m4 is observed.

% Gaussianity fit for x
Nbin = 500;
fitDistEtienne(x,Nbin,'normal');
set(gcf,'units','normalized','outerposition', [0.1 0.1 0.8 0.8])
set(gcf,'color','w')
xlabel(' x ');
ylabel('normalized pdf');
title(['m_1 = ',num2str(mean(x),2),...
    ', m_2 = ',num2str(var(x),2),...
    ', m_3 = ',num2str(skewness(x),2),...
    ', m_4 = ',num2str(kurtosis(x),2)]);
set(findall(gcf,'-property','fontSize'),'fontsize',20)


% Gaussianity fit for y
Nbin = 500;
fitDistEtienne(y,Nbin,'normal');
set(gcf,'units','normalized','outerposition', [0.1 0.1 0.8 0.8])
set(gcf,'color','w')
xlabel(' y ');
ylabel('normalized pdf');
title(['m_1 = ',num2str(mean(y),2),...
    ', m_2 = ',num2str(var(y),2),...
    ', m_3 = ',num2str(skewness(y),2),...
    ', m_4 = ',num2str(kurtosis(y),2)]);
set(findall(gcf,'-property','fontSize'),'fontsize',20)