R: Iterative Generalized Method of Moments - IGMM

IGMM {LambertW} | R Documentation

## Iterative Generalized Method of Moments – IGMM

### Description

An iterative method of moments estimator to find this τ = (μ_x, σ_x, γ) for `type = 's'` (τ = (μ_x, σ_x, δ) for `type = 'h'` or τ = (μ_x, σ_x, δ_l, δ_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 γ or δ 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.

### Details

For algorithm details see the References.

### 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` | IGMM estimate for τ
`tau.trace` | entire iteration trace of τ^{(k)}, k = 0, ..., K, where `K <= max.iter`.
`sub.iterations` | number of iterations only performed in GMM algorithm to find optimal γ (or δ)
`iterations` | number of iterations to update μ_x and σ_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"`

### Author(s)

Georg M. Goerg

### See Also

`delta_GMM`, `gamma_GMM`, `analyze_convergence`

### Examples

    # 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)

[Package LambertW version 0.6.7 Index]