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)

LS0tDQp0aXRsZTogJ1R1dG9yaWFsOiBTcGF0aWFsIGVjb25vbWV0cmljcyB3aXRoIFIgMScNCmF1dGhvcjogIkh1b25nIFRoaSBUcmluaCwgVmFuLUhhIEhvYW5nLCBCaW5oIERhbyINCmRhdGU6ICIxMC0xMi8xMi8yMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICAjIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJmbGF0bHkiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpgYGANCg0KIyMgU3BpbGxvdmVyIG1hc2tpbmcgZXhhbXBsZSA6IHdpdGggYSBub24gc3BhdGlhbCBtb2RlbA0KDQpgYGB7cn0NCmNiZCA8LSAgZGF0YS5mcmFtZSh5ICA9ICBjKDQyLCAgMzcsICAzMCwgIDI2LCAgMzAsICAzNywgIDQyKSwNCiAgICAgICAgICAgICAgICAgICBkZW5zaXR5ID0gYygxMCwgMjAsIDMwLCA1MCwgMzAsIDIwLCAxMCksDQogICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBjKDMwLCAyMCwgMTAsIDAsIDEwLCAyMCwgMzApLA0KICAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcyA9IHBhc3RlKCJSIiwgIDE6NywgIHNlcD0iIikgICkgDQpoZWFkKGNiZCkNCmBgYA0KDQpPcmRpbmFyeSBsZWFzdCBzcXVhcmVzIG1vZGVsIDogJFk9WCBcYmV0YStcZXBzaWxvbiQgd2l0aCAkXGVwc2lsb24gXHNpbSBcbWF0aGNhbHtOfVxsZWZ0KDAsIFxzaWdtYV57Mn0gSV97bn1ccmlnaHQpJA0KDQpgYGB7cn0NCm9iai5sbSA8LSBsbSh5IH4gZGVuc2l0eSArIGRpc3RhbmNlLTEsIGRhdGEgPSBjYmQpDQpzdW1tYXJ5KG9iai5sbSkNCmBgYA0KDQpOb24tc3BhdGlhbCBwcmVkaWN0aW9uIDogJFxoYXR7WX09WCBcaGF0e1xiZXRhfSQNCklmIHdlIGRvdWJsZSB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IG9mIHJlZ2lvbiBSMiwgb25seSB0aGUgdHJhdmVsIHRpbWUgdG8gdGhlIENCRCBmb3IgcmVnaW9uIFIyIGlzIGFmZmVjdGVkOg0KDQpgYGB7cn0NCmNiZDI9Y2JkIA0KY2JkMiRkZW5zaXR5WzJdPTIqY2JkMiRkZW5zaXR5WzJdDQoNCnloYXQxID0gcHJlZGljdChvYmoubG0sIG5ld2RhdGEgPSBjYmQpIA0KeWhhdDIgPSBwcmVkaWN0KG9iai5sbSwgbmV3ZGF0YSA9IGNiZDIpIA0KZGlmZiA9IHloYXQxLXloYXQyDQpkaWZmIA0KYGBgDQoNClxMb25ncmlnaHRhcnJvdyBcdGV4dCB7IG5vIHNwaWxsb3ZlciBlZmZlY3RzLiB9DQoNCiMjIFNwaWxsb3ZlciBtYXNraW5nIGV4YW1wbGUgOiB3aXRoIGEgc3BhdGlhbCBtb2RlbA0KDQpgYGB7cn0NCnJlcXVpcmUoInNwZGVwIikNCnJlcXVpcmUoInNwYXRpYWxyZWciKQ0KYGBgDQoNCkNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3BhdGlhbCBhdXRvcmVncmVzc2l2ZSBtb2RlbCAoTEFHIG1vZGVsKSAkWT1ccmhvIFcgeStYIFxiZXRhK1xlcHNpbG9uJCwgd2l0aCAkXGVwc2lsb24gXHNpbSBcbWF0aGNhbHtOfVxsZWZ0KDAsIFxzaWdtYV57Mn0gSV97bn1ccmlnaHQpJA0KV2UgbmVlZCB0byBzcGVjaWZ5IHNwYXRpYWwgbmVpZ2hib3JzIHRocm91Z2ggYSB3ZWlnaHQgbWF0cml4Og0KDQpgYGB7cn0NClcubWF0ID0gbWF0cml4KGMoMCwgMSwgMCwgMCwgMCwgMCwgMCwNCiAgICAgICAgICAgICAgICAgMSwJMCwJMSwJMCwJMCwJMCwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMSwJMCwJMSwJMCwJMCwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMSwJMCwJMSwJMCwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMCwJMSwJMCwJMSwJMCwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMCwJMCwJMSwJMCwJMSwNCiAgICAgICAgICAgICAgICAgMCwJMCwJMCwJMCwJMCwJMSwJMCksNywgNyxieXJvdz1UKQ0KDQpXLmxpc3R3IDwtIG1hdDJsaXN0dyhXLm1hdCkNCldub3JtLmxpc3R3ID0gbWF0Mmxpc3R3KFcubWF0LCBzdHlsZSA9ICJXIikNCldub3JtLm1hdCA9IGxpc3R3Mm1hdChXbm9ybS5saXN0dykNCg0KWj1ybm9ybSg3LDUsMSkgDQpabGFnPVdub3JtLm1hdCUqJVogDQpwbG90KFosWmxhZykNCg0KI2NoYW5naW5nIHRoZSBkZW5zaXR5IGluIGxvY2F0aW9uIDIgDQpjYmQyPWNiZCANCmNiZDIkZGVuc2l0eVsyXT0yKmNiZDIkZGVuc2l0eVsyXQ0KeWhhdDEubG0gPSBwcmVkaWN0KG9iai5sbSwgbmV3ZGF0YSA9IGNiZCkgDQp5aGF0Mi5sbSA9IHByZWRpY3Qob2JqLmxtLCBuZXdkYXRhID0gY2JkMikgDQpkaWZmID0geWhhdDIgLSB5aGF0MQ0KZGlmZg0KYGBgDQoNCldlIGNhbiBlc3RpbWF0ZSB0aGUgcGFyYW1ldGVycyA6IA0KDQpgYGB7cn0NCm9iai5sYWcubm9ybSA8LSBsYWdzYXJsbSh5IH4gZGVuc2l0eSArIGRpc3RhbmNlLTEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjYmQsIGxpc3R3PVdub3JtLmxpc3R3KQ0KcmhvX2hhdCA9IG9iai5sYWcubm9ybSRyaG8NCg0KYmV0YV9oYXQgPSBvYmoubGFnLm5vcm0kY29lZmZpY2llbnRzDQpYID0gY2JpbmQoY2JkJGRlbnNpdHksY2JkJGRpc3RhbmNlKSANClgyID0gY2JpbmQoY2JkMiRkZW5zaXR5LGNiZDIkZGlzdGFuY2UpICAgICANCnloYXQxLmxhZyA9IHNvbHZlKGRpYWcoNykgLSByaG9faGF0Kldub3JtLm1hdCklKiVYJSolYmV0YV9oYXQNCnloYXQyLmxhZyA9IHNvbHZlKGRpYWcoNykgLSByaG9faGF0Kldub3JtLm1hdCklKiVYMiUqJWJldGFfaGF0IA0KZGlmZi5sYWcgPSB5aGF0Mi5sYWcteWhhdDEubGFnDQpkaWZmLmxhZyAgDQpgYGANCg0KU3BhdGlhbCBlY29ub21ldHJpY3MgbW9kZWxzIGFsbG93IHRvIG1lYXN1cmUgdGhlIGVmZmVjdHMgb2Ygc3BpbGxvdmVyDQoNCg0KIyMgSWxsdXN0cmF0aW9uIG9mIGVzdGltYXRpb24gYmlhcw0KDQpgYGB7cn0NCmxpYnJhcnkoInJhc3RlciIpDQpsaWJyYXJ5KCJjYXJ0b2dyYXBoeSIpDQpzZXR3ZCgiRDovVGFwIGh1YW4gVklBU00vVGluaCBob2FfX1ZJQVNNXzIwMjEvU3BhdGlhbCBlY29ubWV0cmljcyIpDQpsb2FkKCJpbW1vYi5SZGF0YSIpDQpgYGANCg0KYGBge3J9DQppbW1vYi5zcCA8LSBTcGF0aWFsUG9pbnRzKGNiaW5kKGltbW9iJGxvbmdpdHVkZSwgaW1tb2IkbGF0aXR1ZGUpKQ0KaW1tb2Iuc3BkZiA8LSBTcGF0aWFsUG9pbnRzRGF0YUZyYW1lKGltbW9iLnNwLCBpbW1vYikgDQpwcm9qNHN0cmluZyhpbW1vYi5zcGRmKSA8LSBDUlMoIitpbml0PWVwc2c6Mjc1NzIiKQ0KDQpmcmFuY2VfZGVwIDwtIGdldERhdGEoIkdBRE0iLCBjb3VudHJ5ID0gIkZSQSIsIGxldmVsID0gMikgDQpmcmFuY2VfZGVwIDwtIHNwVHJhbnNmb3JtKGZyYW5jZV9kZXAsIENSUygiK2luaXQ9ZXBzZzoyNzU3MiIpKSANCiNzYXZlKGZyYW5jZV9kZXAsIGZpbGUgPSAiZnJhbmNlX2RlcC5SRGF0YSIpIA0KI2xvYWQoImZyYW5jZV9kZXAuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KI29wIDwtIHBhcihvbWEgPSBjKDAsIDAsIDAsIDApLCBtYXIgPSBjKDAsIDAsIDAsIDApKSANCnBsb3QoZnJhbmNlX2RlcCwgY29sID0gIiNEMTkxNEQiLCBib3JkZXIgPSAiZ3JleTgwIikgDQpwcm9wU3ltYm9sc0xheWVyKHNwZGYgPSBpbW1vYi5zcGRmLCB2YXIgPSAicHJpeC52ZW50ZSIsIGluY2hlcyA9IDAuMTUpDQojcGFyKG9wKQ0KYGBgDQoNCg==