计算Moran I空间自相关性检验的问题

3

我在使用R计算莫兰指数来检验空间自相关时遇到了问题。

我执行了以下步骤:

#I download all the appropriate libraries 

    library(maptools) 
    library(spdep) 
    library(splancs) 
    library(spatstat)
    library(pwt)

#i import my shapefile and I calculate the coordinates
serbia<-readShapePoly("SRB_adm1")
coords<-coordinates(serbia)


#i created a weigthed matrix using the above definition of neigbour(dnb60 object)
dnb60.listw<-nb2listw(dnb60,style="W", zero.policy=F)

#i import my dataset which contains around 500 variables and is a firm level dataset containing 2373 firms.
library(foreign)
statafile<-read.dta("path", missing.type = T, warn.missing.labels = T) 

#i combine the shapefile(serbia) with the imported dataset(statafile) and created file with coordiantes (new) using common variable ID_1(region code). My final dataset is data_total.
new<- cbind(coordinates(serbia), serbia$ID_1)
newdata <- data.frame(new)
names(newdata)<-c("X", "Y", "ID_1")
cis_08_10 <- merge(statafile, serbia, by="ID_1", all.x=T)
data_total<-merge(cis_08_10, newdata, by="ID_1",all.x=T)

我对特定变量prod_ser在最终数据集data_total中进行Moran I检验很感兴趣。
我做了以下事情:
#calculating Moran I test
moran.test(data_total$prod_ser, dnb60.listw, randomisation=F)
I get the following error: Error in moran.test(data_total$prod_ser, dnb60.listw, randomisation = F) : 
  objects of different length

现在,data_total$prod_ser 的长度为2373,dnb60.listw 的长度为3。我认为主要问题是W矩阵是使用包含25个区域的serbia形状文件创建的,而prod_ser变量是来自data_total的企业级变量,有2373家企业(我猜应该对应于点数据,企业是点)。为什么合并数据集没有帮助?我需要做什么才能计算Moran I而不出现此错误?
2个回答

0
问题在于两个数据集不同。对我有用的是:
  1. 首先,创建W矩阵。
nbk <- knn2nb(knearneigh(st_centroid(dnb60)))

其次,将此转换为列表:
dnb60.listw<-nb2listw(dnb60,style="W", zero.policy=F)

检查所有长度是否相等
length(dnb60) 
length(nbk)
length(dnb60.listw) 

由于我没有您的数据,所以无法重现确切的示例,但如果您运行此部分,应该会发现这3个长度都不同。而它们应该是相同的,这样您就可以运行Moran测试了。

解决方案? 我会先运行合并操作。确保所有数据集具有相同数量的观测值。然后,使用我在第3步提供的长度进行检查,然后运行Moran测试。

希望这可以帮助到您!


0

好的!您已经自己找到了问题所在。这正是您出现此类错误的原因。 'dnb60.listw' 基于数据集 serbia,由于您在 moran.test 公式中使用了 'data total',因此出现了此类错误。您应该先合并数据,然后根据合并后的数据估计 'dnb60.listw',然后计算 Moran I。您应该没问题了。

P.S. 我不是 R 专家,英语也不是我的母语,因此,如果有任何误解,请提前谅解 :)


我尝试过了,但是出现了以下错误: knn1IT <- knn2nb(knearneigh(data_total$X, data_total$Y,k=1,longlat=T)) k近邻算法:数据不符合矩阵形式。X和Y是坐标。你有什么想法如何处理吗?谢谢。 - Mina Wu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接