空間ラインパターンの統計的検定?


32

ポイントがランダムに分布しているかどうかを判断するために使用できる空間ポイントパターンのテストはたくさんありますが、空間ラインパターンの確立されたテストはありますか?(開始点と終了点だけで、中間ノードがない直線を考えています。)

分析したいデータは、人間と動物の動きのOD(原点-終点)行です。(無向線のクラスタリングの例と同様です。)

これまで、1つのアイデアは、ラインを4Dポイントのように扱い、ポイントパターンテストを使用することでしたが、それが適切かどうかはわかりません。

理想的なテストでは、ラインのクラスターがあるかどうかを判断できます。

直感的には、同じ起点から始まり、すべての種類の異なる終点を持つ多くのラインは、クラスターと見なされるべきではありません。一方、より長い時間並行して(近くで)実行される多くのラインはクラスターになります。 ここに画像の説明を入力してください


1行が別の行と平行であるが、1)最初の行よりもはるかに短い、または2)最初の行の方向に「遠く」にある場合、あなたの行動はどうでしょうか
radouxju

@radouxjuこれらの場合、それらは同じクラスターに属していないと思います
暗闇

回答:


17

これは、ラインフィーチャ用に開発された空間プロセス統計情報(存在する場合)があまりないため、難しい質問です。方程式とコードを真剣に掘り下げることなく、ポイントプロセス統計は線形フィーチャに容易に適用できないため、統計的に無効です。これは、指定されたパターンがテストされるヌルが、ランダムフィールドの線形依存関係ではなく、ポイントイベントに基づいているためです。私は、強度と配置/方向がさらに困難になる限り、ヌルが何であるかさえ知りません。

私はここで吐き出しているだけですが、ユークリッド距離(またはラインが複雑な場合はハウスドルフ距離)と結合したライン密度のマルチスケール評価は、クラスタリングの連続測定を示さないのではないかと考えています。このデータは、長さの不均衡を考慮して分散を使用してラインベクトルに集計し(Thomas 2011)、K-meansなどの統計を使用してクラスター値を割り当てることができます。クラスターを割り当てた後ではないことを知っていますが、クラスター値はクラスタリングの度合いを分割する可能性があります。これには明らかに、kの最適な適合が必要になるため、任意のクラスターは割り当てられません。これは、グラフ理論モデルのエッジ構造を評価する上で興味深いアプローチになると思います。

Rで動作するサンプルをご紹介します。申し訳ありませんが、QGISのサンプルを提供するよりも高速で再現性が高く、私の快適な領域でより多くのことができます:)

ライブラリを追加し、spatstatの銅pspオブジェクトを行の例として使用します

library(spatstat)
library(raster)
library(spatialEco)

data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)

標準化された1次および2次の線密度を計算し、ラスタクラスオブジェクトに強制します。

d1st <- density(l)
  d1st <- d1st / max(d1st)
  d1st <- raster(d1st)  
d2nd <- density(l, sigma = 2)
  d2nd <- d2nd / max(d2nd)
  d2nd <- raster(d2nd)  

1次および2次の密度をスケール統合密度に標準化する

d <- d1st + d2nd
d <- d / cellStats(d, stat='max')  

標準化された逆ユークリッド距離を計算し、ラスタークラスに強制する

euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))

raster :: extractで使用するために、spatstat pspをsp SpatialLinesDataFrameオブジェクトに強制変換します。

as.SpatialLines.psp <- local({
     ends2line <- function(x) Line(matrix(x, ncol=2, byrow=TRUE))
     munch <- function(z) { Lines(ends2line(as.numeric(z[1:4])), ID=z[5]) }
     convert <- function(x) {
        ends <- as.data.frame(x)[,1:4]
        ends[,5] <- row.names(ends)
        y <- apply(ends, 1, munch)
        SpatialLines(y)
     }
     convert
})
l <- as.SpatialLines.psp(l)
l <- SpatialLinesDataFrame(l, data.frame(ID=1:length(l)) )

結果をプロットする

