Learn R Programming

LambertW (version 0.6.4)

IGMM: Iterative Generalized Method of Moments -- IGMM

Description

An iterative method of moments estimator to find this \(\tau = (\mu_x, \sigma_x, \gamma)\) for type = 's' (\(\tau = (\mu_x, \sigma_x, \delta)\) for type = 'h' or \(\tau = (\mu_x, \sigma_x, \delta_l, \delta_r)\) for type = "hh") which minimizes the distance between the sample and theoretical skewness (or kurtosis) of \(\boldsymbol x\) and X.

This algorithm is only well-defined for data with finite mean and variance input X. See analyze_convergence and references therein for details.

Usage

IGMM(y, type = c("h", "hh", "s"), skewness.x = 0, kurtosis.x = 3,
  tau.init = get_initial_tau(y, type), robust = FALSE,
  tol = .Machine$double.eps^0.25, location.family = TRUE,
  not.negative = NULL, max.iter = 100, delta.lower = -1,
  delta.upper = 3)

Arguments

y

a numeric vector of real values.

type

type of Lambert W \(\times\) F distribution: skewed "s"; heavy-tail "h"; or skewed heavy-tail "hh".

skewness.x

theoretical skewness of input X; default 0 (symmetric distribution).

kurtosis.x

theoretical kurtosis of input X; default 3 (Normal distribution reference).

tau.init

starting values for IGMM algorithm; default: get_initial_tau. See also gamma_Taylor and delta_Taylor.

robust

logical; only used for type = "s". If TRUE a robust estimate of asymmetry is used (see medcouple_estimator); default: FALSE.

tol

a positive scalar specifiying the tolerance level for terminating the iterative algorithm. Default: .Machine$double.eps^0.25

location.family

logical; tell the algorithm whether the underlying input should have a location family distribution (for example, Gaussian input); default: TRUE. If FALSE (e.g., for "exp"onential input), then tau['mu_x'] = 0 throughout the optimization.

not.negative

logical; if TRUE, the estimate for \(\gamma\) or \(\delta\) is restricted to non-negative reals. If it is set to NULL (default) then it will be set internally to TRUE for heavy-tail(s) Lambert W\( \times\) F distributions (type = "h" or "hh"). For skewed Lambert W\( \times\) F (type = "s") it will be set to FALSE, unless it is not a location-scale family (see get_distname_family).

max.iter

maximum number of iterations; default: 100.

delta.lower, delta.upper

lower and upper bound for delta_GMM optimization. By default: -1 and 3 which covers most real-world heavy-tail scenarios.

Value

A list of class LambertW_fit:

tol

see Arguments

data

data y

n

number of observations

type

see Arguments

tau.init

starting values for \(\tau\)

tau

IGMM estimate for \(\tau\)

tau.trace

entire iteration trace of \(\tau^{(k)}\), \(k = 0, ..., K\), where K <= max.iter.

sub.iterations

number of iterations only performed in GMM algorithm to find optimal \(\gamma\) (or \(\delta\))

iterations

number of iterations to update \(\mu_x\) and \(\sigma_x\). See References for detals.

hessian

Hessian matrix (obtained from simulations; see References)

call

function call

skewness.x, kurtosis.x

see Arguments

distname

a character string describing distribution characteristics given the target theoretical skewness/kurtosis for the input. Same information as skewness.x and kurtosis.x but human-readable.

location.family

see Arguments

message

message from the optimization method. What kind of convergence?

method

estimation method; here: "IGMM"

Details

For algorithm details see the References.

See Also

delta_GMM, gamma_GMM, analyze_convergence

Examples

Run this code
# NOT RUN {
# estimate tau for the skewed version of a Normal
y <- rLambertW(n = 1000, theta = list(beta = c(2, 1), gamma = 0.2), 
               distname = "normal")
fity <- IGMM(y, type = "s")
fity
summary(fity)
plot(fity)

# estimate tau for the skewed version of an exponential
y <- rLambertW(n = 1000, theta = list(beta = 1, gamma = 0.5), 
               distname = "exp")
fity <- IGMM(y, type = "s", skewness.x = 2, location.family = FALSE)
fity
summary(fity)
plot(fity)

# estimate theta for the heavy-tailed version of a Normal = Tukey's h
y <- rLambertW(n = 500, theta = list(beta = c(2, 1), delta = 0.2), 
               distname = "normal")
system.time(
fity <- IGMM(y, type = "h")
)
fity
summary(fity)
plot(fity)

# }

Run the code above in your browser using DataLab