如何使用ArcGIS,Python和SPSS / R进行地理加权主成分分析?


32

我正在寻求进行地理加权主成分分析(GWPCA)的描述/方法。我很高兴使用Python进行任何此操作,并且我想象SPSS或R用于在地理加权变量上运行PCA。

我的数据集由大约30个独立变量组成,这些变量在整个550个人口普查区域(矢量几何)中进行了测量。

我知道这是一个加载的问题。但是,当我进行搜索时,似乎没有任何解决方案。我遇到的是一些数学方程式,它们解释了GWPCA(和GWR)的基本组成。从某种意义上讲,我所追求的是更多的应用,我正在寻找从原始数据到GWPCA结果所需要完成的主要步骤。


由于下面收到的评论,我想在第一部分对此进行扩展。

为了向保罗讲话...

我基于以下论文对GWPCA感兴趣:

劳埃德,CD,(2010年)。使用地理加权主成分分析法分析人口特征:以2001年北爱尔兰为例。计算机,环境与城市系统,34(5),第389-399页。

对于那些没有文献资料的人,我随附了特定章节的屏幕截图,这些截图解释了以下数学:

文章

为了解决胡言乱语...

在不赘述的情况下(机密性),我们尝试将30个变量(我们认为都是很好的指标)(尽管在全球范围内)减少为特征值大于1的组件集。通过计算地理位置加权分量,我们尝试了解这些组件所解释的局部方差。

我认为我们的主要目标是证明GWPCA的概念,即证明我们数据的空间明确性,并且我们不能认为所有自变量都可以在全球范围内解释。而是,每个组成部分将确定的局部规模(社区)将帮助我们理解数据的多维本质(如何将变量彼此组合以解释研究区域中的某些社区)。

我们希望映射每个组件所占的差异百分比(分别),以了解所讨论组件所解释的邻域范围(帮助我们了解组件的局部空间性)。也许还有其他一些映射示例,但目前还没有想到。

另外:

鉴于我在地理分析和社会统计方面的背景,GWPCA背后的数学超出了我的理解。数学的应用是最重要的,也就是说,我要如何插入这些变量/公式。


1
我不知道R中有一个开箱即用的解决方案,但是应该不会太困难。如果您希望获得的反馈比“ R可以做到”更多,请发布相关的数学公式。
Paul Hiemstra

2
您在寻找什么样的结果?最大的特征值?主成分估计数量?主要步骤应该足够清楚-一点上,选择权重,计算加权协方差(或相关性)矩阵,并从该矩阵的SVD获得PCA。重复一堆点。您是否在寻找任何这些步骤的详细信息?
ub

我很高兴,呜咽。说明我的观点。n.rows = 20 n.cols = 30 sq = seq(1,600)rast = raster(matrix(sq,nrow = n.rows,byrow = T))rast2 = raster(matrix(sq,nrow = n.cols)) rast2被翻转。如果您查看地图,就会发现实际上有20列而不是30列(x轴上的宽单元格只有20列)。只是想帮忙。

您可能想知道即将推出的R的GW方法新改进包,包括GW PCA,它在上个月的GISRUK 2013上展出。
AnserGIS 2013年

基于OP对所需分析的扩展描述,我强烈建议您调查有关“相邻矩阵的主坐标”(AKA,Moran的特征向量)的文献。该方法最初是在'Borcard D.,&P.Legendre(2002)通过邻域矩阵的主坐标对生态数据进行全尺度空间分析中提出的。生态模型153:51-68',它对于跨多个空间尺度域的数据评估非常有力,而GWPCA不会这样做。该方法是在spaceMaker和PCNM R库中实现的。
杰弗里·埃文斯

Answers:


29

“地理加权PCA”非常具有描述性:在中R,该程序实际上编写了自己。(它需要比实际代码行更多的注释行。)

让我们从权重开始,因为这是PCA本身在地理位置上加权PCA零件公司的地方。术语“地理”是指权重取决于基点和数据位置之间的距离。标准-绝不是唯一-加权是高斯函数;即,指数衰减与距离成平方。用户需要指定衰减率,或更直观地说,是要指定固定衰减量的特征距离。

distance.weight <- function(x, xy, tau) {
  # x is a vector location
  # xy is an array of locations, one per row
  # tau is the bandwidth
  # Returns a vector of weights
  apply(xy, 1, function(z) exp(-(z-x) %*% (z-x) / (2 * tau^2)))
}

