라인 피쳐에 대해 개발 된 공간 프로세스 통계가 많지 않았기 때문에 어려운 질문입니다. 방정식과 코드를 심각하게 파헤 치지 않으면 포인트 프로세스 통계는 선형 특성에 쉽게 적용 할 수 없으므로 통계적으로 유효하지 않습니다. 주어진 패턴이 테스트되는 널 (null)이 임의의 필드에서 선형 종속성이 아닌 포인트 이벤트를 기반으로하기 때문입니다. 나는 강도와 배열 / 배향이 더 어려울 때까지 널이 무엇인지 알지 못한다고 말해야합니다.
나는 단지 여기에서 뱉어 낼 수 있지만 유클리드 거리 (또는 라인이 복잡한 경우 하우스 도프 거리)와 결합 된 라인 밀도의 멀티 스케일 평가가 클러스터링의 지속적인 측정을 나타내지 않을지 궁금합니다. 이 데이터는 길이의 차이를 설명하기 위해 분산을 사용하여 선 벡터에 요약 할 수 있으며 (Thomas 2011) K- 평균과 같은 통계를 사용하여 군집 값을 할당 할 수 있습니다. 클러스터를 지정한 후에는 아니지만 클러스터 값이 클러스터링 수준을 분할 할 수 있음을 알고 있습니다. 이것은 분명히 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))
spastera psp를 sp SpatialLinesDataFrame 객체로 강제 변환하여 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)) )
결과 플롯
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)))
최적의 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"함수를 사용하여 선의 방향을 임의로 조정할 수 있습니다. 시작 및 중지 지점을 무작위로 지정하고 각 줄을 다시 만들 수도 있습니다.
또한 선의 변하지 않는 시작점과 정지 점에 대해 일 변량 또는 교차 분석 통계를 사용하여 점 패턴 분석을 수행 한 경우 "무엇"인지 궁금합니다. 일 변량 분석에서는 시작점과 종료점의 결과를 비교하여 두 점 패턴간에 군집화의 일관성이 있는지 확인합니다. 이 작업은 f-hat, G-hat 또는 Ripley's-K-hat (표시되지 않은 포인트 프로세스)을 통해 수행 할 수 있습니다. 다른 접근법은 2 점 프로세스가 [시작, 중지]로 표시되어 동시에 테스트되는 교차 분석 (예 : 교차 -K)입니다. 이는 클러스터링 프로세스에서 시작 지점과 중지 지점 사이의 거리 관계를 나타냅니다. 하나, 기본 강도 프로세스에 대한 공간 의존성 (nonstaionarity)은 이러한 유형의 모델에서 불균일하게 만들고 다른 모델을 요구하는 문제가 될 수 있습니다. 아이러니하게도, 불균일 한 프로세스는 강도 함수를 사용하여 모델링되어 전체 원을 밀도로 되돌려 스케일 통합 밀도를 클러스터링의 척도로 사용하는 아이디어를 지원합니다.
다음은 선 피쳐 클래스의 시작, 중지 위치를 사용하여 표시되지 않은 포인트 프로세스의 자동 상관에 대한 Ripleys K (Besags L) 통계의 빠른 작동 예입니다. 마지막 모델은 공칭 표시 프로세스로 시작 및 중지 위치를 모두 사용하는 크로스 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- 평균을 기반으로하는 새로운 클러스터링 알고리즘. 에서 : San Martin C., Kim SW. (eds) 패턴 인식, 이미지 분석, 컴퓨터 비전 및 응용 프로그램의 진행. CIARP 2011. 컴퓨터 과학 강의 노트, vol 7042. Springer, Berlin, Heidelberg