[R-sig-Geo] how to fit corSpher with gls?
Andy Bunn
Andy.Bunn at wwu.edu
Tue May 19 00:03:15 CEST 2015
Ugh! Forgot to specify the form of the object. Fixed below.
On 5/18/15, 12:57 PM, "Andy Bunn" <Andy.Bunn at wwu.edu> wrote:
>Hello all, I'm playing around with using gls and appropriate corr
>structure to model spatial autocorrelation in the residuals of a
>regression. Below I have an example of a regression of y~x where the
>residuals are spatially autocorrelated. I then try to fit a gls() model
>with a spherical correlation structure using parameters from a fitted
>variogram to the residuals of y~x. My expectation is that I would find the
>std error on my estimate of x to decrease and AIC to decrease with the
>spatial structure modeled correctly. But I think I am not specifying the
>terms correctly on the call to corSpher().
>
>Advice appreciated -Andy
>
># ~~~~~~~~~~~~~~~
># goal:
># create a variable y that is a function of x and spatially
># autocorrelated noise (espsilon)
># model y~x and show that the residuals are not iid
># apply a gls model with appropriate corr structure
>
>rm(list=ls())
>library(gstat)
>library(sp)
>library(nlme)
>library(spdep)
>library(ncf)
>
>set.seed(234)
># generate the spatially autocorrelated error term, epsilon
>n <- 200
>epsilon <- rnorm(n,0,1)
>
>easting <- runif(n,0,100)
>northing <- runif(n,0,100)
>points <- cbind(easting,northing)
>dnb <- dnearneigh(points, 0, 150)
>dsts <- nbdists(dnb, points)
>idw <- lapply(dsts, function(x) 1/x^1.5) # p=1.5
>lw <- nb2listw(dnb, glist=idw, style="W")
>
>rho <- 0.95
>inv <- invIrW(lw, rho)
>
>epsilon <- inv %*% epsilon
>epsilon <- scale(epsilon[,1])
>
>
># generate x as noise.
>x <- rnorm(n)
># generate y as a function of x and epsilon (which is spatially
>autocorrelated)
>B0 <- 10
>B1 <- 2
>y <- B0 + B1*x + epsilon
>
># Create a spatial object
>dat <- data.frame(easting,northing,y,x)
>coordinates(dat)<-c('easting','northing')
>
># Fit a model (we don't know about spatial component)
>lm1 <- lm(y~x, dat)
>coefficients(summary(lm1))
>
># Add residuals to the SPDF dat
>dat$lmResids <- residuals(lm1)
>
># Map the rediduals
>bubble(dat, zcol = 'lmResids')
>
># Test them for spatial autocorrelation using moran.test,
># a correlogram and a variogram.
>
># Moran's I test
>w <- knn2nb(knearneigh(dat, k=8))
>moran.test(dat$lmResids, nb2listw(w))
>
># Moran's I correlogram
>residsI <- spline.correlog(x=coordinates(dat)[,1], y=coordinates(dat)[,2],
> z=dat$lmResids, resamp=20)
>plot(residsI)
>
># Variogram
>lmResidsVar <- variogram(lmResids~1, data=dat)
>plot(lmResidsVar)
>sph.model <- vgm(psill=1, model="Sph", range=20, nugget=0.3)
>sph.fit <- fit.variogram(object = lmResidsVar, model = sph.model)
>plot(lmResidsVar,model=sph.fit)
# Refit a model with an approparite correlation structure.
# Corr structure with range and nugget from above and specifying
# the form
cs1 <- corSpher(c(17,0.3),form=~easting+northing,nugget=TRUE)
gls1 <- gls(y~x,data=dat,correlation=cs1)
summary(gls1)
# add the residuals to the spatial dat object
dat$glsResids <- residuals(gls2,type="normalized")
# Moran's I test comes back clean
moran.test(dat$glsResids, nb2listw(w))
>
># Refit a model with an approparite correlation structure.
>gls1 <- gls(y~x,data=dat) # same as ols above (lm1)
>
># How to get the right corSpher structure?
># I think I should give it values from the variogram fit above
># but that appears to be incorrect!
>cs1 <- corSpher(value=c(17,0.3),nugget=TRUE)
>gls2 <- gls(y~x,data=dat,correlation=cs1)
>
>summary(gls1)
>summary(gls2)
>
>
>
>
>
>>
>
>_______________________________________________
>R-sig-Geo mailing list
>R-sig-Geo at r-project.org
>https://stat.ethz.ch/mailman/listinfo/r-sig-geo
More information about the R-sig-Geo
mailing list