Skip to content

Error when performing a spatial eigenvector selection in R

2 messages · DIEGO CEPEDA GOMEZ, Roger Bivand

#
Dear all,

I am currently trying to do a Gaussian linear regression in R with data
that may be spatially autocorrelated. My dataset contains geographic
coordinates (value of longitude, value of latitude), species, independent
variables (BS and LTS) and some explanatory variables; it looks like:

head(dataset)

coordinates SPECIES                BS   LTS  DEPTH OCEAN(155, 47)
Cristaphyes abyssorum  8.66 28.3  5373  WPac(150, 41)    Cristaphyes
abyssorum  8.66 28.3  5250  WPac (-72, -41)   Cristaphyes anomalus
8.69   NA    35  EPac(-74, -44)   Cristaphyes anomalus   8.69   NA
35  EPac(-57, -46)   Cristaphyes anomalus   8.69   NA    NA  WAtl(29,
80)     Cristaphyes arctous    8.32 27.0   393  EAtl

tail(dataset)

coordinates SPECIES                  BS   LTS   DEPTH  OCEAN(-80, 27)
 Zelinkaderes brightae    NA   20.1  13.04  WAtl(-80, 27)
Zelinkaderes floridensis 7.10 12.4  140.00 WAtl(35, 25)
Zelinkaderes klepali     NA   25.0  1.00   WInd(9, 57)
Zelinkaderes submersus   7.99 21.4  30.00  EAtl(130, 36)
Zelinkaderes yong        NA   12.7  4.50   WAtl

The dataset also include the values of latitude and longitude in separated
columns.

I extracted positive eigenvector-based spatial filters from a truncated
matrix of geographic distances among sampling sites. I would like to treat
spatial filters as candidate explanatory variables in my linear regression
model. I did this as following:

First of all, I created a neighbor list object (nb). In my case of
irregular samplings, I used the function knearneight of the R package spdep:

knea8 <-knearneight(coordinates(dataset), longlat=TRUE, k=8)

neib8 <-knn2nb(knea8)

Then, I created a spatial weighting matrix with the function nb2listw of
the R package spdep:

nb2listw(neib8)

distgab8 <- nbdists(neib8, coordinates(dataset))

str(distgab8)

fdist<-lapply(distgab8, function(x) 1-x/max(dist(coordinates(dataset))))

listwgab8 <- nb2listw(neib8, glist = fdist8, style = "B")

Then, I built spatial predictors to incorporate them in the Gaussian linear
regression. I did this with the mem function of the R package adespatial,
as following:

mem.gab8 <- mem(listwgab8)

Additionally, Moran's I were computed and tested for each eigenvector with
the moran.randtest function, as following:

moranI8 <-moran.randtest(mem.gab8, listwgab8, 99)

I obtained some eigenvectors with significant positive spatial
autocorrelation. Now, I would like to include them in the Gaussian linear
regression. I tried to do this with the function ME of spdep, as following:

GLM1 <- ME(BS~LATITUDE, data=dataset, listw=listwgab8,
family=gaussian, nsim=99, alpha=0.05)

Unfortunately, I receive this error:

Error in sW %*% var : Cholmod error 'X and/or Y have wrong dimensions' at
file ../MatrixOps/cholmod_sdmult.c, line 90


Would anybody know how I could solve this error? Or, if is there another
way to perform a spatial eigenvector selection in a Gaussian linear
regression?

Thank you in advance

Best wishes,

Diego
#
On Wed, 10 Oct 2018, DIEGO CEPEDA GOMEZ wrote:

            
If you are choosing adespatial::mem(), it will probably work differently 
from spdep::SpatialFilering(), based on

      Tiefelsdorf M, Griffith DA. (2007) Semiparametric Filtering of
      Spatial Autocorrelation: The Eigenvector Approach. Environment and
      Planning A, 39 (5) 1193 - 1221.

In that approach, the eigenvectors are chosen to reduce the residual 
spatial autocorrelation.
Use spdep::SpatialFilering() rather than spdep::ME() for the Gaussian 
case. Probably your listwgab8 refers to a different number of observations 
than dataset (any missing values in your variables?).

Roger