How to generate random samples of generalized t-distribution?

15 views (last 30 days)
Generating student's t distribution has already been supported in MATLAB. For example, to generate 100 million samples of t-distribution with shape parameter and scale parameter , we can simply use
nu = 3; % shape parameter
sigma = 10; % scaling parameter
samples = sigma*trnd(nu,[1,1e8]);
I would like to know how I can likewise generate generalized t-distribution samples, given values p, q, σ and its pdf
Thanks in advance.

Accepted Answer

Lu Sun
Lu Sun on 20 Sep 2021
Edited: Lu Sun on 20 Sep 2021
Ok... I found a solution myself. Thought it is not an efficient program, it works.
This program uses R engine and R package "sgt" to generate skewed generalized t-distribution samples. The MATLAB program calls the R program during its progression.
As pre-requisite, install R and R packages "optimx", "numDeriv" and "sgt". Also add "Rscript.exe", which shall come with the R installation, to the system PATH.
Next, put the following files under the same directory.
generate_sgt.m
function op = generate_sgt(mu, sigma, lambda, p, q, nx, ny, seed)
%% generate_sgt Skewed generalized t-distribution pseudorandom numbers.
% op = generate_sgt(mu, sigma, lambda, p, q, nx, ny, seed) returns an
% nx-by-ny matrix containing psedorandom values drawn from the skewed
% generalized t-distribution, with mean (mu), scale parameter (sigma),
% skewness (lambda), shape parameters (p,q).
%
% R engine and r package "sgt" (v2.0) is used to generate the numbers.
%%
num_of_rand = nx*ny;
if num_of_rand > 1e6
error("The number of random variables generated each time cannot exceed 1e6.")
end
if strcmp(seed, 'default')
seed = 0;
elseif strcmp(seed, 'random')
seed = randi([1,10000]);
end
generate_sgt_parameters = [mu, sigma, lambda, p, q, num_of_rand, seed];
writematrix(generate_sgt_parameters, 'generate_sgt_parameters.csv')
!Rscript.exe ./r_generate_sgt.r
generate_sgt_data = readmatrix('generate_sgt_data.csv');
op = reshape(generate_sgt_data, [nx, ny]);
end
r_generate_sgt.r
# Read parameters
generate_sgt_parameters <- read.csv('generate_sgt_parameters.csv', header = FALSE)
sgt_mu <- generate_sgt_parameters[,1]
sgt_sigma <- generate_sgt_parameters[,2]
sgt_lambda <- generate_sgt_parameters[,3]
sgt_p <- generate_sgt_parameters[,4]
sgt_q <- generate_sgt_parameters[,5]
sgt_n <- generate_sgt_parameters[,6]
sgt_seed <- generate_sgt_parameters[,7]
# Generate pseudo random numbers
library('optimx')
library('numDeriv')
library('sgt')
set.seed(sgt_seed)
x = rsgt(n = sgt_n, mu = sgt_mu, sigma = sgt_sigma, lambda = sgt_lambda, p = sgt_p, q = sgt_q, mean.cent = TRUE, var.adj = FALSE)
# Write data
write.table(x, 'generate_sgt_data.csv', sep=",", row.names = FALSE, col.names=FALSE)
Now you can generate skewed generalized t-distribution samples by running, say,
X = generate_sgt(0, sqrt(2), 0, 100, 1e6, 1 ,10000, 'default'); % Uniform
Y = generate_sgt(0, sqrt(2), 0, 1, 1e6, 1 ,10000, 'default'); % Laplace
Z = generate_sgt(0, sqrt(2), 0, 2, 1e6, 1 ,10000, 'default'); % Gaussian

More Answers (0)

Categories

Find more on Random Number Generation in Help Center and File Exchange

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!