作者:潘星宇 (清华大学)
特别说明: 文中包含的数据可以到 [连享会|码云] 下载。
Stata连享会 主页 || 视频 || 推文
连享会 - Stata 暑期班
线上直播 9 天:2020.7.28-8.7
主讲嘉宾:连玉君 (中山大学) | 江艇 (中国人民大学)
课程主页:https://gitee.com/arlionn/PX | 微信版
空间计量方法已经成为了时下最为热门和常用的计量方法之一,而空间权重矩阵的构建则是运用空间计量方法时必不可少的“标准动作”。但在实际研究过程中,我们往往会遇到很多问题。例如,目前网络上能获取到的矩阵与我研究的样本不匹配;例如,做回归时时需要剔除一些样本单位,但如何构建与之对应的空间权重矩阵;再例如,如何构建一些广义上的“空间”权重矩阵,等等。本期我们就来和大家一起了解一下权重矩阵的构建。
通常定义一个二元对称空间权重矩阵来表达 n 个位置的空间个体(例如区域)的邻近关系:
W = [ w 11 w 12 ⋯ w 1 n w 21 w 22 ⋯ w 2 n ⋮ ⋮ ⋮ w n 1 w n 2 ⋯ w n n ] (1) \mathbf{W}=\left[\begin{array}{cccc}{w_{11}} & {w_{12}} & {\cdots} & {w_{1 n}} \\ {w_{21}} & {w_{22}} & {\cdots} & {w_{2 n}} \\ {\vdots} & {\vdots} & {} & {\vdots} \\ {w_{n 1}} & {w_{n 2}} & {\cdots} & {w_{n n}}\end{array}\right] \tag{1} W=⎣⎢⎢⎢⎡w11w21⋮wn1w12w22⋮wn2⋯⋯⋯w1nw2n⋮wnn⎦⎥⎥⎥⎤(1)
理论上讲,不存在最优的空间矩阵,即无法找到一个完全描述空间相关结构的空间矩阵。空间矩阵的构造必须满足 「空间相关性随着 ‘距离’ 的增加而减少」的原则。
需要注意的是。在空间计量中,“距离(counterfacutal) ” 的定义可以是广义的,包含但不限于地理上的相邻或者欧氏距离,也可以是经济意义上合作关系的远近,甚至可以是社会学意义上的人际关系的亲疏。
最简单的空间权重矩阵是所谓的「二进制空间权重矩阵」,使用 0 和 1 来标记个体之间的空间相邻情况,属于 定性 界定。
简单的二进制邻接矩阵的第 i i i 行第 j j j 列元素为:
w i , j = { 1 i , j 相 邻 0 i , j 不 相 邻 (2) w_{i,j}=\left\{ \begin{aligned} 1 & & i, j \ 相邻 \\ 0 & & i, j \ 不相邻 \\ \end{aligned} \right. \tag{2} wi,j={10i,j 相邻i,j 不相邻(2)
这类空间权重矩阵的第 i i i 行第 j j j 列元素为:
w i , j = { 1 i , j 距 离 小 于 d 0 i , j 距 离 大 于 或 等 于 d (3) w_{i,j}=\left\{ \begin{aligned} 1 & & i, j \ 距离小于 d \\ 0 & & i, j \ 距离大于或等于 d \\ \end{aligned} \right. \tag{3} wi,j={10i,j 距离小于di,j 距离大于或等于d(3)
如前文所述 “相邻” 可以有不同的定义。一般来说从最基本的空间概念出发,有 Rook 相邻 、Queen 相邻 等。 Rook 相邻指的有一段共同的边即认为两个单位相邻,Queen 相邻认为只要存在顶点相接,就认为两地区为 “邻居” 关系。此外还可以定义成二者 是否有相同方言 、是否同属于一个城市群 ,等等。
w i , j = { 1 i , j 属 于 同 一 概 念 范 围 ( 有 相 同 的 方 言 ) 0 i , j 属 于 不 同 概 念 范 围 ( 没 有 相 同 的 方 言 ) (4) w_{i,j}=\left\{ \begin{aligned} 1 & & i, j \ 属于同一概念范围(有相同的方言)\\ 0 & & i, j \ 属于不同概念范围(没有相同的方言)\\ \end{aligned} \right. \tag{4} wi,j={10i,j 属于同一概念范围(有相同的方言)i,j 属于不同概念范围(没有相同的方言)(4)
若考虑距离的相对大小,想要从「定量」角度刻画空间相邻性,可以使用如下权重定义方法:
w i j = 1 / d i j 2 (5) w_{i j}=1 / d_{i j}^{2} \tag{5} wij=1/dij2(5)
d i j = arcos [ ( sin ϕ i × sin ϕ j ) + ( cos ϕ i × cos ϕ j × cos ( Δ τ ) ) ] × R (6) d_{i j}=\operatorname{arcos}\left[\left(\sin \phi_{i} \times \sin \phi_{j}\right)+\left(\cos \phi_{i} \times \cos \phi_{j} \times \cos (\Delta \tau)\right)\right] \times R \tag{6} dij=arcos[(sinϕi×sinϕj)+(cosϕi×cosϕj×cos(Δτ))]×R(6)
其中: ϕ i \phi_{i} ϕi 和 ϕ j \phi_{j} ϕj 分别表示某个省份(比如地理几何中心,省会(首府)) 的纬度和经度; Δ τ \Delta \tau Δτ 为两个省份间经度之差; R R R 为地球半径,等于 3958.761 英里。在实际应用中,常对空间权重矩阵进行行标准化,空间权重矩阵的对角元素设为 0。
连享会计量方法专题……
要构建自己 “定制的” 空间权重矩阵,首先需要获得所研究空间单元的地理位置信息文件,以便于 Stata 判断相对或者绝对地理位置。这些信息通常来自于对研究单元对象的 ESRI Shapefile 文件(也就是 Stata 绘制地图时需要的所谓 “底图” 文件)。 中国的 shapefile 文件包括省级,市级和县级等各个层面的数据,可以在国家基础信息中心申请下载,或者从一些公开的网络资源获取。
本文采用中国省级行政区 shapefile 作为演示数据。
一个完整的 shapefile 文件由以下几个文件组成:
目前,Stata 中还没有能对 shapefile 文件进行编辑的命令。这一步骤一般采用 ArcGIS 或 arcview 等软件来进行。由于这一步非常重要,因此我们以 ArcGIS 软件为例,做一个简单的演示。
在 ArcGIS 主界面中,点击下图中红圈所示的图标,然后按提示选择硬盘上存储的 shpefile 文件,即可将其导入 ArcGIS。
这里假设我们的研究对象不含西藏自治区、香港特别行政区、澳门特别行政区以及台湾省,我们就需要在编辑器当中把这四个要素删除。
右键图层打开属性表,删除上面提到的四个要素:
再右键图层,选择 导出数据 :
这样,我们就有了符合我们需要的空间权重矩阵构建的 shapefile 文件,下面就需要将其导入 Stata 以便做后续分析了。
若采用空间面板数据模型进行建模,则还需要找出这些省份的经纬度等地理信息。前文已经说明了如何下载 shapefile 文件,该文件中即包含了各个国家的地理信息。那么可以将研究单元数据和 shapefile 进行合并。这里需要用到 mif2dta
或 shp2dta
命令来读取 shapefile 文件。该命令为外部命令,安装方式参考「 Stata: 外部命令的搜索、安装与使用」 。需要注意的是, 只有经纬度信息的数据集不能用于二项式空间权重矩阵的构建 ,关于这一点我们将在下文中说明。
这一过程主要是将 .shp 格式的文件编译成stata可以读取的文件,主要采用 shp2dta
命令完成。
我们来看看 shp2dta
命令的基本语法:
. shp2dta using shpfilename, ///
database(filename) coordinates(filename) ///
genid(newvarname) gencentroids(stub)
其中,
coordinates(filename)
指定包含 .shp 文件数据的新 Stata 数据集的名称。database(filename)
指定包含 .dbf 文件数据的新 Stata 数据集的名称。genid(newvarname)
指定新数值变量的名称,该数字变量在文件 database.dta 中将唯一标识感兴趣的不同地理区域。newvarname 采用的值将对应于文件 coordinates.dta 中变量 _ID 所采用的值。gencentroids(stub)
选项可以计算出地理区域的质心的坐标,存储在变量 x_stub 和 y_stub 中,并添加到文件 database.dta 中。 但我们还必须指定 genid(newvarname)
选项。
. shp2dta using "C:\Users\xypan\Desktop\连享会推文\空间权重矩阵的构建\空间权重矩阵底图\30个省市自治区.shp", ///
database(data_db) coordinates(data_xy) ///
genid(weightid) gencentroids(stub) replace
. use data_db, clear
. rename NAME province
. list province x_stub y_stub in 1/10
+------------------------------+
| province x_stub y_stub |
|------------------------------|
1. | 黑龙江 47.8418 127.725 |
2. | 新疆 41.112 85.2009 |
3. | 山西 37.5698 112.263 |
4. | 宁夏 37.2681 106.158 |
5. | 山东 36.3217 118.107 |
6. | 河南 33.8743 113.581 |
7. | 江苏 32.9807 119.42 |
8. | 安徽 31.8229 117.197 |
9. | 湖北 30.9677 112.239 |
10. | 浙江 29.1659 120.023 |
+------------------------------+
读取 shapefile 文件后,可以发现有 x_stub 和 y_stub 两个变量,分别代表了对应省份的的地理坐标。
接下来将带有地理坐标的 data_db.dta 文件和我们的数据文件匹配起来,命名为 spatialweight_province.dta:
merge 1:m province using "C:\Users\xypan\Desktop\连享会推文\空间权重矩阵的构建\省级数据.dta"
keep if _merge==3
drop _merge
save "C:\Users\xypan\Desktop\连享会推文\空间权重矩阵的构建\spatialdata_province.dta", replace
到此我们完成了几乎所有的准备工作,下一步开始正式构建空间权重矩阵。
连享会计量方法专题……
生成距离空间权重矩阵的命令语法为
spwmatrix gecon varlist [if] [in], ///
wname(wght_name) [wtype(inv) cart r(#) ///
dband(numlist) alpha(#) knn(#) ///
econvar(varname1) beta(#) Other_options]
主要选项的含义如下:
wname(wght_name)
表示要生成的空间权重矩阵的名称wtype(bin | inv | econ | invecon | socnet | socecon)
分别代表二进制,距离衰减,经济距离,逆经济距离,社会网络或社会经济空间权重dta
选择该选项以从 .dta 文件导入空间权重text
选择该选项以从逗号或制表符分隔的文本文件导入空间权重swm(idvar_name)
导入 ArcGIS 中生成的空间权重knn(#)
请求最近邻空间权重econvar(varname1)
可用此选项构建经济或逆经济距离空间权重beta(#)
指定指数函数的系数 β; 默认测试版 (1)cart
表示纬度和经度采用笛卡尔坐标,这是默认选项 (一般我们也使用的是这个);如果采用球面坐标则只能选择 r(#)
,此时不能同时选择 cart
,并且需要指定地球半径距离(英里),一般默认填写 r(3958.761)
;dband(numlist)
表示最大的权重矩阵边界,其中的 numlist
表示确定边界的变量,一般是各省份代码的最大值;alpha(#)
表示参数限制范围,默认为 alpha(1)
;use spatialdata_province.dta,clear
spwmatrix gecon x_stub y_stub , wn(spatialweight_province) wtype(inv) cart alpha(1)
xport(spatialweight_province,txt) row replace \\生成名为 spatialweight_province 的权重矩阵
spmat import spatialweight_province using spatialdata_province.txt,replace \\导入 spatialweight_province 权重矩阵
spmat save spatialweight_province using spatialweight_pro.spmat,replace //将生成的 spmat 权重文件存储为spatialweight_pro
spmat use spatialweight_pro using spatialweight_pro.spmat,replace //打开 spmat 权重文件
matrix list spatialweight_pro //查看 spatialweight_pro 权重矩阵
这样,反距离空间权重矩阵就生成了,由于矩阵展开太大,囿于篇幅限制这里不做展示。
经济距离矩阵的计算公式为
use spatialdata_province.dta,clear
spwmatrix gecon x_c y_c, wn(province) wtype(invecon) cart econvar(GDP_2000) rowstand xport(spatialdata_province,txt) replace\\由于选择的是 invecon(经济反距离矩阵)因此需要声明相应的经济变量
spmat import spatialweight_province using spatialdata_province.txt,replace //生成以spatialweight_province 为名称的 spmat 权重文件
其他导入、存储和查看方法同上,不再赘述。
构建地理相邻空间权重矩阵时,之前计算的含有地理坐标的 spatialdata_province.dta 文件将不再适用,需要将我们编辑好的 .shp 文件导入 Geoda 软件,再导出 .gal 文件,再使用 spwmatrix
命令进行编译即可使用。导入过程非常简单,故在此略过。
use spatialdata_province.dta,clear
spwmatrix import using C:\连享会推文\空间权重矩阵的构建\空间权重矩阵底图\spatialdata_province.gal,wname(wcontig) xport(spatialdata_province, dat) \\.gal 只能导出 .dat (不是 .dta,.dat 是 R 语言中一种通用的文件格式)格式的文件
spmat import spatialweight_province using spatialdata_province.dat,replace
其他导入、存储和查看方法同上。
这里我们采用文章开头提到过的二者是否有相同方言,我们采用徐现祥老师公布的方言数据,将方言赋值(因为 spmatrix
命令无法识别字符型变量),官话赋值为1,吴语赋值为2,以此类推。同属于一个方言区的省份我们赋值为1,不同的我们赋值为0.
use fangyan.dta, clear
spwmatrix socio fangyan_id, wname(fangyan) wtype(socnet) idvar(provinceid) xport(spatialdata_province,txt) \\fangyan_id代表我们的方言代理哑变量
其他导入、存储和查看方法同上。
xsmle
等命令可以也支持多个空间权重矩阵的回归。特别说明: 文中包含的数据可以到 [连享会|码云] 下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, 暑期班
stata, plus,Profile, 手册, SJ, 外部命令, profile, mata, 绘图, 编程, 数据, 可视化
DID,RDD, PSM,IV,DID, DDD, 合成控制法,内生性, 事件研究
交乘, 平方项, 缺失值, 离群值, 缩尾, R2, 乱码, 结果
Probit, Logit, tobit, MLE, GMM, DEA, Bootstrap, bs, MC, TFP
, 面板, 直击面板数据, 动态面板, VAR, 生存分析, 分位数
空间, 空间计量, 连老师, 直播, 爬虫, 文本, 正则, python
Markdown, Markdown幻灯片, marp, 工具, 软件, Sai2, gInk, Annotator, 手写批注
, 盈余管理, 特斯拉, 甲壳虫, 论文重现
, 易懂教程, 码云, 教程, 知乎