これは、ラインフィーチャ用に開発された空間プロセス統計情報(存在する場合)があまりないため、難しい質問です。方程式とコードを真剣に掘り下げることなく、ポイントプロセス統計は線形フィーチャに容易に適用できないため、統計的に無効です。これは、指定されたパターンがテストされるヌルが、ランダムフィールドの線形依存関係ではなく、ポイントイベントに基づいているためです。私は、強度と配置/方向がさらに困難になる限り、ヌルが何であるかさえ知りません。
私はここで吐き出しているだけですが、ユークリッド距離(またはラインが複雑な場合はハウスドルフ距離)と結合したライン密度のマルチスケール評価は、クラスタリングの連続測定を示さないのではないかと考えています。このデータは、長さの不均衡を考慮して分散を使用してラインベクトルに集計し(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、ベルリン、ハイデルベルク