# LambertW Update History

* only complete starting with version 0.2.9.7

## Future TODOs

* **knitr** vignettes will be added in upcoming releases.
* always: add more distributions by default
* eventually convert the Lambert W toolkit to reference classes, rather than S3 classes

## v0.6.2

### New

* rewrote a couple of functions in C++ using the amazing (!) **Rcpp** package.
  3-4x speed up for `W` related functions; also for `IGMM` and `MLE_LambertW`

* added bootstrap functions for users to easily check if a Lambert W x F distribution with finite mean and variance input makes sense:
  * `bootstrap.LambertW_fit`
  * `analyze_convergence`

* added `use.mean.variance` argument to distinguish between mean-variance 
  Lambert W x F distributions and general location-scale Lambert W x F 
  distributions. See also Goerg (2015b).  See the help file on these functions for references on why they were included.

* added more unit tests (moving code from "Examples" to unit tests)

### Minor changes

* revised the manual to reflect changes in recent R package dependencies 
* `theta` argument in the `dpqr` function becomes the recommended argument to 
  specify the distribution.  `alpha`, `beta`, `gamma`, `delta` now give 
  warnings and will be deprecated in future versions.
* added third order approximation in `gamma_Taylor` for better initial estimates.
* added dependency on **Rcpp**
* removed dependency of **moments** package, and made **Rcpp** versions of `skewness()` and `kurtosis()` instead directly in **LambertW**.

## v0.6.0

### New

