margeff {VGAM} | R Documentation

## Marginal effects for the multinomial logit and cumulative models

### Description

Marginal effects for the multinomial logit model and cumulative logit/probit/... models: the derivative of the fitted probabilities with respect to each explanatory variable.

### Usage

    margeff(object, subset=NULL)

### Arguments

`object` | A `vglm` `multinomial` or `cumulative` object.
`subset` | Numerical or logical vector, denoting the required observation(s). Recycling is used if possible. The default means all observations.

### Details

Computes the derivative of the fitted probabilities of a multinomial logit model or cumulative logit/probit/... model with respect to each explanatory variable.

### Value

A p by M+1 by n array, where p is the number of explanatory variables and the (hopefully) nominal response has M+1 levels, and there are n observations.
If `is.numeric(subset)` and `length(subset) == 1` then a p by M+1 matrix is returned.

### Warning

Care is needed in interpretation, e.g., the change is not universally accurate for a unit change in each explanatory variable because eventually the `new' probabilities may become negative or greater than unity. Also, the `new' probabilities will not sum to one.

This function is not applicable for models with data-dependent terms such as `bs` and `poly`. Also the function should not be applied to models with any terms that have generated more than one column of the LM model matrix, such as `bs` and `poly`. For such try using numerical methods such as finite-differences. The `formula` in `object` should comprise of simple terms of the form `~ x2 + x3 + x4`, etc.

### Note

For `multinomial` this function should handle any value of `refLevel` and also any constraint matrices. However, it does not currently handle the `xij` or `form2` arguments, nor `vgam` objects.

For `multinomial` if `subset` is numeric then the function uses a `for` loop over the observations (slow). The default computations use vectorization; this uses more memory than a `for` loop but is faster.

### Author(s)

T. W. Yee

### See Also

`multinomial`, `cumulative`, `vglm`.

### Examples

    # Not a good example for multinomial() because the response is ordinal!!
    ii = 3; hh = 1/100
    pneumo = transform(pneumo, let = log(exposure.time))
    fit = vglm(cbind(normal, mild, severe) ~ let, multinomial, pneumo)
    fit = vglm(cbind(normal, mild, severe) ~ let,
               cumulative(reverse=TRUE,  parallel=TRUE),
               data = pneumo)
    fitted(fit)[ii,]

    mynewdata = with(pneumo, data.frame(let = let[ii]+hh))
    (newp <- predict(fit, newdata=mynewdata, type="response"))

    # Compare the difference. Should be the same as hh --> 0.
    round(dig=3, (newp-fitted(fit)[ii,])/hh) # Finite-difference approximation
    round(dig=3, margeff(fit, subset=ii)["let",])

    # Other examples
    round(dig=3, margeff(fit))
    round(dig=3, margeff(fit, subset=2)["let",])
    round(dig=3, margeff(fit, subset=c(FALSE,TRUE))["let",,]) # recycling
    round(dig=3, margeff(fit, subset=c(2,4,6,8))["let",,])

[Package VGAM version 0.7-9 Index]