Bu, zor bir sorudur, çünkü çizgi özellikleri için geliştirilen mekansal süreç istatistiği henüz yoktur. Denklemlere ve koda ciddi bir şekilde kazma olmadan, nokta işlem istatistikleri doğrusal özellikler için kolayca uygulanabilir değildir ve bu nedenle istatistiksel olarak geçersizdir. Bunun nedeni, belirli bir şablonun test edildiği boşluğun, rastgele alandaki doğrusal bağımlılıklara değil, nokta olaylarına dayanmasıdır. Şunu söylemeliyim ki, boşluğun ne kadar olacağı ve yoğunluk / düzenleme / yönlendirme daha da zor olacaktır.
Ben sadece tükürük topluyum ama Euclidean mesafeyle (veya eğer çizgiler karmaşıksa Hausdorff mesafesinin) çok boyutlu bir hat yoğunluğu değerlendirmesinin sürekli bir kümelenme ölçüsü göstermeyeceğini merak ediyorum. Bu veriler daha sonra uzunluk vektörlerindeki eşitsizliği hesaba katan varyansı kullanarak çizgi vektörlerine özetlenebilir (Thomas 2011) ve K-aracı gibi bir istatistik kullanarak bir küme değeri atanabilir. Kümelerin atanmasından sonra olmadığınızı biliyorum ancak küme değeri kümelenme derecelerini bölümleyebilir. Bu, açık bir şekilde, optimal bir k uyumu gerektireceğinden, rasgele kümeler atanmaz. Bunun grafiksel teorik modellerde kenar yapı değerlendirmesinde ilginç bir yaklaşım olacağını düşünüyorum.
İşte R'de çalışılmış bir örnek, üzgünüm, ancak QGIS örneği sağlamaktan daha hızlı ve daha tekrarlanabilir ve benim rahatlık bölgemde daha fazla :)
Kitaplık ekleyin ve spatstat'tan bakır psp nesnesini çizgi örneği olarak kullanın
library(spatstat)
library(raster)
library(spatialEco)
data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)
Standart 1. ve 2. sıra hat yoğunluğunu hesaplayın ve ardından raster sınıf nesnelere zorlayın
d1st <- density(l)
d1st <- d1st / max(d1st)
d1st <- raster(d1st)
d2nd <- density(l, sigma = 2)
d2nd <- d2nd / max(d2nd)
d2nd <- raster(d2nd)
1. ve 2. sipariş yoğunluğunu teraziye entegre bir yoğunluğa göre standartlaştırın
d <- d1st + d2nd
d <- d / cellStats(d, stat='max')
Standartlaştırılmış ters öklid mesafesini hesaplayın ve raster sınıfına zorlayın
euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))
Zorlama spatstat psp bir spatialLinesDataFrame nesnesine raster :: extract kullanmak için
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)) )
Arsa sonuçları
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)
Raster değerlerini ayıklayın ve her satırla ilişkili özet istatistiklerini hesaplayın
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 işleviyle optimal k (küme sayısını) değerlendirmek için küme siluet değerlerini kullanın, ardından satırlara küme değerleri atayın. Daha sonra her kümeye renk atayabilir ve yoğunluk rasterinin üzerine çizebiliriz.
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)
Bu noktada, elde edilen yoğunluk ve mesafenin rastgele anlamlı olup olmadığını test etmek için çizgilerin rastgele bir işlemi gerçekleştirilebilir. Çizgilerinizi rasgele yeniden yönlendirmek için "rshift.psp" işlevini kullanabilirsiniz. Ayrıca başlangıç ve bitiş noktalarını rastgele seçebilir ve her satırı yeniden oluşturabilirsiniz.
Biri ayrıca "ne olursa olsun", çizgilerin değişmez olan başlangıç ve bitiş noktalarındaki tek değişkenli veya çapraz analiz istatistiklerini kullanarak bir nokta deseni analizi yaptınız. Tek değişkenli bir analizde, iki nokta deseni arasında kümelemede tutarlı olup olmadığını görmek için başlangıç ve bitiş noktalarının sonuçlarını karşılaştırırsınız. Bu bir f-hat, G-hat veya Ripley's-K-hat ile yapılabilir (işaretlenmemiş nokta işlemleri için). Başka bir yaklaşım, iki nokta işleminin aynı anda [start, stop] olarak işaretlenerek test edildiği bir Çapraz analiz (örneğin, çapraz K) olacaktır. Bu, kümeleme sürecindeki başlangıç ve bitiş noktaları arasındaki mesafe ilişkilerini gösterir. Ancak, Altta yatan bir yoğunlaşma sürecine mekansal bağımlılık (tarafsızlık) bu tür modellerde onları homojen olmayan ve farklı bir model gerektiren bir sorun olabilir. İronik olarak, homojen olmayan süreç, bizi tam daireyi yoğunluğa geri döndüren bir yoğunluk fonksiyonu kullanılarak modellenmiştir, böylece kümelemenin bir ölçüsü olarak ölçeğe entegre bir yoğunluk kullanılması fikrini desteklemektedir.
Burada, Ripleys K (Besags L), çizgi özellik sınıfının start, stop konumlarını kullanarak işaretlenmemiş bir nokta işleminin otomatik korelasyonu için istatistik olup olmadığını gösteren hızlı bir örnek. Son model, hem başlangıç hem de durma konumlarını nominal olarak işaretlenmiş bir işlem olarak kullanan bir çapraz-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) ) )
Referanslar
Thomas JCR (2011) Prototip Olarak Çizgi Segmentinin Kullanılması K-Aracına Dayalı Yeni Bir Kümeleme Algoritması. In: San Martin C., Kim SW. (eds) Örüntü Tanıma, Görüntü Analizi, Bilgisayarla Görme ve Uygulamalarda İlerleme. CIARP 2011. Bilgisayar Bilimi Ders Notları, cilt 7042. Springer, Berlin, Heidelberg