У меня есть некоторые точечные данные, которые представляют дневные местоположения животного в течение долгого времени, с соответствующей отметкой времени.
Я хотел бы определить все точки, где STATIONARY = TRUE. Точка считается стационарной, если 100-километровый буфер вокруг нее перекрывает дополнительные (скажем, 5) смежные во времени точки. Таким образом, если интересует 10-й день , я хочу спросить, находятся ли 5 соседних во времени дней в 100-километровом буфере этой точки. Если дни 5,6,7,8 и 9; ИЛИ дни 11, 12, 13, 14 и 15; ИЛИ 8,9,11,12,13 (и т. Д.) Находятся в буфере, тогда STATIONARY = TRUE. Однако, если дни 5,7,9,11 и 13 находятся в пределах буфера, но не чередуются (даже) дни между ними, то STATIONARY = FALSE
Я думаю, что некоторый буфер движущегося окна предоставит решение, но я не знаю, как реализовать это.
Я пытался разобраться с этой проблемой в ArcGIS и R, но пока у меня не было мозговых волн. Это самое близкое мне решение, но оно не совсем подходит, я не думаю: идентификация последовательных точек в указанном буфере
Вот некоторые фиктивные данные, которые приблизительно соответствуют моей структуре данных (хотя на самом деле у меня есть два раза в день местоположения (полдень и полночь) с отсутствующими некоторыми местоположениями - но я буду беспокоиться об этом позже)
x<-seq(0,15,length.out=20)
y<-seq(10,-10,length.out=20)
t<-seq(as.POSIXct('2013-07-01'), length.out = 20, by = "days")
data<-data.frame(cbind(x,y,t=as.data.frame.POSIXct(t)))
x y t
1 0.0000000 10.0000000 2013-07-01
2 0.7894737 8.9473684 2013-07-02
3 1.5789474 7.8947368 2013-07-03
4 2.3684211 6.8421053 2013-07-04
5 3.1578947 5.7894737 2013-07-05
6 3.9473684 4.7368421 2013-07-06
7 4.7368421 3.6842105 2013-07-07
... ... ... ...
Ответы:
Давайте разберем это на простые части. Таким образом, вся работа выполняется всего за полдюжины строк легко тестируемого кода.
Во-первых, вам нужно будет рассчитать расстояния. Поскольку данные представлены в географических координатах, здесь есть функция для вычисления расстояний на сферическом уровне (с использованием формулы Хаверсайна):
Замените это вашей любимой реализацией, если хотите (например, с использованием эллипсоидальных данных).
Далее нам нужно вычислить расстояния между каждой «базовой точкой» (проверяемой на стационарность) и ее временной окрестностью. Это просто вопрос применения
dist
к соседству:В-третьих, это ключевая идея - стационарные точки находятся путем обнаружения окрестностей из 11 точек, имеющих не менее пяти рядов, расстояния которых достаточно малы. Давайте реализуем это немного более широко, определяя длину самой длинной подпоследовательности истинных значений в логическом массиве логических значений:
(Мы находим местоположения ложных значений по порядку и вычисляем их различия: это длины подпоследовательностей не ложных значений. Возвращается наибольшая такая длина.)
В-четвертых, мы применяем
max.subsequence
для обнаружения стационарных точек.Это все инструменты, которые нам нужны.
В качестве примера давайте создадим некоторые интересные данные, имеющие несколько скоплений стационарных точек. Я совершу случайную прогулку возле экватора.
Массивы
lon
иlat
содержат координаты, в градусах,n
точек в последовательности. Применение наших инструментов просто после первого преобразования в радианы:Аргумент
p[max(1,i-5):min(n,i+5), ]
говорит, что нужно смотреть назад на 5 временных шагов или на 5 временных шагов от базовой точкиp[i,]
. Включаяk=5
говорит, чтобы искать последовательность из 5 или более подряд, которые находятся в пределах 100 км от базовой точки. (Значение 100 км было установлено по умолчанию,is.stationary
но вы можете переопределить его здесь.)На выходе
p.stationary
получается логический вектор, указывающий на стационарность: у нас есть то, для чего мы пришли. Однако для проверки процедуры лучше составить график данных и этих результатов, а не проверять массивы значений. На следующем участке я показываю маршрут и точки. Каждая десятая точка помечена, чтобы вы могли оценить, сколько из них может перекрываться в стационарных скоплениях. Стационарные точки перерисовываются сплошным красным, чтобы выделить их, и окружены их 100-километровыми буферами.Для других (основанных на статистике) подходов к поиску стационарных точек в отслеживаемых данных, включая рабочий код, посетите страницу /mathematica/2711/clustering-of-space-time-data .
источник