Spillover masking example : with a non spatial model

cbd <-  data.frame(y  =  c(42,  37,  30,  26,  30,  37,  42),
                   density = c(10, 20, 30, 50, 30, 20, 10),
                   distance = c(30, 20, 10, 0, 10, 20, 30),
                   row.names = paste("R",  1:7,  sep="")  ) 
head(cbd)
##     y density distance
## R1 42      10       30
## R2 37      20       20
## R3 30      30       10
## R4 26      50        0
## R5 30      30       10
## R6 37      20       20

Ordinary least squares model : \(Y=X \beta+\epsilon\) with \(\epsilon \sim \mathcal{N}\left(0, \sigma^{2} I_{n}\right)\)

obj.lm <- lm(y ~ density + distance-1, data = cbd)
summary(obj.lm)
## 
## Call:
## lm(formula = y ~ density + distance - 1, data = cbd)
## 
## Residuals:
##      R1      R2      R3      R4      R5      R6      R7 
## -0.9852  0.9926  0.9705 -1.5646  0.9705  0.9926 -0.9852 
## 
## Coefficients:
##          Estimate Std. Error t value Pr(>|t|)    
## density   0.55129    0.02064   26.71 1.37e-06 ***
## distance  1.24908    0.02839   43.99 1.15e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.284 on 5 degrees of freedom
## Multiple R-squared:  0.9991, Adjusted R-squared:  0.9987 
## F-statistic:  2649 on 2 and 5 DF,  p-value: 2.731e-08

Non-spatial prediction : \(\hat{Y}=X \hat{\beta}\) If we double the population density of region R2, only the travel time to the CBD for region R2 is affected:

cbd2=cbd 
cbd2$density[2]=2*cbd2$density[2]

yhat1 = predict(obj.lm, newdata = cbd) 
yhat2 = predict(obj.lm, newdata = cbd2) 
diff = yhat1-yhat2
diff 
##        R1        R2        R3        R4        R5        R6        R7 
##   0.00000 -11.02583   0.00000   0.00000   0.00000   0.00000   0.00000

Spillover masking example : with a spatial model

require("spdep")
require("spatialreg")

Consider the following spatial autoregressive model (LAG model) \(Y=\rho W y+X \beta+\epsilon\), with \(\epsilon \sim \mathcal{N}\left(0, \sigma^{2} I_{n}\right)\) We need to specify spatial neighbors through a weight matrix:

W.mat = matrix(c(0, 1, 0, 0, 0, 0, 0,
                 1, 0,  1,  0,  0,  0,  0,
                 0, 1,  0,  1,  0,  0,  0,
                 0, 0,  1,  0,  1,  0,  0,
                 0, 0,  0,  1,  0,  1,  0,
                 0, 0,  0,  0,  1,  0,  1,
                 0, 0,  0,  0,  0,  1,  0),7, 7,byrow=T)

W.listw <- mat2listw(W.mat)
Wnorm.listw = mat2listw(W.mat, style = "W")
Wnorm.mat = listw2mat(Wnorm.listw)

Z=rnorm(7,5,1) 
Zlag=Wnorm.mat%*%Z 
plot(Z,Zlag)

#changing the density in location 2 
cbd2=cbd 
cbd2$density[2]=2*cbd2$density[2]
yhat1.lm = predict(obj.lm, newdata = cbd) 
yhat2.lm = predict(obj.lm, newdata = cbd2) 
diff = yhat2 - yhat1
diff
##       R1       R2       R3       R4       R5       R6       R7 
##  0.00000 11.02583  0.00000  0.00000  0.00000  0.00000  0.00000

We can estimate the parameters :

obj.lag.norm <- lagsarlm(y ~ density + distance-1, 
                         data = cbd, listw=Wnorm.listw)
rho_hat = obj.lag.norm$rho

