查看原文
其他

Matlab:莫兰指数的编程实现

连享会 连享会 2023-02-21

👇 连享会 · 推文导航 | www.lianxh.cn


连享会 · 2022 面板数据因果推断专题

作者:陈子厚 (中共广东省委党校)
邮箱:econometricalc@outlook.com

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:


目录

  • 1. 莫兰指数的定义与公式

  • 2. 莫兰指数的 Matlab 编程

    • 2.1 Matlab 的编程实现

    • 2.2 与 Stata 结果的验证

  • 3. 附录

  • 4. 相关推文



计算莫兰指数的软件非常多,例如 Stata,详见连享会推文「Stata:面板数据的莫兰指数计算与散点图绘制-xtmoran」。本文主要借助 Matlab 实现莫兰指数的计算,有编程兴趣的同学,可以将此代码作为练习。

1. 莫兰指数的定义与公式

莫兰指数是全域莫兰指数 (Global Moran's I) 的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰在 1950 年提出的,是最常用的空间自相关指标。其计算公式如下:

公式中 分别表示第 个空间单元和第 个空间单元的特征值 (如:人均 GDP), 为地区个数, 为空间权重矩阵。莫兰指数值在正负 1 之间,正值代表正相关性,负值代表负相关性,值越大表示空间集聚性越强,趋于 0 表示在空间中随机分布。

对于莫兰指数的检验,原假设 为:不存在空间自相关。按照假设检验方法,当区域个数 足够大时,全局莫兰指数近似服从正态分布,即:

莫兰指数统计量的期望公式如下:

莫兰指数统计量的方差公式如下:

2. 莫兰指数的 Matlab 编程

为了方便理解和实现 Matlab 编程,需要将莫兰指数公式简化,并分成两部分:一是莫兰指数值的公式简化;二是莫兰指数的检验公式简化。首先,将莫兰指数的公式简化:

其中,,如果矩阵进行标准化,则

其次,将莫兰指数的检验公式简化,其关键在于 的简化,难点在于统计量方差公式中 的简化。这里参考姜磊老师书籍《应用空间计量经济学》(P33 页) 与「Global Moran's I 其他数学计算」,计算如下:

2.1 Matlab 的编程实现

首先,借助上述公式的简化,莫兰指数值的编程实现如下所示。需要注意的是,数据要按列存放,每一列是一年的数据,这里以一列数据 x (即一年数据) 为例。

s0=n;
s=var(x,1);
m=mean(x);
y=0;
for i=1:n
  for j=1:n
    y=y+w(i,j)*(x(i)-m)*(x(j)-m);
  end
end
moran=y/(s*n);

其次,莫兰指数检验的实现。

%% 1. 求解 S1, S2, D
%% 求解 S1
s1=0;
for i=1:n
  for j=1:n
    s1=s1+(w(i,j)+w(j,i))^2;
  end
end
s1=s1/2;
%% 求解 S2
s2=0;
for i=1:n
    w12(i)=0;
    w21(i)=0;
  for j=1:n
     w12(i)=w12(i)+w(i,j);
     w21(i)=w21(i)+w(j,i);
  end
    s2=s2+(w12(i)+w21(i))^2;%S2
end
%% 求解 D
d1=x-m;
d2=sum(d1.^4);
d3=(sum(d1.^2))^2;
d=d2/d3;

%% 2. 求解 A, B, C;
A=n*((n^2-3*n+3)*s1-n*s2+3*s0^2);
B=d*n*((n^2-n)*s1-2*n*s2+6*s0^2);
C=s0^2*(n-1)*(n-2)*(n-3);

%% 3. 求解 ei 值, sd 值, Z 值, P 值 
ei=-1/(n-1);
ei2=ei^2;
varc=((A-B)/C)-ei2;
sd=varc^(1/2);
z=(moran-ei)/sd;
P = 2 * (1-normcdf(abs(z)));

最后,将结果汇总。

reults=[moran ei sd z  P];

以上程序为计算一年的莫兰指数,可以运用循环计算出多年的莫兰指数,演示数据计算的结果如下所示:

莫兰检验结果 (第一列为I(莫兰指数), 第二列为 E(I), 第三列为 SD(I), 第四列为 Z, 第五列为 P)

I =
    0.3178   -0.0345    0.1180    2.9847    0.0028
    0.3524   -0.0345    0.1148    3.3692    0.0008
    0.3526   -0.0345    0.1149    3.3681    0.0008
    0.3517   -0.0345    0.1150    3.3583    0.0008
    0.3409   -0.0345    0.1154    3.2529    0.0011
    0.3475   -0.0345    0.1151    3.3198    0.0009
    0.3581   -0.0345    0.1143    3.4358    0.0006

2.2 与 Stata 结果的验证

将数据另存为 dta 格式,并导入 Stata,运用 spatgsa 命令计算莫兰指数。

* 调入空间权重
spatwmat using 矩阵.dta,name(W) standardize

* 调用数据
use 数据.dta,clear

* 全局莫兰指数
spatgsa a2012 a2013 a2014 a2015 a2016 a2017 a2018 ,weights(W) twotail moran

可以看出,Stata 与 Matlab计算的结果是一致的。

Measures of global spatial autocorrelation
Weights matrix
--------------------------------------------------------------
Name: W
Type: Imported (binary)
Row-standardized: Yes
--------------------------------------------------------------
Moran's I
--------------------------------------------------------------
Variables | I E(I) sd(I) z p-value*
--------------------+-----------------------------------------
a2012 | 0.3178 -0.0345 0.1180 2.9847 0.0028
a2013 | 0.3524 -0.0345 0.1148 3.3692 0.0008
a2014 | 0.3526 -0.0345 0.1149 3.3681 0.0008
a2015 | 0.3517 -0.0345 0.1150 3.3583 0.0008
a2016 | 0.3409 -0.0345 0.1154 3.2529 0.0011
a2017 | 0.3475 -0.0345 0.1151 3.3198 0.0009
a2018 | 0.3581 -0.0345 0.1143 3.4358 0.0006
--------------------------------------------------------------
*2-tail test

3. 附录

clear;clc;
A = xlsread('莫兰指数数据.xlsx'); %按列存放, 每一列是一年的数据
W = xlsread('空间邻接矩阵.xlsx');
Y=A(:,3:9);    % 按列存放, 每一列是一年的数据
[n,T]=size(Y);
w = normw(W);  % 行标准化, 借助 jplv7 工具包的 normw 函数

for k=1:T
x=Y(:,k);  % 第 K 年的数据

%% 求莫兰指数值    
s0=n;
s=var(x,1);
m=mean(x);
y=0;
for i=1:n
  for j=1:n
    y=y+w(i,j)*(x(i)-m)*(x(j)-m);
  end
end
moran=y/(s*n);

%% 求解 S1
s1=0;
for i=1:n
  for j=1:n
    s1=s1+(w(i,j)+w(j,i))^2;
  end
end
s1=s1/2;

%% 求解 S2
s2=0;
for i=1:n
    w12(i)=0;
    w21(i)=0;
  for j=1:n
      w12(i)=w12(i)+w(i,j);
      w21(i)=w21(i)+w(j,i);
  end
    s2=s2+(w12(i)+w21(i))^2;%S2
end

%% 求解 D
d1=x-m;
d2=sum(d1.^4);
d3=(sum(d1.^2))^2;
d=d2/d3;
%% 求解A,B,C
A=n*((n^2-3*n+3)*s1-n*s2+3*s0^2);
B=d*n*((n^2-n)*s1-2*n*s2+6*s0^2);
C=s0^2*(n-1)*(n-2)*(n-3);

%% 求解 ei 值, sd 值, Z 值, P 值 
ei=-1/(n-1);
ei2=ei^2;
varc=((A-B)/C)-ei2;
sd=varc^(1/2);
z=(moran-ei)/sd;
P = 2 * (1-normcdf(abs(z)));
reults=[moran ei sd z  P];
I(k,:)=reults;
end

% 列表显示莫兰指数结果
fprintf(1,'莫兰检验结果(第一列为I 第二列为E(I) 第三列为SD(I) 第四列为Z 第五列为P)')
I

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 空间计量, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题:Stata命令
    • Stata:空间计量之用-spmap-绘制地图.md
  • 专题:Stata绘图
    • Stata空间计量:莫兰指数绘图moranplot命令介绍
  • 专题:空间计量-网络分析
    • Stata:空间计量模型双权重-spm
    • Stata:批量获取经纬度数据-空间计量
    • Stata空间计量:STAR-时空自回归模型
    • Stata:一文遍览Stata官方空间计量命令:sp系列命令
    • 刘迪:Stata空间溢出效应的动态图形-空间计量
    • 空间计量溢出效应的动态GIF演示
    • 空间计量:地理加权归回模型-(GWR)-参数估计
  • 专题:公开课
    • 连享会公开课:空间计量建模与高质量论文撰写--范巧教授
  • 专题:最新课程
    • ⏩ 2022空间计量专题-连享会
  • 专题:公开课
    • ⏩重磅推荐:范巧——空间计量经济学公开课
    • 重磅推荐:杨海生——空间计量公开课

课程推荐:面板数据因果推断
主讲老师:徐轶青 (斯坦福大学)
🍓 课程主页https://gitee.com/arlionn/Course

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存