热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Rplot图片背景设置为透明_R语言基于spdep包计算莫兰指数

数据和代码下载请点击“阅读原文”提取码:t2c9【导读】利用spdep包中的poly2nb等函数构建空间邻接关系,然后用moran.test函数计算莫兰指数ÿ

数据和代码下载请点击“阅读原文” 提取码: t2c9  

  【导读】

利用spdep包中的poly2nb等函数构建空间邻接关系,然后用moran.test函数计算莫兰指数,可实现批量计算,这是GeoDa等软件所不具备的优势。

这个学期在上研究生的区域经济研究方法课,正好利用这个机会讲一下空间计量经济分析:一是空间自相关检验,二是空间横截面数据分析,三是空间面板数据分析。先从空间自相关分析开始。

一、计算步骤

计算莫兰指数需要准备:一列观测数据(属性数据),以及表达观测单元空间相邻或距离远近关系的权重数据(矩阵),关键是后者。

空间权重数据(矩阵)需要基于shape文件生成。这里要注意的是,确保属性数据和权重数据对应的空间单元顺序一致。在R语言里,其做法为:首先用rgdal包中的readOGR函数读入shape文件为spatial对象,其次用poly2nb函数基于spatial对象得到各单元间的邻接关系,即nb对象,最后用nb2listw函数将nb对象转成listw对象,就可以输入相应函数进行空间自相关和空间回归分析了。在构建空间权重时,还有其他函数,如基于距离范围找邻居的dnearneigh函数、找k个最近邻居的knearneigh函数、计算邻居直线或大圆距离的nbdists函数等,可参看spdep包说明,这里采用最常用的邻接关系来获得空间权重。

9f6ebd4a-0714-eb11-8da9-e4434bdf6706.png

二、基本计算

这里以中国大陆31个省级单元2000-2010年的规模以上工业产出数据为例,演示如何计算莫兰指数。先计算2000年规模以上工业总产值的空间自相关莫兰指数。

首先读入属性数据:

代码1:准备属性数据

# install needed packages if not

> install.packages(c("spdep",  "rgdal"))

> library(spdep)

> library(rgdal)

# set your own working directory if not

> setwd("E:\\Spatial_Econometrics_for_Graduates\\R")

> mydata 中国省份规模以上工业生产数据_2000_2010.csv", stringsAsFactors = F)

# view data

> head(mydata)

    省份年份工业总产值固定资产净值全部从业人员

1   北京 2000    2565.38      1517.20       113.13

2   天津 2000    2606.38      1561.39       120.19

3   河北 2000    3426.05      2285.01       269.75

4   山西 2000    1216.86      1473.69       183.56

5 内蒙古 2000     748.97       946.87        85.34

6   辽宁 2000    4249.46      3449.08       295.18

接着准备权重数据。这里需要注意三个细节:一是原始的shape文件包含了港澳台,需要先去掉;二是shape文件中的省份排列顺序与属性数据不一致,需要调整为与属性数据一致;三是海南没有邻居,这里指定广东为其邻居,同时需要将二者的空间邻接关系调整为对称。

代码2:准备空间权重数据

# generate spatial weights object

> shp stringsAsFactors = F, encoding =  "UTF-8")

# remove Hongkong, Macau and Taiwan

> shp 香港", "澳门", "台湾"))

# make observation order in spatial data same  as attribute data

> row.names(shp)

> shp 年份 == 2000, "省份"],]

# get nb object from polygon object, need a  little while

> mynb

# look into mynb, find Hainan has no  neighbour

> mynb

1 region with no links: 海南

# make Guangdong and Hainan to be neighbours  each other

> number.hainan 海南")

> number.guangdong 广东")

> mynb[[number.hainan]]

# make neighbour relation symmetric

> mynb

# see if nb object is really symmetric

> is.symmetric.nb(mynb)

[1] TRUE

# transform nb object to nblistw object, row  standardisation as default

> mylistw

万事大吉!最后是计算莫兰指数。需要注意的是,莫兰指数的检验是基于标准化后的莫兰指数统计量的分布来进行的。在计算这一分布的方差时,有两种做法:一是基于随机排列模拟计算,二是假设数据为正态分布根据理论公式推算。moran.test函数默认通过随机模拟来进行显著性检验。如其参数设置randomisation = FALSE,则为正态分布假设。由于空间自相关一般为正相关,因此默认的检验方向为“greater”。

代码3:计算莫兰指数

# calculate Moran's index under assumption of  normality

> x 年份 == 2000, "工业总产值"]

> moran.test(x, mylistw, randomisation =  FALSE, alternative = "two.sided")

Moran I statistic standard deviate = 1.6897,  p-value = 0.09108

alternative hypothesis: two.sided

sample estimates:

Moran I statistic       Expectation          Variance

        0.16690302        -0.03333333        0.01404318

为了解莫兰指数的检验机制,我们下面来随机模拟一下。为减少随机误差,模拟次数为9999次,加上实际数据给出的一次,共10000次。

代码4:莫兰指数模拟

# Moran's index random simulation

> set.seed(12345)

> morperm

> morperm$res[10000]

[1] 0.166903

# plot simulated Moran's index

> morp

> md

> plot(md, main="Moran's I  Permutation Test", xlab = "Reference  Distribution", xlim = c(-0.4, 0.55), ylim =  c(0, 4), lwd = 2, col = 2)

> hist(morp, freq = F, add = T)

> abline(v = morperm$statistic, lwd = 2,  col = 4)

a06ebd4a-0714-eb11-8da9-e4434bdf6706.png

将属性数据标准化后,利用lag.listw函数计算其空间滞后值,可画出莫兰散点图。同时还可发现,莫兰指数实际上等于空间滞后值对其本身值(需要事先标准化)的回归系数。

代码5:莫兰散点图

# Moran's Index scatter plot

> production

> moran.plot(production, mylistw)

# Moran's index equals standardized  regression coefficient

> wx

> lm(wx ~ x)

 (Intercept)            x   

      0.1027         0.1669   

a26ebd4a-0714-eb11-8da9-e4434bdf6706.png

最后,让我们批量计算2000-2010年全部年份的莫兰指数,绘图表示:

代码6:批量计算2000-2010年的莫兰指数

# batch calculate Moran's indexes for all  years

> moran.all 工业总产值, mydata$年份, moran.test, mylistw)

> statistic

> p.value

> moran.all

> plot(2000:2010, moran.all$statistic,  type = "o", xlab = "year", ylab = "Moran's I")

> text(2000:2010, moran.all$statistic,  round(moran.all$statistic, 3), cex = 0.8)

a36ebd4a-0714-eb11-8da9-e4434bdf6706.png

数据下载请关注微信公众号:“思达区域经济研究方法”,SDAR-workshop

交流请加微信群:“思达区域经济研究方法”,需邀请加入,请注明“单位名称+姓名”

扫码或长按,关注该微信号

a56ebd4a-0714-eb11-8da9-e4434bdf6706.jpeg

版权申明

本号所有图文资料,除特别说明外,其版权归浙江工业大学王庆喜领衔的“思达工作室”所有。转发、引用请注明原始出处。

网络链接

1、网易博客:http://wqx1976.blog.163.com/

2、人大经济论坛账号:R语言区域经济

3、知乎账号:sdar,  https://www.zhihu.com/people/sdar-77

公众号功能

1、致力于打造中国R语言空间数据分析第号;

2、探讨R语言、ArcGIS、matlab、GeoDa、Stata、SPSS等软件在空间数据分析中的应用;

3、讨论产业集聚、空间溢出、区域创新网络、城市群发展等热门研究主题。




推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
author-avatar
手机用户2502908275
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有