beta_hat = obj.lag.norm$coefficients
X = cbind(cbd$density,cbd$distance) 
X2 = cbind(cbd2$density,cbd2$distance)     
yhat1.lag = solve(diag(7) - rho_hat*Wnorm.mat)%*%X%*%beta_hat
yhat2.lag = solve(diag(7) - rho_hat*Wnorm.mat)%*%X2%*%beta_hat 
diff.lag = yhat2.lag-yhat1.lag
diff.lag  
##            [,1]
## [1,] 2.56991367
## [2,] 3.99688568
## [3,] 1.45570301
## [4,] 0.53110962
## [5,] 0.19632481
## [6,] 0.07956290
## [7,] 0.05115727

Spatial econometrics models allow to measure the effects of spillover

Illustration of estimation bias

library("raster")
library("cartography")
setwd("D:/Tap huan VIASM/Tinh hoa__VIASM_2021/Spatial econmetrics")
load("immob.Rdata")
immob.sp <- SpatialPoints(cbind(immob$longitude, immob$latitude))
immob.spdf <- SpatialPointsDataFrame(immob.sp, immob) 
proj4string(immob.spdf) <- CRS("+init=epsg:27572")

france_dep <- getData("GADM", country = "FRA", level = 2) 
france_dep <- spTransform(france_dep, CRS("+init=epsg:27572")) 
#save(france_dep, file = "france_dep.RData") 
#load("france_dep.RData")
#op <- par(oma = c(0, 0, 0, 0), mar = c(0, 0, 0, 0)) 
plot(france_dep, col = "#D1914D", border = "grey80") 
propSymbolsLayer(spdf = immob.spdf, var = "prix.vente", inches = 0.15)

