r语言:空间面板Moran 指数计算

Moran指数

衡量空间相关性的一种指标。Moran指数越接近1,空间自相关越明显。判定一定范围内的空间实体相互之间是否存在相关关系,比如:一座座居民楼它们是聚集在一块还是离散分布在各处。

莫兰指数数值分布在[-1,1],[0,1]说明各地理实体之间存在正相关的关系,[-1,0]之间说明存在负相关的关系,而0值则无相关关系。

r中计算莫兰指数

r语言中spdep包提供了局部和全域莫兰指数计算函数。但是需要注意的是,该函数需要的参数格式为listw,一般来说只能计算截面数据的莫兰指数,无法处理面板数据,在空间计量中受限很大。所以我通过一些修改,实现面板数据的处理,还请大家不吝赐教。

具体代码及过程

我们的数据为27个国家,19年的面板数据,共有16个变量。基础空间权重矩阵为2727的方阵,故不能直接带入r的函数中计算。先定义一个1919的单位矩阵,然后对单位矩阵和基础空间权重矩阵求克罗内克积,得到一个分块对角矩阵。即面板数据莫兰指数可以接受的空间权重矩阵。

// 构造基础空间权重矩阵
p=shapefile("E://地图/Export_Output_2.shp",encoding="UTF-8")
countryname=c("ARE","BGD","BLR","DEU","EGY","GRC","IDN","IND","IRN","IRQ","JPN","KAZ","KHM","KOR","LAO","MMR","MNG","MYS","NLD","PAK","RUS","SAU","SGP","THA","TUR","UKR","VNM")
p$BSM=countryname
w_c<-poly2nb(p,queen = TRUE) ##queen临近 构造临近关系
w_c_mat<-nb2mat(w_c,zero.policy = TRUE)##基础空间权重矩阵
c=diag(x=1,ncol=19,nrow=19)
k<-kronecker(w_c_mat,c)##分块对角矩阵 

// 读入数据
data<-read.csv("E://lndataI.csv",header = TRUE)
panel<-pdata.frame(data,index = c("year","id"))
//i为变量序号,可加以变动实现循环计算
xi<-c(panel[,i])
xxi <- mean(xi)
z <- xi - xxi
zz <- sum(z^2)
length(xi)
K <- (length(xi) * sum(z^4))/(zz^2)
lz <- lag.listw(mat2listw(k), z, zero.policy = TRUE)
I <- (ll$n/ll$S0) * ((sum(z * lz))/zz)
res <- list(I = I, K = K)
Ii <- res$I
Ki <- res$K
K <- (3 * (3 * ll$n^2 - 7))/(5 * (ll$n^2 - 1))
EI <- (-1)/ll$n1
VI_r <- ll$n * (ll$S1 * (ll$nn - 3 * ll$n + 3) - ll$n * ll$S2+3*S02)
VI_b <- (ll$nn * ll$S1 - ll$n * ll$S2 + 3 * S02)/(S02 *(ll$nn-1))
ZI_ri <- (I - EI)/sqrt(VI_r)
ZI_bi <- (I - EI)/sqrt(VI_b)
statistic <- ZI_ri
statistic <- ZI_bi
PrI_ri <- pnorm(ZI_ri, lower.tail = FALSE)
PrI_bi <- pnorm(ZI_bi, lower.tail = FALSE)
vec_ri <- c(Ii,PrI_ri)
vec_bi <- c(Ii,PrI_bi)
names(vec_ri)<-c("Moran I statistic standard deviate","P-value")
names(vec_bi)<-c("Moran I statistic standard deviate","P-value")}

moran I statistic 空间正相关
P-value 拒绝0假设
0假设:空间个体之间随机均衡发展
注意:似乎无法实现多元面板数据的综合计算,日后再进行研究。

你可能感兴趣的:(r语言)