par(mfrow=c(2,2))
  plot(d1st, main="1st order line density")
    plot(l, add=TRUE)
  plot(d2nd, main="2nd order line density")
    plot(l, add=TRUE) 
  plot(d, main="integrated line density")
    plot(l, add=TRUE)   
  plot(euclidean, main="euclidean distance")
    plot(l, add=TRUE) 

ラスター値を抽出し、各行に関連付けられた要約統計を計算します

l.dist <- extract(euclidean, l)
l.den <- extract(d, l)
l.stats <- data.frame(min.dist = unlist(lapply(l.dist, min)),
                      med.dist = unlist(lapply(l.dist, median)),
                      max.dist = unlist(lapply(l.dist, max)),
                      var.dist = unlist(lapply(l.dist, var)),
                      min.den = unlist(lapply(l.den, min)),
                      med.den = unlist(lapply(l.den, median)),
                      max.den = unlist(lapply(l.den, max)),
                      var.den = unlist(lapply(l.den, var)))

クラスタシルエット値を使用して、optimal.k関数で最適なk(クラスタの数)を評価し、ラインにクラスタ値を割り当てます。次に、各クラスターに色を割り当てて、密度ラスターの上にプロットします。

clust <- optimal.k(scale(l.stats), nk = 10, plot = TRUE)                      
  l@data <- data.frame(l@data, cluster = clust$clustering) 

kcol <- ifelse(clust$clustering == 1, "red", "blue")
plot(d)
  plot(l, col=kcol, add=TRUE)

この時点で、線のランダム化を実行して、結果の強度と距離がランダムから有意であるかどうかをテストできます。「rshift.psp」関数を使用して、行をランダムに再配置できます。開始点と停止点をランダム化し、各行を再作成することもできます。

また、線の不変量である開始点と停止点で単変量またはクロス分析の統計を使用してポイントパターン分析を実行した場合、「もしも」と思われます。単変量解析では、開始点と停止点の結果を比較して、2つのポイントパターン間でクラスタリングに一貫性があるかどうかを確認します。これは、f-hat、G-hat、またはRipley's-K-hatを介して実行できます(マークされていないポイントプロセスの場合)。別のアプローチは、2つのポイントプロセスを[start、stop]としてマークすることによって同時にテストされるクロス分析(cross-Kなど)です。これは、開始点と終了点の間のクラスタリングプロセスにおける距離関係を示します。しかしながら、これらのタイプのモデルでは、基礎となる強度プロセスに対する空間依存性(非定常性)が問題となり、不均一になり、異なるモデルが必要になります。皮肉なことに、不均一なプロセスは強度関数を使用してモデル化され、完全な円を密度に戻し、クラスタリングの尺度としてスケール統合密度を使用するという考え方をサポートします。

以下は、ラインフィーチャクラスの開始位置と停止位置を使用して、マークされていないポイントプロセスの自己相関に関するRipleys K(Besags L)統計の簡単な例です。最後のモデルは、名目上のマーク付きプロセスとして開始位置と停止位置の両方を使用するcross-kです。

library(spatstat)
  data(copper)
  l <- copper$Lines
  l <- rotate.psp(l, pi/2)

Lr <- function (...) {
 K <- Kest(...)
  nama <- colnames(K)
   K <- K[, !(nama %in% c("rip", "ls"))]
   L <- eval.fv(sqrt(K/pi)-bw)
  L <- rebadge.fv(L, substitute(L(r), NULL), "L")
 return(L)
}

### Ripley's K ( Besag L(r) ) for start locations
start <- endpoints.psp(l, which="first")
marks(start) <- factor("start")
W <- start$window
area <- area.owin(W)
lambda <- start$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's K ( Besag L(r) ) for end locations
stop <- endpoints.psp(l, which="second")
  marks(stop) <- factor("stop")
W <- stop$window
area <- area.owin(W)
lambda <- stop$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's Cross-K ( Besag L(r) ) for start/stop
sdata.ppp <- superimpose(start, stop)
( Lenv <- plot(envelope(sdata.ppp, fun="Kcross", r=bw, i="start", j="stop", nsim=199,nrank=5, 
                 transform=expression(sqrt(./pi)-bw), global=TRUE) ) )

参照資料