PCA应用于协方差或相关矩阵(从协方差派生)。那么,这里是一个以数值稳定方式计算加权协方差的函数。

covariance <- function(y, weights) {
  # y is an m by n matrix
  # weights is length m
  # Returns the weighted covariance matrix of y (by columns).
  if (missing(weights)) return (cov(y))
  w <- zapsmall(weights / sum(weights)) # Standardize the weights
  y.bar <- apply(y * w, 2, sum)         # Compute column means
  z <- t(y) - y.bar                     # Remove the means
  z %*% (w * t(z))  
}

通过使用每个变量的度量单位的标准偏差,以通常的方式得出相关性:

correlation <- function(y, weights) {
  z <- covariance(y, weights)
  sigma <- sqrt(diag(z))       # Standard deviations
  z / (sigma %o% sigma)
}

现在我们可以执行PCA了:

gw.pca <- function(x, xy, y, tau) {
  # x is a vector denoting a location
  # xy is a set of locations as row vectors
  # y is an array of attributes, also as rows
  # tau is a bandwidth
  # Returns a `princomp` object for the geographically weighted PCA
  # ..of y relative to the point x.
  w <- distance.weight(x, xy, tau)
  princomp(covmat=correlation(y, w))
}

(到目前为止,总共有10行可执行代码。在下面描述要执行分析的网格之后,下面只需要一行。)


让我们用与问题中描述的数据相当的一些随机样本数据进行说明:550个位置的30个变量。

set.seed(17)
n.data <- 550
n.vars <- 30
xy <- matrix(rnorm(n.data * 2), ncol=2)
y <- matrix(rnorm(n.data * n.vars), ncol=n.vars)

地理位置加权计算通常是在选定的一组位置上执行的,例如沿着横断面或在规则网格的点上。让我们使用一个粗略的网格对结果进行一些透视;稍后-一旦我们确信一切都能正常运行并且我们得到了想要的-我们就可以优化网格。

# Create a grid for the GWPCA, sweeping in rows
# from top to bottom.
xmin <- min(xy[,1]); xmax <- max(xy[,1]); n.cols <- 30
ymin <- min(xy[,2]); ymax <- max(xy[,2]); n.rows <- 20
dx <- seq(from=xmin, to=xmax, length.out=n.cols)
dy <- seq(from=ymin, to=ymax, length.out=n.rows)
points <- cbind(rep(dx, length(dy)),
                as.vector(sapply(rev(dy), function(u) rep(u, length(dx)))))

我们希望从每个PCA中保留哪些信息,这是一个问题。通常,用于n个变量的PCA 返回n个特征值的排序列表,并以各种形式返回n个向量的对应列表,每个向量的长度为n。要映射的是n *(n + 1)个数字!从问题中得到一些提示,让我们映射特征值。这些是gw.pca通过$sdev属性的输出提取的,该属性是按降序排列的特征值列表。

# Illustrate GWPCA by obtaining all eigenvalues at each grid point.
system.time(z <- apply(points, 1, function(x) gw.pca(x, xy, y, 1)$sdev))

此操作在此计算机上不到5秒即可完成。请注意,对的调用使用的特征距离(或“带宽”)为1 gw.pca


剩下的就是清理。让我们使用raster库映射结果。(相反,可以将结果以网格格式写出,以便使用GIS进行后期处理。)

library("raster")
to.raster <- function(u) raster(matrix(u, nrow=n.cols), 
                                xmn=xmin, xmx=xmax, ymn=ymin, ymx=ymax)
maps <- apply(z, 1, to.raster)
par(mfrow=c(2,2))
tmp <- lapply(maps, function(m) {plot(m); points(xy, pch=19)})

地图

这些是30张地图中的前四张,显示了四个最大的特征值。(不要对它们的大小感到兴奋,每个地方的大小都超过1。回想一下,这些数据是完全随机生成的,因此,如果它们根本具有任何相关结构,则这些图中的特征值似乎表明了这一点-这完全是出于偶然,并不反映任何解释数据生成过程的“真实”信息。)

更改带宽很有帮助。如果太小,软件将抱怨奇异之处。(我没有在此基本实现中进行任何错误检查。)但是将其从1减少到1/4(并使用与以前相同的数据)确实会得到有趣的结果:

地图2

