The Approximate profile-likelihood estimator (APLE) of the simultaneous autoregressive model's spatial dependence parameter was introduced in Li et al. (2007). It employs a correction term using the eigenvalues of the spatial weights matrix, and consequently should not be used for large numbers of observations. It also requires that the variable has a mean of zero, and it is assumed that it has been detrended. The spatial weights object is assumed to be row-standardised, that is using default style="W" in nb2listw.

aple(x, listw, override_similarity_check=FALSE, useTrace=TRUE)



a zero-mean detrended continuous variable


a listw object from for example nb2listw


default FALSE, if TRUE - typically for row-standardised weights with asymmetric underlying general weights - similarity is not checked


default TRUE, use trace of sparse matrix W %*% W (Li et al. (2010)), if FALSE, use crossproduct of eigenvalues of W as in Li et al. (2007)


This implementation has been checked with Hongfei Li's own implementation using her data; her help was very valuable.


A scalar APLE value.


Li, H, Calder, C. A. and Cressie N. A. C. (2007) Beyond Moran's I: testing for spatial dependence based on the spatial autoregressive model. Geographical Analysis 39, 357-375; Li, H, Calder, C. A. and Cressie N. A. C. (2012) One-step estimation of spatial dependence parameters: Properties and extensions of the APLE statistic, Journal of Multivariate Analysis 105, 68-84.


Roger Bivand

See also


wheat <- st_read(system.file("shapes/wheat.shp", package="spData")[1], quiet=TRUE)
#> Loading required package: sp
#> Attaching package: ‘spdep’
#> The following objects are masked from ‘package:spatialreg’:
#>     get.ClusterOption, get.coresOption, get.mcOption,
#>     get.VerboseOption, get.ZeroPolicyOption, set.ClusterOption,
#>     set.coresOption, set.mcOption, set.VerboseOption,
#>     set.ZeroPolicyOption
nbr1 <- poly2nb(wheat, queen=FALSE)
nbrl <- nblag(nbr1, 2)
nbr12 <- nblag_cumul(nbrl)
cms0 <- with(, tapply(yield, c, median))
cms1 <- c(model.matrix(~ factor(c) -1, data=wheat) %*% cms0)
wheat$yield_detrend <- wheat$yield - cms1
 tapply(yield_detrend, c, median))), rep(0.0, 25),
#> [1] TRUE
moran.test(wheat$yield_detrend, nb2listw(nbr12, style="W"))
#> 	Moran I test under randomisation
#> data:  wheat$yield_detrend  
#> weights: nb2listw(nbr12, style = "W")    
#> Moran I statistic standard deviate = 7.1479, p-value = 4.407e-13
#> alternative hypothesis: greater
#> sample estimates:
#> Moran I statistic       Expectation          Variance 
#>      0.2104573568     -0.0020040080      0.0008835001 
aple(as.vector(scale(wheat$yield_detrend, scale=FALSE)), nb2listw(nbr12, style="W"))
#> [1] 0.3698688
if (FALSE) {
errorsarlm(yield_detrend ~ 1, wheat, nb2listw(nbr12, style="W"))