Thomas JCR(2011)プロトタイプとしてラインセグメントを使用したK平均に基づく新しいクラスタリングアルゴリズム。In:San Martin C.、Kim SW。(編)パターン認識、画像解析、コンピュータービジョン、およびアプリケーションの進歩。CIARP2011。コンピューターサイエンスの講義ノート、vol7042。Springer、ベルリン、ハイデルベルク


14

フレシェ距離を調べてみてください。私は最近、Pythonの実装を探している最近の質問の後、このことを知りました。

これは、ラインストリングの空間的類似性を見つけるためのメトリックです。これは、ハウスドルフ距離に似た考え方です。これは、ポリゴンの類似性の尺度に相当しますが、方向のある線ストリングに相当します。

フレシェ距離は、1つの軌道上の犬と2番目の軌道上の飼い主をつなぐリーシュの最小長として定義されます。

このメトリクスは、近接して配置され、ほぼ平行で、同じ方法で、同じ長さの2つの曲線に対して小さな値を持ちます。

ただし、クラスター識別の部分には答えません。

ここに包括的なプレゼンテーションがあります。あなたの状況は、セクション46-49で言及されているユースケースのように聞こえます

このメトリックには、次のような多くの非地理的用途があります。

  • 遺伝子配列決定における一般的なサブパターンの検出
  • 手書き認識
  • 株価履歴などの時系列での相関期間の検出

したがって、参考文献の多くの論文がこのトピックをカバーしていますが、それらのほとんどは地理空間ではありません。また、これらの論文のほとんどは、地理空間/地球科学ではなく、アルゴリズム/数学/コンピューターサイエンスに基づいており、それに応じて目的を定めています。

しかし、この論文は有望に見えました:

ブチン、K。、ブチン、M。、およびワン、Y。(2009)。フレシェ距離による部分曲線マッチングの正確なアルゴリズム。第20回離散アルゴリズムに関するACM-SIAMシンポジウムの議事録、645〜654ページ

他の論文のいくつかは、あなたが望んでいることに近いように聞こえます-クラスターの識別とクラスターへの軌跡の割り当て-しかし、それらは時系列データまたは他の非空間的な例を使用して説明されます。しかし、彼らは興味深い方向を指しているかもしれません。


2
ユークリッド距離の代わりにフレシェ距離またはハウスドルフ距離を使用した最小結合(またはDBSCAN)クラスタリングが良い解決策だと思います。
-dbaston

私はフレシェ距離が存在することを愛し、プレゼンテーションが「jellybeans」と「bellybuttons」を比較することも大好きです。
フェスター

5

ここで説明されたものと同様のアプローチを使用するよう提案しています 。

アルゴリズムと命名:

a)名前線層ノード。計算ベアリング

b)距離許容差を使用してそれ自体(1対多)に空間的に結合します。名前レイヤーのリンク

c)LINKSからそれ自体への参加を削除します。つまり、NAME = NAME_1

d)リンク内で「同じ」方向のペアを見つけます。私が使用した:

def theSame(aList,tol):
    maxB=max(aList);minB=min(aList)
    if abs(maxB-minB)<tol:return 1
    if abs(maxB-minB-180)<tol:return 1
    return 0
#-----------
theSame( [!BEARING!, !BEARING_1!],15)

すなわち、方向に関して類似している反対方向に進むと想定される線

d)リンクから類似していない(0)ペアを削除します。

e)NODESを介して接続されたLINKSのグループを計算し、グループ番号をNODESテーブルに転送します。

ここに画像の説明を入力してください

残念ながら:

ここに画像の説明を入力してください

ただし、グループ内の方位の単純な統計、たとえば次の標準偏差:

abs(tan(bearing))

最初のケースでは偏差がなく、2番目のケースでは非常に大きな偏差が示されました。同様に、長さの統計は、「長時間の並列実行」に役立ちます。

上記に興味がある場合は、リンクの接続グループを計算するスクリプトで回答を更新できます。arcpyおよびnetworkxモジュールを使用しています。

同じポイントから反対方向に向かう線のペアを処理する方法がわからない...


スクリプトを見ることに興味があります。
alphabetasoup

