2012-06-06 2 views
4

저는 개인 핸드폰으로 기록 된 분당 GPS 좌표로 데이터 세트를 가지고 있습니다. 나는. 데이터 세트에는 LON/LAT 값이있는 1440 개의 행이 있습니다. 데이터를 바탕으로 참가자가있는 곳의 지점 추산 (lon/lat 값)을 원합니다. 가정은 주어진 24 시간 간격으로 대부분의 시간을 보내는 단일 위치라고 가정합시다. 또한 GPS 센서는 대부분 정확도가 높지만 때로는 완전히 벗어나서 거대한 이상치가 발생합니다.2D 그리드/포인트 프로세스에서 밀도 피크/클러스터 중심 찾기

이 문제를 해결하는 가장 좋은 방법은 포인트 프로세스로 사용하고 2D 밀도 추정을 사용하여 피크를 찾는 것입니다. R에서이 작업을 수행 할 원시 방법이 있습니까? 나는 kde2d (MASS)를 들여다 보았다. 그러나 이것은 실제로 트릭을하는 것처럼 보이지 않았다. Kde2d는 밀도 값을 사용하여 25x25 크기의 데이터 범위를 만듭니다. 그러나 내 데이터에서 사람은 하루에 100 마일 이상 쉽게 여행 할 수 있으므로 이러한 블록은 일반적으로 예상치가 너무 큽니다. 나는 그들을 좁힐 수 있고 훨씬 더 큰 그리드를 사용할 수 있지만, 나는 포인트 추산을 얻는 더 좋은 방법이 틀림 없음이 틀림 없다고 확신한다.

+0

좌표의 중심을 찾고 있다면 좌표의 클러스터링 알고리즘이 합리적인 접근 방식 일 수 있습니다. 하나의 중심을 가진 kmeans입니다. 'flexclust' 패키지는'kmedians' 옵션을 가지고 있습니다. 어떤 문제를 아웃 라이어와 함께 완화시킬 수 있습니다. – mnel

+0

저는 kmeans가 너무 많은 포인트를 함께 묶을 것이라고 걱정합니다. (예 : 집과 함께 하나의 클러스터를 찾을 수도 있습니다. 근처의 슈퍼마켓과 커피 숍). 그러면이 클러스터의 중심이 실제로 꺼질 것입니다. 포인트를 그룹으로 분류하지 않고 직접 고밀도 위치를 찾는 것이 좋습니다. – Jeroen

+0

예. 아마도 너무 단순한 해결책 일 것입니다. 방문한 위치의 범위를보고 경계를 정의한 다음 kde2d에서 눈에 띄는 공간 해상도를 반영하여 격자 점의 수를 정의 할 수 있습니다. – mnel

답변

6

trip 패키지에는 "시간이 많이 걸렸습니다"기능이 있습니다 (저자명). 시간이 지남에 따라 기본 트랙 프로세스를 이해하는 트랙 데이터에서 객체를 생성하고 수정 사이에 직선 세그먼트를 가정하여 포인트를 처리하기 만하면됩니다. '집'에 최대 값 픽셀이있는 경우, 즉 기간을 기준으로 모든 세그먼트를 분할하여 셀로 합산하면 쉽게 찾을 수 있습니다. tripGrid 함수에서 "시간을 소비 한"그리드는 표준 sp 패키지 클래스 인 SpatialGridDataFrame이며, 트립 객체는 하나 이상의 트랙으로 구성 될 수 있습니다.

rgdal을 사용하면 lon/lat가 범위에 적합하지 않은 경우 쉽게 좌표를 적절한지도 투영으로 변환 할 수 있지만 그리드/시간 소비 선분 계산에는 아무런 차이가 없습니다.

