ArcGIS、Python、SPSS / Rを使用して地理的に重み付けされた主成分分析を実行するにはどうすればよいですか?


32

私は、地理的に重み付けされた主成分分析(GWPCA)を実施するための説明/方法論を求めています。これのどの部分にもPythonを使用してうれしく、地理的に重み付けされた変数でPCAを実行するためにSPSSまたはRが使用されると思います。

私のデータセットは、約550のセンサストラクト(ベクトルジオメトリ)全体で測定される約30の独立変数で構成されています。

これはロードされた質問です。しかし、私が検索して検索すると、そこに解決策はないようです。私が遭遇したのは、GWPCA(およびGWR)の基本的な構成を説明する数式です。私は、生データからGWPCAの結果に到達するために達成する必要がある主要なステップを探しているという意味で、より適用されています。


以下に寄せられたコメントにより、この編集の最初の部分を拡大したいと思います。

ポールに対応するには...

私はGWPCAへの関心を次の論文に基づいています。

ロイド、CD、(2010)。地理的に重み付けされた主成分分析を使用した人口特性の分析:2001年の北アイルランドの事例研究。コンピューター、環境および都市システム、34(5)、p.389-399。

文献にアクセスできない人のために、以下の数学を説明する特定のセクションのスクリーンショットを添付しました。

記事

そして、whuberに対処するには...

詳細(機密性)に進むことなく、30の変数(すべてが非常に良い指標であると思われる)を、固有値が1より大きいコンポーネントのセットに減らすことを試みています。これらのコンポーネントによって説明されるローカル分散を理解するため。

私たちの主な目標は、GWPCAの概念を証明すること、つまり、データの空間的に明示的な性質を示すことであり、すべての独立変数をグローバルスケールで説明できると考えることはできないと思います。むしろ、各コンポーネントが識別するローカルスケール(周辺)は、データの多次元の性質(変数を互いに組み合わせて研究エリアの特定の近傍を説明する方法)を理解するのに役立ちます。

問題のコンポーネントによって説明される近傍の範囲を理解するために(各コンポーネントのローカルな空間性を理解するのを助けるために)各コンポーネントが占める分散の割合を(別々に)マッピングしたいと考えています。おそらく他のマッピング例がいくつかありますが、現時点では思い浮かぶものはありません。

さらに:

GWPCAの背後にある数学は、地理分析と社会統計の私のバックグラウンドを考えると、私が理解している以上のものです。数学の適用が最も重要です。つまり、これらの変数/式に何をプラグインするかです。


1
Rのすぐに使えるソリューションはわかりませんが、それほど難しくないはずです。「Rはおそらくこれを行うことができます」より多くのフィードバックが必要な場合は、関連する数学を投稿してください。
ポールヒームストラ

2
どのような結果を探していますか?最大の固有値?推定される主成分の数は?主要なステップは十分に明確である必要があります-ポイントで重みを選択し、重み付き共分散(または相関)行列を計算し、その行列のSVDからPCAを取得します。たくさんのポイントについて繰り返します。これらのステップの詳細をお探しですか?
whuber

よろしくお願いします。私のポイントを説明するために。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が反転します。マップを見ると、実際には30列ではなく20列であることがわかります(x軸上の幅の広いセルは20列のみです)。手伝いたかっただけです。

GW PCAを含む、RのGWメソッドの新しい改良パッケージがあることを知りたいと思うかもしれません。これは先月GISRUK 2013で発表されました。
AnserGIS

OPの望ましい分析の拡張された説明に基づいて、「隣接行列の主座標」(別名、Moranの固有ベクトル)に関する文献を調査することを強くお勧めします。この方法は、元々、 'Borcard D.、&P. Legendre(2002)隣接行列の主座標による生態データの全スケール空間分析で提案されました。エコロジカルモデリング153:51-68 'は、複数の空間スケールドメインにわたるデータの評価に非常に強力であり、GWPCAではできません。このメソッドは、spaceMakerおよびPCNM Rライブラリに実装されています。
ジェフリーエヴァンス

回答:


29

「地理的に重み付けされたPCA」は非常に記述的です:でR、プログラムは実際に書き込みます。(実際のコード行よりも多くのコメント行が必要です。)

これは、PCA自体から地理的に重み付けされたPCAパーツ会社であるため、重みから始めましょう。「地理的」という用語は、重みが基点とデータ位置の間の距離に依存することを意味します。標準-決して決してではない-重み付けはガウス関数です。つまり、距離が2乗する指数関数的減衰です。ユーザーは、減衰率、または(より直感的に)一定の減衰量が発生する特徴的な距離を指定する必要があります。

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行です。分析を実行するグ​​リッドについて説明した後、あと1つだけが必要になります。)