1
@RichardLawは、ソリューションの1行目のリンクをたどり、下にスクロールして表示します。少し洗練されたバージョンがありますが、これで十分です。ロジックは非常に簡単です。1。リンクとそれに接続されたノードを使用してグラフを作成します。2.最初のノードを取得し、祖先(グループ0)を見つけます。高品質の評議会/ LINZデータセットのパイプ(ストリームなど)の切断されたグループを見つけるために繰り返し使用します
-FelixIP

5

私の目には、線の定義に問題があり、どのアプローチを使用するかを決定します(上記のいくつか)。これらがODペアであり、ジオメトリが役割を果たさない場合、ネットワーククラスタリングに基づいてこれにアプローチします。ネットワークはネットワークを形成しないと言いますが、そうではありますが、出発地と目的地は意味のある地域に分類される可能性が高いため、ネットワークとして扱うことができます。

ジオメトリに何か言いたいことがある場合(これらはGPS軌跡であり、ジオメトリを検討したい場合)、実際に(x、y、t)スペースで動作する必要があります-移動フットプリントの同様のジオメトリですが、時間は同じものとして評価されない場合があります-これは質問で指定されていません。

あなたが見ることができるいくつかの可能性:

  1. あなたのニーズに最も近いのは、Dodge、Weibel、Forootan(2009)、こちら http://orca.cf.ac.uk/94865/1/PhysicsMovement.pdf
  2. ジオメトリを単純化できる場合は、ここで言及されているパラメーターが役立つ可能性があります:http : //www.tandfonline.com/doi/full/10.1080/17445647.2017.1313788

しかし最後に、最初の質問をもう一度読み直すと、より簡単になる可能性があります:セグメントの線形延長とそれらの最も近い点の交差点間の距離をペアワイズ(セグメント間)で計算できますか?セグメント自体の)およびマトリックスクラスタリングアルゴリズムを使用しますか?推論:遠くで交差するセグメントは、近くで交差するセグメントよりも類似(平行)です。図面では、オフセット(長いフレッシェ距離)にある同一直線上のセグメントまたは平行なセグメントの処理方法については言及していません。これにより上記の解決策に問題が生じると思います。(明確にするために、上記の「線形拡張」を明示的に編集)

注(2018年1月):最近、私はこれにつまずきました:

  1. Cai、Yuhan、Raymond Ng。「チェビシェフ多項式による時空軌跡のインデックス作成」データ管理に関する2004 ACM SIGMOD国際会議の議事録。ACM、2004。

軌跡の類似性に関連するため、ある程度の類似性の定量化が可能になります。これは、曲線の多項式近似とチェビシェフ距離の計算に基づいています。


4

作業しているデータのタイプについてもう少し詳しく教えてください。これらは単なる一連の分離線ですか、それともネットワークを形成していますか?空間パターン分析にArcGISツールを使用しましたか?多くのArcGISメソッド(RipleyのK、NNインデックス、Morans I)は、非ポイントデータで使用する場合、ライン/ポリゴンの図心を使用します。ただし、ここでは、重心が非常に離れているために非常に長い行が考慮されないように、各行を等しいセクションに分割することを検討する必要があります。

考えるべきもう1つのことは、概念的には行のクラスターとは何ですか?多くの線が互いに近接して存在する場合がありますが、それらの端点は分散する可能性があります。同様に、開始点と終了点が非常に近接しているが、開始点と終了点の間に非常に分散した多くの線を取得する場合があります。

ただし、1つのアプローチは、単に線密度分析を実行して、より多くの線(ある意味ではクラスター化されていると考えられる)が高いグリッド値を持ち、密度が低い領域が低い値になるようにすることです。したがって、ホットスポット出力が少し得られます。ただし、これはMorans IやNNIのような単一の統計情報を提供するものではありません。また、1本の非常に不規則な線(つまり、きついらせん)と多くの線の結果としての密度を区別しません。

申し訳ありませんが、これはあなたの問題に対する完全な答えではありませんが、あなたが達成しようとしているものの完全な概念を釘付けにすることは、いくつかのより良い解決策を提供するかもしれません。

更新