움직임이 너무 빠름을 암시하지만 매우 단순하고 새로운 문제를 야기 할 수있는 픽스를 제거하는 간단한 방법이 있습니다. 일반적으로 가능성이없는 이동을 위해 트랙을 업데이트하거나 필터링하는 것은 매우 복잡 할 수 있습니다. (내 경험상 기본 시간을 그리딩하는 것은 새로운 합병증을 열어주는 정교한 모델만큼 견적을 얻는다.) 이 필터는 거리를 계산하기 위해 sp의 도구를 사용하여 데카르트 또는 long/lat 좌표와 함께 작동합니다 (long/lat는 신뢰할 만하지만 잘못된지도 투영 선택은 인간과 같은 짧은 거리에서 문제가 될 수 있음).

(함수 tripGridpixellate.psp을 사용하여 직선 세그먼트의 정확한 구성 요소를 계산하지만 그 세부 정보는 구현에 숨겨져 있습니다.)

데이터 준비의 측면에서 볼 때 trip은 합리적인 순서로 엄격하게 처리되며 데이터가 중복되거나 순서가 잘못된 경우 개체를 만들지 못하게합니다. 텍스트에서 데이터를 읽는 예제가 있습니다 더미 트랙이 겹치는 지역이 없습니다

library(trip) 
d <- data.frame(x = 1:10, y = rnorm(10), tms = Sys.time() + 1:10, id = gl(1, 5)) 
coordinates(d) <- ~x+y 
tr <- trip(d, c("tms", "id")) 
g <- tripGrid(tr) 

pt <- coordinates(g)[which.max(g$z), ] 
image(g, col = c("transparent", heat.colors(16))) 
lines(tr, col = "black") 
points(pt[1], pt[2], pch = "+", cex = 2) 

,하지만 그것은 "보낸 시간"의 최대 지점을 찾는 간단하다 있음을 보여줍니다 ?trip에서 파일 및 (정말) 더미 데이터와 매우 간단한 예입니다.

3

모든 이벤트에 대한 총 제곱 거리를 최소화하는 위치를 사용하는 것은 어떻습니까? 내 두뇌가 올바르게 작동하면 커널의 평활도에 가깝습니다.

데이터가 두 개의 클러스터 (집과 직장)로 구성되어있는 경우 위치가 가장 큰 클러스터에 위치한다고 생각합니다. x와 y 좌표의 단순한 평균과 같지 않습니다.

불확실한 점은 위치 불확실성이 무엇이든 상관없이 데이터를 지터하십시오 (GPS로 얻은 가치가 있다면 좋을 것입니다, 그렇지 않으면 50 미터입니까?). 그리고 다시 계산하십시오. 100 번 해보고, 그 위치의 커널을 부드럽게하고 95 % 윤곽선을 찾으십시오. spacedman에 대응

엄격한 아니, 내가이 최소 거리/커널 supremum 일을 실험 할 필요가 ...

+0

슈퍼 미라셨습니까? – mdsumner

+0

아니요, 내일 그녀의 생일을 상기시켜 줘서 고마워. 나는 표면을 부드럽게하는 커널의 최대 위치를 의미했다 ... 오늘 이것을 생각할 시간이있다. – Spacedman

0

- 나는 최소 제곱가 작동하지 않습니다 확신합니다. 최소 제곱은 '주변'에 많은 비중을 두지 않고 이상 치의 요구에 굴복하는 것으로 잘 알려져 있습니다. 이것은 원하는 것과 반대입니다.

제 생각에 bisquare 견적 기가 아마도 더 잘 작동 할 것입니다. 그러나 나는 그것을 사용한 적이 없습니다. 나는 또한 약간의 조정이 필요하다고 생각한다.

0에서 특정 거리에 대한 최소 제곱 추정량과 비슷하지만 가중치는 그 이상입니다. 그래서 한 포인트가 이상치가되면 벌칙은 일정합니다. 특이 치를 멀리 떨어 뜨리면 특이 치가 점점 더 커지는 것을 원하지 않으며, 우리는 항상 계량 적으로 계량화하고, 클러스터 주변의 상황을보다 잘 맞추는 데 중점을 둡니다.