2012-01-05 10 views
0

R의 ks 라이브러리에서 kde 함수를 사용하여 만든 kde 객체의 출력 해상도를 올바르게 설정하는 방법을 알아 내려고합니다. 기본적으로 내가 먹는 SpatialPoints 객체가 있습니다. 출력을 래스터로 변환합니다. 이 래스터의 셀에 특정 해상도를 지정하고 싶습니다.kde 객체의 출력 해상도 설정

다음은 meuse 데이터 세트를 사용하는 예입니다.

library(ks) 
library(raster) 
data(meuse) 
points = data.frame(meuse$x,meuse$y) 
raster(kde(points,Hlscv(points))) 

이 코드에서 얻을 출력은 다음과 같습니다

class  : RasterLayer 
dimensions : 151, 151, 22801 (nrow, ncol, ncell) 
resolution : 31.37394, 46.03558 (x, y) 
extent  : 177628.8, 182366.2, 328186.8, 335138.2 (xmin, xmax, ymin, ymax) 
projection : NA 
values  : in memory 
min value : 0 
max value : 2.925851e-07 

나는 내가 원하는 것을 할 출력 해상도 (출력의 세 번째 행)를 설정하는 방법을 찾고 싶어요.

이제 kde에 'gridsize'및 'bgridsize'옵션이 있다는 것을 알고 있으며이 옵션을 사용하여 각 치수에서 원하는 점 수나 셀 수를 설정합니다. 그러나 출력 범위를 알지 못하면 특정 해상도를 얻기 위해 셀 수를 계산할 수 없습니다.

내가 가진 한 가지 생각은 적절한 차원의 H 값을 사용하여 각 차원의 최소 및 최대 좌표를 버퍼링하고 kde 출력의 범위를 미리 파생시키는 것입니다. 그러나, 나는 이것이 대각선 행렬들에서만 H와 같이 작용할 것이라고 생각하고, 그래서 그것은 완전한 2x2 H- 값 행렬로 구현 될 수 있을지 확신하지 못한다.

래스터를 리샘플링 할 수 있다는 것을 알고 있지만 저해상도 kde 객체에서 나오지 않도록하고 싶습니다.

+0

'gridsize' (s)의 매개 변수를 얻기 위해'range'를 "resolution"으로 나눠 쓰지 않겠습니까? –

+0

어쩌면 질문에 명확하지 않을 수도 있지만 명령이 실행될 때까지 범위를 알 수있는 방법이 없습니다. – blindjesse

+0

데이터를 취하는 함수를 만들고, 범위를 계산 한 다음, 그 함수 내부에서'kde' 함수를 호출합니다. –

답변

0

내가 주위를 파고되었다하고,이 것을 발견 입력 점과 비교 한 출력 kde 래스터 범위의 증가와 H 매개 변수 간의 일관된 관계. 이것이 왜 그런지는 모르겠지만 (구현이나 사물 뒤에있는 수학으로 인해), 모든 경우에 적용될 수는 없지만 일관되게 작동하기 때문에이를 전달합니다.즉, I (이 식 아닌 코드) 것을 발견

for (i in seq(1:10)){ 
    pts = data.frame(x=rnorm(100,300000,2500),y=rnorm(100,4000000,2500)) 
    rangePtsX <- diff(range(pts$x)) 
    rangePtsY <- diff(range(pts$y)) 
    H <- Hlscv(pts) 
    ras <- raster(kde(pts,H)) 
    rangeRasX <- xmax(ras) - xmin(ras) 
    rangeRasY <- ymax(ras) - ymin(ras) 
    rangeDiffX <- rangeRasX - rangePtsX 
    rangeDiffY <- rangeRasY - rangePtsY 
    print(paste("rangeDiffX/hX:",rangeDiffX/sqrt(H[1,1]),"rangeDiffY/hY:",rangeDiffY/sqrt(H[2,2]))) 
} 

이것의 출력은 :

[1] "rangeDiffX/hX: 7.37104456534156 rangeDiffY/hY: 7.37763153209006" 
[1] "rangeDiffX/hX: 7.39015683159216 rangeDiffY/hY: 7.39151926375274" 
[1] "rangeDiffX/hX: 7.39492769120192 rangeDiffY/hY: 7.39414077521017" 
[1] "rangeDiffX/hX: 7.39909462708713 rangeDiffY/hY: 7.39917867776494" 
[1] "rangeDiffX/hX: 7.39801448966617 rangeDiffY/hY: 7.39779576937998" 
[1] "rangeDiffX/hX: 7.39679742756067 rangeDiffY/hY: 7.39745249174806" 
[1] "rangeDiffX/hX: 7.39405975028797 rangeDiffY/hY: 7.39368126656615" 
[1] "rangeDiffX/hX: 7.3913950522465 rangeDiffY/hY: 7.38980236385133" 
[1] "rangeDiffX/hX: 7.39988585440102 rangeDiffY/hY: 7.39988850314936" 
[1] "rangeDiffX/hX: 7.39529001635855 rangeDiffY/hY: 7.39475036015628" 

