R: Matrix exponential spatial lag model

lagmess {spatialreg} | R Documentation

## Matrix exponential spatial lag model

### Description

The function fits a matrix exponential spatial lag model, using `optim` to find the value of `alpha`, the spatial coefficient.

### Usage

    lagmess(formula, data = list(), listw, zero.policy = NULL, na.action = na.fail,
     q = 10, start = -2.5, control=list(), method="BFGS", verbose=NULL,
     use_expm=FALSE)

### Arguments

`formula` | a symbolic description of the model to be fit. The details of model specification are given for `lm()`
`data` | an optional data frame containing the variables in the model. By default the variables are taken from the environment which the function is called.
`listw` | a `listw` object created for example by `nb2listw`
`zero.policy` | default NULL, use global option value; if TRUE assign zero to the lagged value of zones without neighbours, if FALSE assign NA - causing `lagmess()` to terminate with an error
`na.action` | a function (default `options("na.action")`), can also be `na.omit` or `na.exclude` with consequences for residuals and fitted values - in these cases the weights list will be subsetted to remove NAs in the data. It may be necessary to set zero.policy to TRUE because this subsetting may create no-neighbour observations. Note that only weights lists created without using the glist argument to `nb2listw` may be subsetted.
`q` | default 10; number of powers of the spatial weights to use
`start` | starting value for numerical optimization, should be a small negative number
`control` | control parameters passed to `optim`
`method` | default `BFGS`, method passed to `optim`
`verbose` | default NULL, use global option value; if TRUE report function values during optimization
`use_expm` | default FALSE; if TRUE use `expm::expAtv` instead of a truncated power series of W

### Details

The underlying spatial lag model:

y = rho W y + X beta + e

where rho is the spatial parameter may be fitted by maximum likelihood. In that case, the log likelihood function includes the logartithm of cumbersome Jacobian term |I - rho W|. If we rewrite the model as:

S y = X beta + e

we see that in the ML case S y = (I - rho W) y. If W is row-stochastic, S may be expressed as a linear combination of row-stochastic matrices. By pre-computing the matrix [y Wy, W^2y, ..., W^{q-1}y], the term S y (alpha) can readily be found by numerical optimization using the matrix exponential approach. alpha and rho are related as rho = 1 - exp(alpha), conditional on the number of matrix power terms taken `q`.

### Value

The function returns an object of class `Lagmess` with components:

`lmobj` | the `lm` object returned after fitting `alpha`
`alpha` | the spatial coefficient
`alphase` | the standard error of the spatial coefficient using the numerical Hessian
`rho` | the value of `rho` implied by `alpha`
`bestmess` | the object returned by `optim`
`q` | the number of powers of the spatial weights used
`start` | the starting value for numerical optimization used
`na.action` | (possibly) named vector of excluded or omitted observations if non-default na.action argument used
`nullLL` | the log likelihood of the aspatial model for the same data

### Author(s)

Roger Bivand Roger.Bivand@nhh.no and Eric Blankmeyer

### References

J. P. LeSage and R. K. Pace (2007) A matrix exponential specification. Journal of Econometrics, 140, 190-214; J. P. LeSage and R. K. Pace (2009) Introduction to Spatial Econometrics. CRC Press, Chapter 9.

### See Also

`lagsarlm`, `optim`

### Examples

    #require(spdep, quietly=TRUE)
    data(baltimore, package="spData")
    baltimore$AGE <- ifelse(baltimore$AGE < 1, 1, baltimore$AGE)
    lw <- spdep::nb2listw(spdep::knn2nb(spdep::knearneigh(cbind(baltimore$X, baltimore$Y), k=7)))
    obj1 <- lm(log(PRICE) ~ PATIO + log(AGE) + log(SQFT),
     data=baltimore)
    spdep::lm.morantest(obj1, lw)
    spdep::lm.LMtests(obj1, lw, test="all")
    system.time(obj2 <- lagmess(log(PRICE) ~ PATIO + log(AGE) + log(SQFT), data=baltimore, listw=lw))
    (x <- summary(obj2))
    coef(x)
    system.time(obj2a <- lagmess(log(PRICE) ~ PATIO + log(AGE) + log(SQFT), data=baltimore, listw=lw,
     use_expm=TRUE))
    summary(obj2a)
    obj3 <- lagsarlm(log(PRICE) ~ PATIO + log(AGE) + log(SQFT), data=baltimore, listw=lw)
    summary(obj3)

    data(boston, package="spData")
    lw <- spdep::nb2listw(boston.soi)
    gp2 <- lagsarlm(log(CMEDV) ~ CRIM + ZN + INDUS + CHAS + I(NOX^2) + I(RM^2)
     +  AGE + log(DIS) + log(RAD) + TAX + PTRATIO + B + log(LSTAT),
     data=boston.c, lw, method="Matrix")
    summary(gp2)
    gp2a <- lagmess(CMEDV ~ CRIM + ZN + INDUS + CHAS + I(NOX^2) + I(RM^2)
     +  AGE + log(DIS) + log(RAD) + TAX + PTRATIO + B + log(LSTAT),
     data=boston.c, lw)
    summary(gp2a)

[Package spatialreg version 1.2-1 Index]