R语言检验空间自相关Moran's I和运行SAR模型

2011-05-25 02:57 · zjlcas

如何用spdep程序包检验空间自相关Moran's I?

 

如何用spdep程序包检验空间自相关Moran's I?
张金龙
jinlongzhang01@gmail.com
在空间取样中位置越接近的点相应的变量也可能越相近,这种现象称为空间自相关。空间自相关能够改变人们对某些事物原因的判断。举例来说,一个地点物种数高,临近的点物种数也相应得会高些,但这并不一定是由于两个地点的环境条件都十分优越,而纯粹是由于两个地点之间在空间上更为接近。点与点之间空间关系的依赖性使得各点之间数据并不是独立的。
 
为此,需要从空间关系检验空间自相关是否存在。空间自相关的检验,用Moran's I 表示。 Moran's I 与Pearson相关系数的算法类似,不过其计算时相关程度考虑的是点与点本身。在R的ape程序包中,有关于Moran's I的详细的说明。为了检验Moran's I的显著性,空间统计学家运动Randomization的方法,获得Moran's I的零分布,继而求的各距离段中的Moran's I是否显著偏离于零分布。
 
为了尽量去除空间自相关的影响,统计学家开发出了空间自回归模型,SAR(Spatial Auto Regressive Model),该模型在R的spdep中能够较为方便的实现。当然,也还有众多的程序包,如宏生态学数据分析的SAM程序包等。
 
一下是在spdep程序包中如何计算和检验Moran's I的详细过程,以及调用SAR模型,进行相应的统计推断等。希望对感兴趣的同行有所帮助。
 
##################
library(spdep)
## 为了检验ntaxa是否具有空间自相关
setwd("C:/one/")
test0 <- read.csv("test.csv", header = TRUE, row.names = 1)
ntaxa <- test0$ntaxa
## 将test数据集转换成Spatial格式
test <- test0[,c(1,2)]
sptest <- SpatialPoints(test, proj4string = CRS("+proj=longlat +datum=WGS84"))
## 计算每个点最近的几个neighbour(这里k = 1,表示只计算一个的)
nbk1 <- knn2nb(knearneigh(sptest, k = 5, longlat = TRUE))
## 将nbk1转换成 spatial weight linkage object 对象
snbk1 <- make.sym.nb(nbk1)
### n.comp.nb() finds the number of disjoint connected subgraphs 
### in the graph depicted by nb.obj - a spatial neighbours list object. 
### 查看每个点不相接的相邻点数量
n.comp.nb(snbk1)$nc
### 查看各点链接情况
plot(nb2listw(snbk1), cbind(test$longitude, test$latitude))
### Moran's Test检验该数据集是否存在显著的空间自相关
###  Moran's I test under randomisation
moran.test(ntaxa, nb2listw(snbk1))
### Moran's I Correlograms
### par(mfrow = c(1, 3))
ntaxa.Moron.I <- sp.correlogram(snbk1, ntaxa, order=6, method="I", zero.policy = TRUE)
plot(ntaxa.Moron.I)
### SAR model
### Saddlepoint approximation for global Moran's I (Barndorff-Nielsen formula)
lm.morantest.sad(lm(ntaxa~1),nb2listw(snbk1))
## sacsarlm
COL.sacW.eig <- sacsarlm(ntaxa ~ Pre + Elev + factor(Time) + factor(Geology), data = test0, nb2listw(snbk1, style="W"))
summary(COL.sacW.eig, correlation=TRUE)
 
关键词: