spatwmat 命令的报错:matrix not symmetric 如何解决?Stata 如何把非对称矩阵转换成对称矩阵?

刚刚有个小伙伴问了这样的一个问题:

也就是使用 spatwmat 命令添加 eigenval(E) 选项(用于生成特征值矩阵)之后就报错了。

这个问题的根源在于提供的 13.dta 数据不是一个对称的矩阵,所以根本的解决办法就是检查 13.dta 为什么不是对称的。例如这里的 13.dta 数据是这样的:

显然不是对称的。

除了把数据替换成对称数据外,我们还可以使用 Stata 对数据进行矫正以使其对称。

* 安装 spatwmat:
net install sg162.pkg, from(http://www.stata.com/stb/stb60)

首先读取这个不对称的 13.dta 数据:

use 13.dta, clear

然后是 mata 的 makesymmetric() 函数进行矫正:

mata:
a = st_data(., .)
b = makesymmetric(a)
st_store(., ., b)
end

其中 st_data() 函数是可以把 dta 数据读取为 mata 的矩阵,st_store() 则是把 mata 的矩阵输出为 dta 数据;., .表示所有行和所有列。

然后把得到的对称数据保存为 14.dta:

save 14.dta, replace

使用 14.dta 运行最初的代码就不会报错了:

spatwmat using 14.dta, name(W) standardize eigenval(E)

*> The following matrices have been created:
*>
*> 1. Imported non-binary weights matrix W (row-standardized)
*> Dimension: 1097x1097
*>
*> 2. Eigenvalues matrix E
*> Dimension: 1097x1

然后运行 mat list W 和 mat list E 就可以看到运行结果了。

点击这里跳转到 RStata 短书平台获取附件:spatwmat 命令的报错:matrix not symmetric 如何解决?Stata 如何把非对称矩阵转换成对称矩阵?

评论