あなたが与えた例に基づいて、FelixlPのポイントパターンメジャーで使用するラインベアリング属性を持つポイントを作成するという提案は、おそらく良い方法だと思います。私がポイントを等しいセグメントに分割し、各線の頂点に線のあるポイントを持つ点を除いて。次に、各ポイントの近接度と方位間の類似性を調べる測定値を調べる必要があります(したがって、垂直に近いラインを検出します)。

そのため、クラスタの場所を視覚化するために、Getis-Ord GI(ホットスポット分析)を使用することをお勧めします。次に、グローバルモランのIを使用して、クラスタリングのグローバルレベルを評価します。

ただし、ラインをセグメント化する距離は、検出されるクラスタリングの程度に影響します。1kmスケールのクラスターを探している場合は、その周りに線を分割する必要があります。同様に、100m規模のクラスターを探している場合は、それに応じてラインをセグメント化する必要があります。これは、行を見逃さないようにするため、また各行をクラスターとして検出しないようにするためです。


線は旅行の出発地と目的地を表します。それらはネットワークを形成しません。これまで、始点と終点の空間ポイントパターンにRメソッドを使用しました。ライン重心を使用するという考えはあまり好きではありませんが、ラインを高密度化し、結果のノードを分析する価値があるかもしれません、ありがとう!
暗闇

より適切なものが見つからない場合、線密度分析はフォールバックソリューションになる可能性があります。
暗闇

プライマリラインを一定の距離だけバッファリングしてから、バッファで完全に囲まれていないラインをクエリするのは解決策でしょうか?過去に最も可能性の高い移動ルートを見つけるためにこれをかなり行ってきましたが、データは単純なラインセグメントではなくマルチノードポリラインで構成されていました。
jbgramm

@jbgramm何かを計算する多くのアプローチを考えることができますが、私は統計学者ではないので、確立された方法を探しています-存在する場合
暗闇

2
点のプロセスを表すためにラインの中心点、または頂点を使用することは、統計的に有効なアプローチではありません。また、空間プロセスの表現も大幅に変更しています。いくつかの推奨事項を投稿しますが、正直なところ、やや有効なアプローチを提供したのは、線密度の@underdark提案です。スケール全体で、自己相関統計と組み合わせると、線形フィーチャのクラスタリングの程度を示します。
ジェフリーエヴァンス

3

例に感謝します。

あなたが探しているものを計算する確立された方法を見たことはありませんが、これは私のアプローチでしょう。一種のブルートフォースソリューションです。

最小外接長方形を計算し、それを任意のサイズに拡張しますが、4つのコーナーのそれぞれで大量に等しくします。

作成する長方形の重心を見つけ、各ラインのODポイントの方位角および距離分布を計算し、境界長方形の角を使用して、ラインの方位角を比較しながら同じことを行います。

四隅のそれぞれから各光線の終わりまでの平行度をテストします。重心から各光線の端までの平行度をテストします。

これにより、コーナーから端までの偏差を比較できます。例(a)では、2つのコーナーから3つのラインクラスターのそれぞれにほぼ平行なラインがあります。重心から遠端の端までほぼ平行な線もあります。

例(b)角から各線の端までを計算する場合、平行に近い線はありませんが、線はランダムに見えず、わずかにずれて互いにつながっています。

例(c)はランダムに見える

例(d)はランダムではなく、放射状です。

これをさらに見ると、上で説明したテストを実行し、作成された四角形の角から光線の端までの三角形の解のテストを作成します。クラスター内の線の1つが他の線より大幅に短い場合を除き、同様の内角と面積は、クラスター化の検証に役立ちます。

上記はただの愚か者の意見であり、私はおそらく間違っています。


-1

あなたの本能的な説明に続いて、2本の線が平行になるための基準は何ですか?

基本的に、それらの開始点または終了点でテストを行うことができます
。Sx=(start_x_line_1-start_x_line_2)、
Sy =(start_y_line_1-start_y_line_2)、
Ex、Eyは同じですが、それらの終了点をテストします。

したがって、sqrt(Sx²+Sy²)AND sqrt(Ex²+Ey²)があるしきい値を下回っている場合、これらの線は平行であると考えることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.