#par(op)
LS0tDQp0aXRsZTogJ1R1dG9yaWFsOiBTcGF0aWFsIGVjb25vbWV0cmljcyB3aXRoIFIgMScNCmF1dGhvcjogIkh1b25nIFRoaSBUcmluaCwgVmFuLUhhIEhvYW5nLCBCaW5oIERhbyINCmRhdGU6ICIxMC0xMi8xMi8yMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICAjIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJmbGF0bHkiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpgYGANCg0KIyMgU3BpbGxvdmVyIG1hc2tpbmcgZXhhbXBsZSA6IHdpdGggYSBub24gc3BhdGlhbCBtb2RlbA0KDQpgYGB7cn0NCmNiZCA8LSAgZGF0YS5mcmFtZSh5ICA9ICBjKDQyLCAgMzcsICAzMCwgIDI2LCAgMzAsICAzNywgIDQyKSwNCiAgICAgICAgICAgICAgICAgICBkZW5zaXR5ID0gYygxMCwgMjAsIDMwLCA1MCwgMzAsIDIwLCAxMCksDQogICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBjKDMwLCAyMCwgMTAsIDAsIDEwLCAyMCwgMzApLA0KICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IHBhc3RlKCJSIiwgIDE6NywgIHNlcD0iIikgICkgDQpoZWFkKGNiZCkNCmBgYA0KDQpPcmRpbmFyeSBsZWFzdCBzcXVhcmVzIG1vZGVsIDogJFk9WCBcYmV0YStcZXBzaWxvbiQgd2l0aCAkXGVwc2lsb24gXHNpbSBcbWF0aGNhbHtOfVxsZWZ0KDAsIFxzaWdtYV57Mn0gSV97bn1ccmlnaHQpJA0KDQpgYGB7cn0NCm9iai5sbSA8LSBsbSh5IH4gZGVuc2l0eSArIGRpc3RhbmNlLTEsIGRhdGEgPSBjYmQpDQpzdW1tYXJ5KG9iai5sbSkNCmBgYA0KDQpOb24tc3BhdGlhbCBwcmVkaWN0aW9uIDogJFxoYXR7WX09WCBcaGF0e1xiZXRhfSQNCklmIHdlIGRvdWJsZSB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IG9mIHJlZ2lvbiBSMiwgb25seSB0aGUgdHJhdmVsIHRpbWUgdG8gdGhlIENCRCBmb3IgcmVnaW9uIFIyIGlzIGFmZmVjdGVkOg0KDQpgYGB7cn0NCmNiZDI9Y2JkIA0KY2JkMiRkZW5zaXR5WzJdPTIqY2JkMiRkZW5zaXR5WzJdDQoNCnloYXQxID0gcHJlZGljdChvYmoubG0sIG5ld2RhdGEgPSBjYmQpIA0KeWhhdDIgPSBwcmVkaWN0KG9iai5sbSwgbmV3ZGF0YSA9IGNiZDIpIA0KZGlmZiA9IHloYXQxLXloYXQyDQpkaWZmIA0KYGBgDQoNClxMb25ncmlnaHRhcnJvdyBcdGV4dCB7IG5vIHNwaWxsb3ZlciBlZmZlY3RzLiB9DQoNCiMjIFNwaWxsb3ZlciBtYXNraW5nIGV4YW1wbGUgOiB3aXRoIGEgc3BhdGlhbCBtb2RlbA0KDQpgYGB7cn0NCnJlcXVpcmUoInNwZGVwIikNCnJlcXVpcmUoInNwYXRpYWxyZWciKQ0KYGBgDQoNCkNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3BhdGlhbCBhdXRvcmVncmVzc2l2ZSBtb2RlbCAoTEFHIG1vZGVsKSAkWT1ccmhvIFcgeStYIFxiZXRhK1xlcHNpbG9uJCwgd2l0aCAkXGVwc2lsb24gXHNpbSBcbWF0aGNhbHtOfVxsZWZ0KDAsIFxzaWdtYV57Mn0gSV97bn1ccmlnaHQpJA0KV2UgbmVlZCB0byBzcGVjaWZ5IHNwYXRpYWwgbmVpZ2hib3JzIHRocm91Z2ggYSB3ZWlnaHQgbWF0cml4Og0KDQpgYGB7cn0NClcubWF0ID0gbWF0cml4KGMoMCwgMSwgMCwgMCwgMCwgMCwgMCwNCiAgICAgICAgICAgICAgICAgMSwJMCwJMSwJMCwJMCwJMCwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMSwJMCwJMSwJMCwJMCwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMSwJMCwJMSwJMCwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMCwJMSwJMCwJMSwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMCwJMCwJMSwJMCwJMSwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMCwJMCwJMCwJMSwJMCksNywgNyxieXJvdz1UKQ0KDQpXLmxpc3R3IDwtIG1hdDJsaXN0dyhXLm1hdCkNCldub3JtLmxpc3R3ID0gbWF0Mmxpc3R3KFcubWF0LCBzdHlsZSA9ICJXIikNCldub3JtLm1hdCA9IGxpc3R3Mm1hdChXbm9ybS5saXN0dykNCg0KWj1ybm9ybSg3LDUsMSkgDQpabGFnPVdub3JtLm1hdCUqJVogDQpwbG90KFosWmxhZykNCg0KI2NoYW5naW5nIHRoZSBkZW5zaXR5IGluIGxvY2F0aW9uIDIgDQpjYmQyPWNiZCANCmNiZDIkZGVuc2l0eVsyXT0yKmNiZDIkZGVuc2l0eVsyXQ0KeWhhdDEubG0gPSBwcmVkaWN0KG9iai5sbSwgbmV3ZGF0YSA9IGNiZCkgDQp5aGF0Mi5sbSA9IHByZWRpY3Qob2JqLmxtLCBuZXdkYXRhID0gY2JkMikgDQpkaWZmID0geWhhdDIgLSB5aGF0MQ0KZGlmZg0KYGBgDQoNCldlIGNhbiBlc3RpbWF0ZSB0aGUgcGFyYW1ldGVycyA6IA0KDQpgYGB7cn0NCm9iai5sYWcubm9ybSA8LSBsYWdzYXJsbSh5IH4gZGVuc2l0eSArIGRpc3RhbmNlLTEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjYmQsIGxpc3R3PVdub3JtLmxpc3R3KQ0KcmhvX2hhdCA9IG9iai5sYWcubm9ybSRyaG8NCg0KYmV0YV9oYXQgPSBvYmoubGFnLm5vcm0kY29lZmZpY2llbnRzDQpYID0gY2JpbmQoY2JkJGRlbnNpdHksY2JkJGRpc3RhbmNlKSANClgyID0gY2JpbmQoY2JkMiRkZW5zaXR5LGNiZDIkZGlzdGFuY2UpICAgICANCnloYXQxLmxhZyA9IHNvbHZlKGRpYWcoNykgLSByaG9faGF0Kldub3JtLm1hdCklKiVYJSolYmV0YV9oYXQNCnloYXQyLmxhZyA9IHNvbHZlKGRpYWcoNykgLSByaG9faGF0Kldub3JtLm1hdCklKiVYMiUqJWJldGFfaGF0IA0KZGlmZi5sYWcgPSB5aGF0Mi5sYWcteWhhdDEubGFnDQpkaWZmLmxhZyAgDQpgYGANCg0KU3BhdGlhbCBlY29ub21ldHJpY3MgbW9kZWxzIGFsbG93IHRvIG1lYXN1cmUgdGhlIGVmZmVjdHMgb2Ygc3BpbGxvdmVyDQoNCg0KIyMgSWxsdXN0cmF0aW9uIG9mIGVzdGltYXRpb24gYmlhcw0KDQpgYGB7cn0NCmxpYnJhcnkoInJhc3RlciIpDQpsaWJyYXJ5KCJjYXJ0b2dyYXBoeSIpDQpzZXR3ZCgiRDovVGFwIGh1YW4gVklBU00vVGluaCBob2FfX1ZJQVNNXzIwMjEvU3BhdGlhbCBlY29ubWV0cmljcyIpDQpsb2FkKCJpbW1vYi5SZGF0YSIpDQpgYGANCg0KYGBge3J9DQppbW1vYi5zcCA8LSBTcGF0aWFsUG9pbnRzKGNiaW5kKGltbW9iJGxvbmdpdHVkZSwgaW1tb2IkbGF0aXR1ZGUpKQ0KaW1tb2Iuc3BkZiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKGltbW9iLnNwLCBpbW1vYikgDQpwcm9qNHN0cmluZyhpbW1vYi5zcGRmKSA8LSBDUlMoIitpbml0PWVwc2c6Mjc1NzIiKQ0KDQpmcmFuY2VfZGVwIDwtIGdldERhdGEoIkdBRE0iLCBjb3VudHJ5ID0gIkZSQSIsIGxldmVsID0gMikgDQpmcmFuY2VfZGVwIDwtIHNwVHJhbnNmb3JtKGZyYW5jZV9kZXAsIENSUygiK2luaXQ9ZXBzZzoyNzU3MiIpKSANCiNzYXZlKGZyYW5jZV9kZXAsIGZpbGUgPSAiZnJhbmNlX2RlcC5SRGF0YSIpIA0KI2xvYWQoImZyYW5jZV9kZXAuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KI29wIDwtIHBhcihvbWEgPSBjKDAsIDAsIDAsIDApLCBtYXIgPSBjKDAsIDAsIDAsIDApKSANCnBsb3QoZnJhbmNlX2RlcCwgY29sID0gIiNEMTkxNEQiLCBib3JkZXIgPSAiZ3JleTgwIikgDQpwcm9wU3ltYm9sc0xheWVyKHNwZGYgPSBpbW1vYi5zcGRmLCB2YXIgPSAicHJpeC52ZW50ZSIsIGluY2hlcyA9IDAuMTUpDQojcGFyKG9wKQ0KYGBgDQoNCg==