内容转自小红书-武汉大学李英冰
标准差椭圆
标准差椭圆可用于理解空间数据的分布特征和不确定性,反映空间现象的内在规律。例如在曼哈顿区MIN17区,2015年至2018年共发生交通事故18414 起,平均每平方公里发生6565起,可以利用平均中心和标准差椭圆进行交通事故空间分布。
1.平均中心
通过计算数据的平均中心位置,可以直观地发现事故的聚集情况,挖掘出事故随时间变化的偏移趋势。
2. 标准差椭圆
一组数据点在空间上的聚集性和方向性可以用标准差椭圆。椭圆的长半轴方向代表事件点在空间上的延伸方向,短半轴的长度则体现了事件点的聚集程度,短半轴越短,说明事件点在空间上越聚集。椭圆的扁率越大,即长短半轴的值之比越大,说明事件点越具有明显的方向性;反之,如果椭圆扁率越小,说明事件点越不具有方向性,当椭圆扁率为1时,说明事件点在空间上的分布不具有方向性。
以所有事件点的平均中心为基准,计算所有事件点𝑥坐标和𝑦坐标的标准差,然后由标准差的大小来确定椭圆的长半轴和短半轴,此时作出的椭圆就是事件点的标准差椭圆。
实现过程如下
public Result CalEll(List<Data> data)
{
int n = data.Count;
double X_ave = data.Average(o => o.x);
double Y_ave = data.Average(o => o.y); ;
for (int i = 0; i < data.Count; i++)
{
data[i].a = data[i].x - X_ave;
data[i].b = data[i].y - Y_ave;
}
double sum_a2 = data.Sum(o => (o.a * o.a));
double sum_b2 = data.Sum(o => (o.b * o.b));
double sum_ab = data.Sum(o => (o.a * o.b));
double s_up = sum_a2 - sum_b2 + Math.Pow(Math.Pow(sum_a2 - sum_b2, 2) + 4 * Math.Pow(sum_ab, 2), 0.5);
double sita = Math.Atan(s_up / (2 * sum_ab));
double up1 = 0, up2 = 0;
for (int i = 0; i < data.Count; i++)
{
up1 += Math.Pow(data[i].a * Math.Cos(sita) + data[i].b * Math.Sin(sita), 2);
up2 += Math.Pow(data[i].a * Math.Sin(sita) - data[i].b * Math.Cos(sita), 2);
}
double SDEx = Math.Sqrt(2 * up1 / n);
double SDEy = Math.Sqrt(2 * up2 / n);
double sin_sita = Math.Sin(sita);
double cos_sita = Math.Cos(sita);
Result re = new Result(X_ave, Y_ave, SDEx, SDEy, sin_sita, cos_sita);
return re;
}
空间权重矩阵
空间权重矩阵(Spatial Weight Matrix)是一个用于量化地理单元之间相互影响的矩阵。矩阵中的每个元素表示两个地理单元之间的空间联系强度。
地理学第一定律表明“任何事物都是与其他事物相关的,只不过相近的事物关联更紧密”。这一定律强调了空间中的关联性和依赖性。空间权重矩阵则是对这种空间关联性的量化表达。
空间权重矩阵应用广泛:在城市规划中,可助分析商业中心对周边区域经济带动,合理布局商业区;房地产研究中,能反映地段房价相互影响,预测价格变化;流行病学里,有助于了解疾病传播模式,判断周边地区受影响程度;交通规划中,明确交通节点关联强度,评估新建站点对流量的改变;环境研究时,分析污染扩散范围和影响程度。它是解决空间相关问题的有力工具。
空间权重矩阵的构建方法主要分为以下两类:
基于邻接关系:包含一阶邻接矩阵、二阶邻接矩阵以及高阶邻接矩阵。
基于距离关系:涵盖质心距离、经济距离、时间距离等。在多边形地理单元中,其相互之间的距离往往依据各区域质心之间的欧式距离予以确定
基于邻接关系构建空间权重矩阵,常见方法有rook、Bishop、queen 邻接矩阵等。rook 认为有共同边即相邻;Bishop认为存在共同顶点则相邻,queen 则存在边或顶点相接即视为相邻。矩阵元素用 0 和 1 标记相邻与否。
基于距离关系构建空间权重矩阵,常见方法有:
反距离权重矩阵,认为距离近影响大权重高,实际应用中可调整参数。
半径距离权重矩阵,预先设半径阈值,单元间距离小于等于阈值则权重为 1,否则为 0,只考虑一定半径内单元相关性。
K 个邻近权重矩阵,确定每个单元的 K 个近邻,若为近邻则权重为 1/K,否则为 0,每个单元邻居固定为 K 个。
空间权重矩阵常要标准化,主要有行标准化和全局标准化。行标准化让每行元素总和是 1 。全局标准化则对整个矩阵元素调整。标准化能让不同矩阵可比,保证分析合理稳定,消除量纲影响。
实现过程如下
public double[,] CalMatrix(List<Data> data)
{
int n = data.Count;
double[,] matrix = new double[n, n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j)
{
matrix[i, j] = 0;
}
else
{
matrix[i, j] = GetDisW(data[i], data[j]);
}
}
}
//行标准化
for (int i = 0; i < n; i++)
{
double sum = 0;
for (int j = 0; j < n; j++)
{
sum += matrix[i, j];
}
for (int j = 0; j < n; j++)
{
matrix[i, j] = matrix[i, j] / sum;
}
}
return matrix;
}
public double GetDisW(Data d1, Data d2)
{
double d = Math.Sqrt(Math.Pow(d2.x - d1.x, 2) + Math.Pow(d2.y - d1.y, 2) + Math.Pow(d2.z - d1.z, 2));
double w = 1 / (d * d);
return w;
}
莫兰指数
莫兰指数的核心思想:评估一个区域内的观测值与其相邻区域观测值之间的相似程度。取值范围在-1到1之间。正数表示相似属性值聚集在一起;负数则表示离散形式;接近0则表示随机分布。
全局莫兰指数:表明总体空间相关性是正相关、负相关还是随机分布。
局部莫兰指数:揭示局部区域内的空间相关性模式,例如高值聚集(HH)、低值聚集(LL)、高值被低值包围(HL)或低值被高值包围(LH)等。
Z 值(Z-score)用于衡量观测值偏离其期望值的程度;P 值(P-value)则是用于检验原假设(通常是假设不存在空间自相关)的概率。
public void CalMoran(List<Data> data, double[,] w, Result re)
{
//计算全局莫兰指数
int n = w.GetLength(0);
double v_ave = data.Average(o => o.Value);
double up = 0, down = 0, S0 = 0;
for (int i = 0; i < n; i++)
{
down += Math.Pow(data[i].Value - v_ave, 2);
for (int j = 0; j < n; j++)
{
up += w[i, j] * (data[i].Value - v_ave) * (data[j].Value - v_ave);
S0 += w[i, j];
}
}
double I = n / S0 * up / down;
re.I = I;
//计算局部莫兰指数
for (int i = 0; i < n; i++)
{
double up2 = 0, S2 = 0;
for (int j = 0; j < n; j++)
{
if (j != i)
{
up2 += w[i, j] * (data[j].Value - v_ave);
S2 += Math.Pow((data[j].Value - v_ave), 2);
}
}
S2 = S2 / (n - 1);
double l_up = data[i].Value - v_ave;
data[i].I = l_up / S2 * up2;
}
//z-score
double z_down = data.Sum(o => Math.Pow(o.Value - v_ave, 2));
for (int i = 0; i < n; i++)
{
double z_up = data[i].Value - v_ave;
data[i].Z_score = z_up / Math.Sqrt(z_down / n);
}
}
最终计算结果如图