## Description

Computes the multilogit transformation, including its inverse and the first two derivatives.

## Usage

 ```1 2 3``` ```multilogitlink(theta, refLevel = "(Last)", M = NULL, whitespace = FALSE, bvalue = NULL, inverse = FALSE, deriv = 0, all.derivs = FALSE, short = TRUE, tag = FALSE) ```

## Arguments

 `theta` Numeric or character. See below for further details. `refLevel, M, whitespace` See `multinomial`. `bvalue` See `Links`. `all.derivs` Logical. This is currently experimental only. `inverse, deriv, short, tag` Details at `Links`.

## Details

The `multilogitlink()` link function is a generalization of the `logitlink` link to M levels/classes. It forms the basis of the `multinomial` logit model. It is sometimes called the multi-logit link or the multinomial logit link; some people use softmax too. When its inverse function is computed it returns values which are positive and add to unity.

## Value

For `multilogitlink` with `deriv = 0`, the multilogit of `theta`, i.e., `log(theta[, j]/theta[, M+1])` when `inverse = FALSE`, and if `inverse = TRUE` then `exp(theta[, j])/(1+rowSums(exp(theta)))`.

For `deriv = 1`, then the function returns d `eta` / d `theta` as a function of `theta` if `inverse = FALSE`, else if `inverse = TRUE` then it returns the reciprocal.

Here, all logarithms are natural logarithms, i.e., to base e.

## Note

Numerical instability may occur when `theta` is close to 1 or 0 (for `multilogitlink`). One way of overcoming this is to use, e.g., `bvalue`. Currently `care.exp()` is used to avoid `NA`s being returned if the probability is too close to 1.

Thomas W. Yee

## References

McCullagh, P. and Nelder, J. A. (1989). Generalized Linear Models, 2nd ed. London: Chapman & Hall.

`Links`, `multinomial`, `logitlink`, `gaitpoisson`, `normal.vcm`, `CommonVGAMffArguments`.
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15``` ```pneumo <- transform(pneumo, let = log(exposure.time)) fit <- vglm(cbind(normal, mild, severe) ~ let, multinomial, trace = TRUE, data = pneumo) # For illustration only! fitted(fit) predict(fit) multilogitlink(fitted(fit)) multilogitlink(fitted(fit)) - predict(fit) # Should be all 0s multilogitlink(predict(fit), inverse = TRUE) # rowSums() add to unity multilogitlink(predict(fit), inverse = TRUE, refLevel = 1) # For illustration only multilogitlink(predict(fit), inverse = TRUE) - fitted(fit) # Should be all 0s multilogitlink(fitted(fit), deriv = 1) multilogitlink(fitted(fit), deriv = 2) ```