* moved from **gsl** to **lamW** R package: the Lambert W implementation is ~4x faster than for **gsl**. Needless to say that this will also speed up many computations in the **LambertW** package. Thank you [Avraham Adler](http://www.avrahamadler.com/2015/05/26/lamw-package-cran/) for the **lamW** package.

* new functions:
  * `deriv_xexp()`
  * `normalize_by_tau()`
  * `log_deriv_W()`

* lots of performance improvements (not only due to **lamW** package). Leads to
  2-3x faster estimation via IGMM or MLE overall.

* added (first iteration) of unit tests using the **testthat** package

### Minor changes

* added recommended packages to `NAMESPACE` following new CRAN policies
* set `from = 0` in `plot.LambertW_fit` for scale families with all positive values.
* `get_distname_family` returns a third logical entry `non.negative` to 
  check whether a distribution is for non-negative random variables (e.g.,
  exponential or Gamma).
* `loglik_penalty` loses the "distname" argument, but gains the
  "is.non.negative" argument.
* replaced all `any(is.na(...))` with `anyNA(...)` (small speedups)
* made `deriv_W` faster and more precise using a log transform first and 
  using mathematial identities of the derivative of W, its derivative, and
  logarithm.
* made "optimize" the default optimizer in `delta_GMM` and `gamma_GMM`
  (it's about 30% faster than "nlm")

### Bug fixes

* `delta_GMM`: for `delta` too large (`>1e100`) the backtransformed data `u` would 
  become negligibly small and numerically a constant (`1e-100`); thus 
  `kurtosis()` estimate would be `NaN`, which resulted in stop of `nlm`
  function in `delta_GMM`. Added an `NA` check and returned large value
  for objective function, for `nlm()` to search for a better `delta`.
  backtransformed
* `get_initial_theta`: if initial estimates of `gamma` are too extreme, then 
  the backtransformed input data for X contains `NA`. This caused an error
  in `estimate_beta()`.  Now `NA`s are removed before passing `x.init` 
  to `estimate_beta()` 
* `log_W(Inf)` returned `NA`; fixed to return `Inf`.
* `qLambertW()` didn't compute correct quantiles for non-negative distributions
  (e.g., `"exp"` or `"gamma"`) and `type = "s"`; replaced now with closed form
  expressions.

### Deprecated

See also `?deprecated-function`:

* `H()`: use `xexp()` instead

## v0.5.1

### New

### Bug fixes
- `data` input to `Gaussianize()` does not have to have `colnames`; will 
  be assigned by default if `colnames(data) = NULL`
- fixed bug in `mLambertW` which ignored `delta` values passed via `theta`

### Deprecated

Several deprecated functions (see also `?deprecated-function`):

* `normfit()`: use `test_normality()` (or short `test_norm()`) instead

### Minor changes

- Updated citation with "The Scientific World Journal: Probability and    Statistics with Applications in Finance and Economics. Available at
  [http://www.hindawi.com/journals/tswj/aa/909231/](http://www.hindawi.com/journals/tswj/aa/909231/)"
- added `grid` to `test_normality` (previously known as `normfit`)
- added a "^2" to the N(mu, sigma^2) of the legend; now its clear that the
  displayed value is the standard deviation, not the variance.

## v0.5

Version 0.5 is a long awaited - big - update to the **LambertW** package. 
That's why it's a big bump from 0.2.9.9 to 0.5.

It has lots of improved code, bug fixes, more user friendly function (names) 
and implementation, more explicit error checking and meaningful error messages, etc.

Definitely check out the new manual - it has been reviewed *very* thoroughly.

### New

* code and documentation is now in Roxygen style (thanks **Rd2roxygen** and **roxygen2**!)
* `W()` (and related functions) gained a `branch` argument (see also deprecated functions below).
* `Gaussianize()` gained several new arguments that allow to do the inverse 
  ''DeGaussianization'' as well. See `?Gaussianize` for details.
* several new functions (I probably forgot some):
    * `check_beta()`
    * `check_distname()`
    * `check_tau()`
    * `deriv_W_gamma()`
    * `estimate_beta()`
    * `get_distname_family()`
    * `get_distnames()`
    * `get_gamma_bounds()`
    * `get_initial_tau()`
    * `get_output()` (due to popular demand)
    * `log_W()`
    * `tau2theta()`
* added - this very - `NEWS` file
* added `CITATION` file.  See citation information with `citation("LambertW")`
* added F distribution; called "f", not "F" (to avoid confusion with `FALSE`).
* Use list `theta` as argument in functions instead of `alpha`, `beta`, `gamma`, or
  `delta`. Passing the elements as single arguments still works, but using 
  `theta = list(beta = ..., gamma = ..., delta = ..., alpha = ...)` is preferred.
  In future versions the `alpha`, `beta`, `gamma`, and `delta` arguments will be deprecated.

### Bug fixes, minor changes & minor improvements

* `normfit()`:
    * produces less ink plots
    * ACF plot does not show the non-informative lag 0 estimate (it's always $\hat{\rho}(0) = 1$); 
      improves y-axis scale for higher-order lags.
    * if sample size $>5,000$ it will subsample it so Normality tests still work.
* more error checking and much more meaningful error messages.
* following more closely [Google's R style guide](https://google-styleguide.googlecode.com/svn/trunk/Rguide.xml) (with some of [Hadley Wickham's guide](http://r-pkgs.had.co.nz/style.html) too)
     * use underscore `_` as separator in function names
     * changed assignments from `=` to `<-`
     * changed variable names with underscore `_` to `.` (unless it `_` helps understanding; e.g.,  
       `mu_y` reminds of `mu` with the `y` subscript in LaTeX / pdf)
     * start function names with verbs as much as possible (e.g., `get_initial_theta()` instead of `starting_theta()`; `get_support()` instead of `support()`)
* Removed **nortest** package dependency; *suggest* only. Since `normfit` is often called for visual checks only, I made the normality tests optional. They are called if the **nortest** package is available (`require(nortest) == TRUE`); otherwise
  it just returns `NA`.  This is useful in case users do not have the **nortest** package available 
  in their R installation.
* fixed bug in `qU()` and `pU()`: incorrect usage of standard deviation vs scale in t distribution (`dU()` and thus log-likelihood was correct).
* `ks.test.t` now uses the scale parameter, rather than standard deviation.  This now 
  allows to test also if degrees of freedom < 2.
* `MLE_LambertW` changed the `estimate.only` argument to `return.estimate.only`.

### Deprecated

Several deprecated functions (see also `?deprecated-function`):

* `beta_names()`: use `get_beta_names()`
* `bounds_theta()`: use `get_theta_bounds()`
* `d1W()` and `d1W_1()`: use `deriv_W(..., branch)`.
* `d1W_delta()`, `d1W_delta_alpha()`: use `deriv_W_delta()` and `deriv_W_delta_alpha()`.
* `get.input()`: use `get_input()`
* `p_1()`: use `p_1m()` 
* `params2theta()`: use `unflatten_theta()`
* `skewness_test()`: use `test_symmetry()`
* `starting_theta()`: use `get_initial_theta()`
* `support()`: use `get_support()`
* `theta2params()`: use `flatten_theta()`
* `vec.norm()`: use `lp_norm()`
* `W_1()`: use `W(z, branch = -1)`; similarly for `W_gamma_1()`
* `W_2delta_alpha()`: use `W_2delta_2alpha()`.
* `W_gamma_1()`: use `W_gamma(..., branch = -1)`.

### Removed

* `G()` since it was never used. If you need it use `G_delta(z, delta = 0)`.
* `MLE_LambertW_new()` and (`MLE_LambertW_new.default()`); `MLE_LambertW` now works also for unbounded optimziation.
* `.default` methods for `IGMM` and `MLE_LambertW`. They just work one way on a numeric vector.
* dependency on **maxLik** package for numerical Hessian computation.  Use `optim(..., hessian = TRUE)` instead.
* **Rsolnp**, **numDeriv**, and **nortest** are only suggested packages; not required anymore.

## v0.2.9.9

* changed email to `im@gmge.org`

## v0.2.9.7

### New Features

* SolarFlares dataset

### Bug fixes & minor improvements

* `get.input()` had the wrong variable for `nu > 2` (`u` instead of `uu`)
* `loglik_penalty()` returned `NA` for `0/0` when computing inverse transformation. 
  Replaced this term with equivalent expression avoiding `0/0`.

## v0.2.9.5
- bug fixes to version 0.2.9

## v0.2.9
- bug fixes to version 0.2.6

## v0.2.6
- bug fixes to version 0.2.5

## v0.2.5
- new toolkit version of Lambert W x F distributions
- bug fixes to previous versions

## v0.1.0

* first version submitted March 23, 2009 by Georg M. Goerg (`im@gmge.org`)
