How to generate random samples of generalized t-distribution?

3 Ansichten (letzte 30 Tage)
Lu Sun
Lu Sun am 18 Sep. 2021
Bearbeitet: Lu Sun am 20 Sep. 2021
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.

Akzeptierte Antwort

Lu Sun
Lu Sun am 20 Sep. 2021
Bearbeitet: Lu Sun am 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

Weitere Antworten (0)

Kategorien

Mehr zu Random Number Generation finden Sie in Help Center und File Exchange

Produkte


Version

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by