거기에서

(range(coordinates(output)) - range(coordinates(input)))/H = ~7.4 for each dimension. 

다음 코드를 고려 최적의 셀 수를 계산하는 함수를 작성하는 것이 간단했습니다.

gridSize <- function(pts,H,res){ 
    sizeX <- (diff(range(pts[,1])) + (7.4 * sqrt(H[1,1])))/res 
    sizeY <- (diff(range(pts[,2])) + (7.4 * sqrt(H[2,2])))/res 
    c(sizeX,sizeY) 
} 

이뿐만 아니라 다른 선택기 작동합니다

for (hMethod in c("Hlscv","Hlscv.diag","Hscv","Hpi","Hpi.diag")){ 
    for (i in seq(1:5)){ 
     pts <- data.frame(x=rnorm(100,300000,2500),y=rnorm(100,4000000,2500)) 
     ras <- raster(kde(pts,eval(call(hMethod,x=pts)),gridsize=gridSize(pts,H,30))) 
     print(paste("xres:",xres(ras),"yres:",yres(ras))) 
    } 
} 

가 생산 :

내가 원하는 30의 값에 가까운 결과를
[1] "xres: 29.8498137761045 yres: 29.8456700392426" 
    [1] "xres: 29.9573491524671 yres: 29.9874090657282" 
    [1] "xres: 29.968525344047 yres: 29.9580897162408" 
    [1] "xres: 29.9498803408057 yres: 29.964382664777" 
    [1] "xres: 29.9711108728299 yres: 29.9773401860409" 
    [1] "xres: 29.9950831714231 yres: 29.9658642153949" 
    [1] "xres: 29.9905564968586 yres: 29.982738272666" 
    [1] "xres: 29.9527729769381 yres: 29.9855591986985" 
    [1] "xres: 29.9786535322154 yres: 29.9594421322198" 
    [1] "xres: 29.9461263582666 yres: 29.9587155045891" 
    [1] "xres: 32.1494143184879 yres: 31.9656619568261" 
    [1] "xres: 31.3425525696929 yres: 31.7046601198584" 
    [1] "xres: 31.9515186102478 yres: 31.9042586036464" 
    [1] "xres: 31.5043829006183 yres: 30.0677630099221" 
    [1] "xres: 31.1816325999623 yres: 30.782974425409" 
    [1] "xres: 29.4406922338173 yres: 28.70952461795" 
    [1] "xres: 31.0945577583419 yres: 31.2995894646556" 
    [1] "xres: 29.3060327529272 yres: 29.4708662690499" 
    [1] "xres: 29.502732054192 yres: 29.3034911939017" 
    [1] "xres: 30.0529058397693 yres: 29.2893540247008" 
    [1] "xres: 27.7898933275596 yres: 29.1928490584976" 
    [1] "xres: 27.7628745096943 yres: 27.5794864810828" 
    [1] "xres: 28.9513504972817 yres: 29.7665791290592" 
    [1] "xres: 28.9569389967698 yres: 29.2103688932787" 
    [1] "xres: 28.6005579365073 yres: 29.3701912564357" 

(고유 오류의 정수 선택에있다 kde의 그리드 셀). 좀 더 정확한 해상도를 원한다면 여기에서 래스터를 다시 샘플링/분해 할 수 있습니다.

1

제 첫 번째 언급에서 말한 것처럼 : gridsize = range/resolution은 상대적으로 훌륭한 그리드 아래에 설명되어 있습니다 (기본 해상도와 비교할 수있는 것으로 선택). 그런 다음 더 거친 그리드를 보여줍니다. blindJesse가 지적했듯이 "해상도"에 대한 단위는 내가 깨달은 것보다 더 복잡합니다. 이 시점에서 나는 공간-R 메일 링리스트에 편지 초안 작성 시작 bindJesse을 권합니다 :

gridsize.x <- diff(range([email protected][,"x"]))/35 
gridsize.y <- diff(range([email protected][,"y"]))/35 
gridsize.x 
#[1] 79.57143 
gridsize.y 
# [1] 111.3429 
rimage <- raster(kde(coordinates(meuse),Hlscv(coordinates(meuse)), 
            gridsize=c(gridsize.x,gridsize.y))) 
plot(rimage) 

enter image description here

gridsize.y <- diff(range([email protected][,"y"]))/70 
gridsize.x <- diff(range([email protected][,"x"]))/70 
rimage <- raster(kde(coordinates(meuse),Hlscv(coordinates(meuse)), 
     gridsize=c(gridsize.x,gridsize.y))) 
plot(rimage) 

enter image description here

+0

kde의 출력이 입력 포인트와 동일한 범위를 가졌지 만 괜찮지는 않을 것입니다. 예제의 출력 해상도가 설정하려고 한 것 근처에 아무 것도 없다는 것을 직접 확인할 수 있습니다. 그렇습니다. 일반적인 방법으로는 작동하지만 특정 출력 해상도를 설정하는 것은 아닙니다. – blindjesse