请注意,边界周围的点趋向于给出异常大的主特征值(显示在左上图的绿色位置),而所有其他特征值都被压低以进行补偿(在其他三幅图中显示为浅粉红色) 。在人们希望可靠地解释PCA的地理加权版本之前,需要先了解这一现象以及PCA和地理加权的许多其他细微之处。然后还有其他30 * 30 = 900个特征向量(或“载荷”)要考虑...。


1
和往常一样@whuber非常感谢,非常感谢!
Michael Markieta 2012年

1
只是想让您知道,在to.raster函数中,您需要具有matrix(u,nrow = n.rows,byrow = TRUE)而不是matrix(u,nrow = n.cols)。

1
@cqh感谢您如此仔细地阅读此代码!您指出了合理的关注;我记得必须处理这个问题。但是,我认为代码是正确的。如果我混淆了行/列的顺序,那么插图将被完全(而且显然)搞砸了。(这就是为什么我用不同的行数和列数进行测试的原因。)我为不幸的表达式表示歉意nrow=n.cols,但这就是它的工作原理(基于points创建的方式),我不想返回并重命名所有内容。
ub

14

更新:

现在在CRAN- GWmodel上有一个专用的R包,其中包括地理加权PCA等工具。从作者的网站

最近,我们将用于地理加权建模的新R包GWmodel上载到CRAN。GWmodel在单个软件包中提供了一系列地理加权数据分析方法,包括描述性统计,相关性,回归,通用线性模型和主成分分析。回归模型包括各种具有高斯,逻辑和泊松结构的数据,以及用于处理相关预测变量的岭回归。该软件包的新功能是提供了每种技术的强大版本-这些版本可以抵抗异常值的影响。

建模位置可以在投影坐标系中,也可以使用地理坐标指定。距离度量包括欧几里得,出租车(曼哈顿)和明可夫斯基,以及由纬度/经度坐标指定的位置的大圆距离。还提供了各种自动校准方法,并且有一些有用的模型构建工具可用来帮助您选择其他预测变量。

还提供了示例数据集,并在随附的文档中使用了这些数据集,以说明各种技术的用法。

有关更多详细信息,请参见即将发表的论文


我怀疑是否存在“随时可用,即插即用”的解决方案。但是我非常希望被证明是错误的,因为我很乐意用我的一些数据来测试这种方法。

要考虑的一些选项:


Marí-Dell'Olmo及其同事使用贝叶斯因子分析来计算西班牙小区域的贫困指数:

贝叶斯因子分析计算剥夺指数及其不确定性。Marí-Dell'OlmoM,Martínez-BeneitoMA,Borrell C,Zurriaga O,Nolasco A,Domínguez-BerjónMF。 流行病学。2011年5月; 22(3):356-64。

在本文中,他们提供了从R执行的WinBUGS模型的规范,这可能会让您入门。


adegenet R包实现spca功能。尽管它着重于遗传数据,但它可能也尽可能地接近您的问题的解决方案。直接使用此程序包/功能或修改其代码。这个问题上有一个小插图,应该可以让您正常运行。


在研究战略研究集群似乎是积极努力的课题。特别是保罗·哈里斯Paul Harris)克里斯·布伦斯顿Chris Brunsdon)(我偶然发现的演讲)。Paul和Urska的最新出版物全文)可能也是有用的资源:

DemšarU,Harris P,Brunsdon C,Fotheringham AS,McLoone S(2012)空间数据的主成分分析:概述。 美国地理学家协会年鉴

您为什么不尝试与他们联系并询问他们到底使用了什么解决方案?他们可能愿意分享他们的工作或为您指明正确的方向。


Cheng,Q.(2006)图像处理的空间和空间加权主成分分析。IGARSS 2006:972-975

论文提到使用GeoDAS GIS系统。可能是另一个线索。


2
+1 Brunsdon演示文稿强调了使用PCA作为探索性工具来查找局部多元离群值。(此用法在spca小插图中也有介绍。)这是GWPCA的强大而合法的用法。(但是,如果将PCA替换为更可靠的方法,则可以大大改进此方法,并且更符合探索性空间数据分析的精神。)
whuber

似乎可以选择使用内核PCA。tribesandclimatechange.org/docs/tribes_450.pdf
Jeffrey Evans,

1
感谢您提供的最新信息- GWmodel看起来像一个值得购买的包装。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.