TEllDistrEst {ElliptCopulas} | R Documentation |
Estimation of trans-elliptical distributions
Description
This function estimates the parameters of a trans-elliptical distribution which is a distribution whose copula is (meta-)elliptical, with arbitrary margins, using the procedure proposed in (Derumigny & Fermanian, 2022).
Usage
TEllDistrEst(
X, estimatorCDF = function(x){
force(x)
return( function(y){(stats::ecdf(x)(y) - 1/(2*length(x))) }) },
h, verbose = 1, grid, ...)
Arguments
X |
the matrix of observations of the variables |
estimatorCDF |
the way of estimating the marginal cumulative distribution functions.
It should be either a function that takes in parameter a vector of observations
and returns an estimated cdf (i.e. a function) or a list of such functions
to be applied on the data.
In this case, it is required that the length of the list should be the same
as the number of columns of |
h |
bandwidth for the non-parametric estimation of the density generator. |
verbose |
if 1, prints the progress of the iterations.
If 2, prints the normalizations constants used at each iteration,
as computed by |
grid |
grid of values on which to estimate the density generator |
... |
other parameters to be passed to |
Value
This function returns a list with three components:
-
listEstCDF
: a list of estimated marginal CDF given byestimatorCDF
; -
corMatrix
: the estimated correlation matrix: -
estEllCopGen
: the estimated generator of the meta-elliptical copula.
References
Derumigny, A., & Fermanian, J. D. (2022). Identifiability and estimation of meta-elliptical copula generators. Journal of Multivariate Analysis, article 104962. doi:10.1016/j.jmva.2022.104962.
Examples
cor = matrix(c(1, 0.5, 0.2,
0.5, 1, 0.8,
0.2, 0.8, 1), byrow = TRUE, nrow = 3)
grid = seq(0,10,by = 0.01)
g_d = DensityGenerator.normalize(grid, grid_g = exp(-grid), d = 3)
n = 10
# To have a nice estimation, we suggest to use rather n=200
# (around 20s of computation time)
U = EllCopSim(n = n, d = 3, grid = grid, g_d = g_d, A = chol(cor))
X = matrix(nrow = n, ncol = 3)
X[,1] = stats::qnorm(U[,1], mean = 2)
X[,2] = stats::qt(U[,2], df = 5)
X[,3] = stats::qt(U[,3], df = 8)
result = TEllDistrEst(X, h = 0.1, grid = grid)
plot(grid, g_d, type = "l", xlim = c(0,2))
lines(grid, result$estiEllCop$g_d_norm, col = "red")
print(result$corMatrix)
# Adding missing observations
n_NA = 2
X_NA = X
for (i in 1:n_NA){
X_NA[sample.int(n,1), sample.int(3,1)] = NA
}
resultNA = TEllDistrEst(X_NA, h = 0.1, grid = grid, verbose = 1)
lines(grid, resultNA$estiEllCopGen, col = "blue")