Ini adalah pertanyaan yang sulit karena belum banyak, jika ada, statistik proses spasial yang dikembangkan untuk fitur garis. Tanpa secara serius menggali persamaan dan kode, statistik titik proses tidak dapat langsung diterapkan pada fitur linier dan dengan demikian, secara statistik tidak valid. Ini karena nol, yang diberikan pola yang diuji, didasarkan pada peristiwa titik dan bukan dependensi linier dalam bidang acak. Saya harus mengatakan bahwa saya bahkan tidak tahu apa yang akan menjadi nol sejauh intensitas dan pengaturan / orientasi akan lebih sulit.
Saya hanya meludah-balling di sini tetapi, saya bertanya-tanya apakah evaluasi multi-skala kepadatan garis ditambah dengan jarak Euclidean (atau jarak Hausdorff jika garis-garis kompleks) tidak akan menunjukkan ukuran pengelompokan yang berkelanjutan. Data ini kemudian dapat diringkas ke vektor garis, menggunakan varians untuk memperhitungkan perbedaan panjang (Thomas 2011), dan menetapkan nilai cluster menggunakan statistik seperti K-means. Saya tahu bahwa Anda tidak setelah cluster ditugaskan tetapi nilai cluster bisa mempartisi derajat clustering. Ini jelas akan membutuhkan kecocokan optimal k sehingga, cluster sewenang-wenang tidak ditugaskan. Saya berpikir bahwa ini akan menjadi pendekatan yang menarik dalam mengevaluasi struktur tepi dalam model teoritis grafik.
Ini adalah contoh yang berhasil di R, maaf, tapi ini lebih cepat dan lebih dapat diproduksi daripada memberikan contoh QGIS, dan lebih banyak di zona nyaman saya :)
Tambahkan pustaka dan gunakan objek psp tembaga dari spatstat sebagai contoh baris
library(spatstat)
library(raster)
library(spatialEco)
data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)
Hitung kerapatan garis pesanan 1 dan 2 yang distandarkan dan kemudian memaksa ke objek kelas raster
d1st <- density(l)
d1st <- d1st / max(d1st)
d1st <- raster(d1st)
d2nd <- density(l, sigma = 2)
d2nd <- d2nd / max(d2nd)
d2nd <- raster(d2nd)
Membakukan kepadatan urutan 1 dan 2 menjadi kepadatan terintegrasi skala
d <- d1st + d2nd
d <- d / cellStats(d, stat='max')
Hitung jarak euclidean terbalik standar dan paksakan ke kelas raster
euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))
Pindahkan spatstat psp ke objek sp SpatialLinesDataFrame untuk digunakan dalam raster :: extract
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)) )
Plot hasil
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)
Ekstrak nilai raster dan hitung statistik ringkasan yang terkait dengan setiap baris
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)))
Gunakan nilai siluet kluster untuk mengevaluasi k (jumlah cluster) yang optimal, dengan fungsi optimal.k, lalu tetapkan nilai kluster ke baris. Kami kemudian dapat menetapkan warna untuk setiap cluster dan plot di atas raster kepadatan.
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)
Pada titik ini orang dapat melakukan pengacakan garis untuk menguji apakah intensitas dan jarak yang dihasilkan signifikan dari acak. Anda bisa menggunakan fungsi "rshift.psp" untuk mengubah orientasi garis Anda secara acak. Anda juga bisa mengacak titik awal dan berhenti serta membuat ulang setiap baris.
Orang juga bertanya-tanya "bagaimana jika" Anda baru saja melakukan analisis pola titik menggunakan statistik analisis univariat atau lintas pada titik awal dan berhenti, tidak berbeda dengan garis. Dalam analisis univariat, Anda akan membandingkan hasil titik awal dan berhenti untuk melihat apakah ada konsistensi dalam pengelompokan antara dua pola titik. Ini bisa dilakukan melalui f-hat, G-hat, atau Ripley's-K-hat (untuk proses titik yang tidak ditandai). Pendekatan lain adalah analisis Cross (mis., Cross-K) di mana dua titik proses diuji secara bersamaan dengan menandainya sebagai [mulai, berhenti]. Ini akan menunjukkan hubungan jarak dalam proses pengelompokan antara titik awal dan berhenti. Namun, ketergantungan spasial (nonstesiaritas) pada proses intensitas yang mendasarinya dapat menjadi masalah dalam model-model ini yang membuatnya tidak homogen dan memerlukan model yang berbeda. Ironisnya, proses tidak homogen dimodelkan menggunakan fungsi intensitas yang, membawa kita lingkaran penuh kembali ke kepadatan sehingga, mendukung gagasan menggunakan kerapatan terintegrasi skala sebagai ukuran pengelompokan.
Berikut adalah contoh kerja cepat jika statistik Ripleys K (Besags L) untuk autokorelasi dari proses titik yang tidak ditandai menggunakan awal, hentikan lokasi kelas fitur garis. Model terakhir adalah cross-k menggunakan lokasi mulai dan berhenti sebagai proses yang ditandai nominal.
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) ) )
Referensi
Thomas JCR (2011) Algoritma Clustering Baru Berdasarkan K-Means Menggunakan Segmen Garis sebagai Prototipe. Dalam: San Martin C., Kim SW. (eds) Kemajuan dalam Pengenalan Pola, Analisis Gambar, Visi Komputer, dan Aplikasi. CIARP 2011. Catatan Kuliah dalam Ilmu Komputer, vol 7042. Springer, Berlin, Heidelberg