質問で説明されているものに匹敵するいくつかのランダムなサンプルデータで説明しましょう: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個のマップのうち最初の4個で、4つの最大固有値を示しています。(すべての場所で1を超えるサイズにあまり興奮しないでください。これらのデータは完全にランダムに生成されているため、これらのマップに相関構造がある場合は、これらのマップの大きな固有値が示すことを思い出してください-それは単に偶然によるものであり、データ生成プロセスを説明する「実際の」ものを反映するものではありません。)

帯域幅を変更することは有益です。小さすぎる場合、ソフトウェアは特異点について不平を言います。(このベアボーン実装ではエラーチェックを組み込みませんでした。)しかし、それを1から1/4に減らす(そして以前と同じデータを使用する)と興味深い結果が得られます。

マップ2

境界付近のポイントが異常に大きな主固有値(左上のマップの緑の位置に表示)を提供する傾向に注意してください。他のすべての固有値は補正するために押し下げられます(他の3つのマップに薄いピンクで表示) 。PCAの地理的に重み付けされたバージョンを確実に解釈するには、この現象、およびPCAと地理的重み付けのその他の多くの微妙な点を理解する必要があります。そして、考慮すべき他の30 * 30 = 900個の固有ベクトル(または「負荷」)があります...。


1
いつものように驚くべき@whuber、ありがとうございました!
マイケルマルキエータ

1
to.raster関数では、matrix(u、nrow = n.cols)の代わりにmatrix(u、nrow = n.rows、byrow = TRUE)が必要であることに注意してください。

1
@cqhこのコードを注意深く見てくれてありがとう!あなたは正当な懸念を指摘します。この問題に対処しなければならなかったことを思い出します。ただし、コードは正しいと思います。行/列の順序を混同していた場合、イラストは完全に(そして明らかに)混乱してしまいます。(だから、異なる行数と列数でテストしました。)不幸な表現をおIびしnrow=n.colsますが、それは(points作成された方法に基づいて)うまくいかなかったため、戻ってすべての名前を変更したくありませんでした。
whuber

14

更新:

現在、CRAN- GWmodelで利用可能な特殊なRパッケージがあり、他のツールの中で地理的に重み付けされたPCAが含まれています。著者のウェブサイトから:

地理的に重み付けされたモデリング用の新しいRパッケージGWmodelが最近CRANにアップロードされました。GWmodelは、記述統計、相関、回帰、一般線形モデル、および主成分分析を含む単一のパッケージ内で地理的に重み付けされたデータ分析アプローチの範囲を提供します。回帰モデルには、ガウス、ロジスティック、およびポアソン構造を持つさまざまなデータのほか、相関予測子を処理するためのリッジ回帰が含まれます。このパッケージの新機能は、各手法の堅牢なバージョンの提供です。これらは、外れ値の影響に耐性があります。

モデリングの場所は、投影座標系で指定するか、地理座標を使用して指定できます。距離メトリックには、ユークリッド、タクシー(マンハッタン)、ミンコフスキー、および緯度/経度座標で指定された場所の大圏距離が含まれます。さまざまな自動キャリブレーション方法も提供されており、代替の予測変数から選択するのに役立ついくつかの有用なモデル構築ツールが用意されています。

データセットの例も提供されており、さまざまな手法の使用例の添付ドキュメントで使用されています。

詳細については、今後の論文のプレビューをご覧ください。


「すぐに使用できる、データをプラグインする」ソリューションが存在するかどうかは疑問です。しかし、この方法をいくつかのデータでテストしたいので、間違っていることが証明されることを非常に望んでいます。

考慮すべきいくつかのオプション:


Marí-Dell'Olmoらは、ベイジアン因子分析を使用して、スペインの小さな地域の剥奪指数を計算しました。

剥奪指数とその不確実性を計算するためのベイズ因子分析。マリ・デル・オルモM、マルティネス・ベネイトMA、ボレルC、ズリアガO、ノラスコA、ドミンゲス・ベルジョンMF。 疫学。2011年5月、22(3):356-64。

記事では、Rから実行されるWinBUGSモデルの仕様を提供します。


adegenet Rパッケージはspca機能を実装します。それは遺伝データに焦点を合わせていますが、あなたが得ることができる限りあなたの問題の解決に近いかもしれません。このパッケージ/関数を直接使用するか、コードを変更します。問題を解決するためのビネットがあります。


研究者戦略研究クラスターは、積極的に話題に動作しているようです。特に、ポール・ハリスクリス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がより堅牢な手順に置き換えられた場合、この方法は大幅に改善され、探索的空間データ分析の精神に
沿ったものになり

代替手段はカーネルPCAのようです。tribesandclimatechange.org/docs/tribes_450.pdf
ジェフリー・エバンス

1
更新された情報をお寄せいただきありがとうございGWmodelます。取得する価値のあるパッケージのように見えます。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.