[R-sig-Geo] ML estimate of neighbors radius

Roger Bivand Roger.Bivand at nhh.no
Thu Dec 13 22:57:33 CET 2012


On Thu, 13 Dec 2012, Gregory Macfarlane wrote:

> I am trying to identify the maximum likelihood estimates in an SDM model 
> (a hedonic home price model, with observations being 5,000 individual 
> homes), $$y=\rho W y + X\beta + WX\lambda + \epsilon$$
>
> I have been able to successfully estimate parameters $\rho, \beta,\lambda$ using the `lagsarlm` function in the `spdep` package. In my case, $W$ is an inverse distance matrix limited to a radius $r$, or
> $$W_{ij} = \begin{cases}
>  1/d_{ij} & \text{for $d_{ij} \leq r$ miles}\\
>  0  & \text{for $d_{ij} > r$ miles}
>  \end{cases}$$
> I would like to identify $r$ simultaneously with $\rho, \beta,\lambda$. 
> I have even written a likelihood function to do this in R (making use of 
> the neighbors and lag functions in `spdep`)
>
> sdm.lik <- function(params, y, X, GeoPoints){
>  n <- length(y)
>  rho <- params[1]
>  radius <- params[2]
>  sigma2 <- params[3]
>  delta <- params[-c(1,2,3)]
>  # make W subject to radius
>  points.dnn <- dnearneigh(GeoPoints, 0, radius*5280)
>  dists   	 <- nbdists(points.dnn, GeoPoints)
>  dists.inv  <- lapply(dists, function(x) 1/x)
>  Wlist <- nb2listw(points.dnn, glist=dists.inv, style="W", zero.policy=TRUE)
>  W <- listw2mat(Wlist)
>  # Lag X variables
>  Z <- cbind(X[,1], lag.listw(Wlist, X[,1], zero.policy=TRUE))
>  for(i in 2:ncol(X)){
>    Z <- cbind(Z, X[,i], lag.listw(Wlist, X[,1], zero.policy=TRUE))
>  }
>  # Calculate log likelihood
>  e <- y - ((rho * W) %*% y) - (Z %*% delta)
>  lagmatrix <- diag(1,nrow=length(y), ncol=length(y)) - rho*W
>  logL <- ( -0.5*n*log(pi * sigma2) + log( det(lagmatrix) )
>                                           -(t(e) %*% e) / (2*sigma2) )
>  return(-logL)
> }
>
> Optimizing this function is far too slow to be practical, however. 
> Unsurprisingly, the highest cost operation is the log-determinant.

Yes, all of the components are present. See ?do_ldet in spdep. Also note 
that log(det()) will underflow as det() approaches zero. Do also note that 
W should be sparse - see the same help page and the code of the setup 
functions for insight. You certainly do not want to be handling dense 
matrices. Note that by endogenising W jointly, you make life very hard for 
yourself - you could take a coarse grid of radius values instead and 
optimize rho and beta for fixed radius, which would run very much faster. 
If you change W at each pass, none of the available methods for speeding 
up the logdet will benifit from running the setup function only once - you 
need now to set up the framework, such as solving the eigenproblem, each 
time. Probably "Matrix_J" will work best in your current setting.

Hope this helps,

Roger

>   1. Do you have tips for computing this determinant more quickly?
>   2. Does `lagsarlm` already have functionality to do this?
>   2.a). Can I hack it to make it do this?
>
> Greg Macfarlane
> Georgia Tech | Civil Engineering
>
>
> 	[[alternative HTML version deleted]]
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>

-- 
Roger Bivand
Department of Economics, NHH Norwegian School of Economics,
Helleveien 30, N-5045 Bergen, Norway.
voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no



More information about the R-sig-Geo mailing list