Близькість у просторі та часі


10

У мене є деякі точкові дані, які представляють щоденні місця розташування тварини з пов’язаними часом.

Я хотів би визначити всі моменти, де СТАТАРІЯ = ІСТИНА. Точка вважається нерухомою, якщо буфер на 100 км навколо неї перекриває додаткові (скажімо) 5 тимчасово сусідніх точок. Отже, якщо 10 день є моєю цікавою точкою, я хочу запитати, чи є 5 тимчасово суміжних днів у межах буфера на 100 км від цієї точки. Якщо дні 5,6,7,8 & 9; АБО дні 11,12,13,14 & 15; АБО дні 8,9,11,12,13 (тощо) знаходяться в межах буфера, тоді СТАЦІОНАРНИЙ = ІСТИНА. Якщо, однак, дні 5,7,9,11 та 13 знаходяться в межах буфера, але не є альтернативними (рівними) днями між ними, то СТАЦІОНАРНИЙ = ЛАЖНИЙ

Я думаю, що якийсь буфер переміщення вікон забезпечить рішення, але я не знаю, як це реалізувати.

Я намагався вирішити цю проблему як в 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
... ...         ...       ...

1
Питання? Якщо припустити, що всі 10 балів знаходяться в буфері, і ви маєте поділ дати (починаючи з 1-го дня) 1-3-4-12-13-20-21-22-29-30, то ви говорите, що вас цікавить лише вибір пунктів що в днях 1,2,3,4 & 12?
Hornbydd

Ні, мене цікавлять лише дні 1-4. Якщо тварина "покидає" буфер, то повертається 12 (або 6 день), то це "скасує" цей стаціонарний період - тобто тварина повинна знаходитися в буфері в день 1-2-3-4-5 для точка в центрі буфера, що підраховується. Мати сенс? Я сам не впевнений ..
Том Фінч

1
Просто для перевірки, чи цікавою була б день 7, то вас зацікавили б пункти, які потрапляють у межах 100 км за дні 7,8,9,10 та 11?
Hornbydd

Точка 7 була б обрана як стаціонарна точка, якби дні 8,9,10, 11 та 12 проходили 100 км. Або днів 5,6,8,9,10. Отже, будь-яка одна точка вибирається, якщо будь-які інші 5 тимчасово сусідніх точок (5 попередніх днів, 5 наступних днів або кілька днів обидві сторони) знаходяться в межах буфера. Я думаю, що рухоме вікно - це найкращий спосіб його концептуалізації. Для кожної «фокусної точки» будь-яку точку, що перевищує 5 днів у минуле / майбутнє, можна забути. Я можу оновити своє первісне запитання, тому що зараз я його розумію трохи більше ...
Том Фінч

Який формат даних? Наприклад, чи є у вас кожен раз / місце розташування як векторна точка у файлі форм і таблиці атрибутів, що зберігає час? Або кожен раз / місце зберігаються окремо в різних формах? Дані навіть не в геопросторовому форматі, а просто у файлі Excel? Знаючи це, ми допомогли б відповісти.

Відповіді:


12

Розбиймо це на прості шматки. Тим самим вся робота виконується лише за півдесятка рядків легко перевіреного коду.

По-перше, вам потрібно буде обчислити відстані. Оскільки дані знаходяться в географічних координатах, тут є функція для обчислення відстаней на сферичній даті (за формулою Гаверсіна):

#
# Spherical distance.
# `x` and `y` are (long, lat) pairs *in radians*.
dist <- function(x, y, R=1) {
  d <- y - x
  a <- sin(d[2]/2)^2 + cos(x[2])*cos(y[2])*sin(d[1]/2)^2
  return (R * 2*atan2(sqrt(a), sqrt(1-a)))
}

За бажанням замініть це улюбленою реалізацією (наприклад, такою, яка використовує еліпсоїдальну дату).

Далі нам потрібно буде обчислити відстані між кожною "базовою точкою" (перевіряється на стаціонарність) та її тимчасовим сусідством. Це просто питання звернення distдо мікрорайону:

#
# Compute the distances between an array of locations and a base location `x`.
dist.array <- function(a, x, ...) apply(a, 1, function(y) dist(x, y, ...))

По-третє - це ключова ідея - стаціонарні точки знаходять, виявляючи мікрорайони з 11 пунктів, що мають принаймні п’ять поспіль, відстань яких досить мала. Давайте реалізуємо це трохи більш загально, визначивши довжину найдовшого підпорядкування справжніх значень у логічному масиві булевих значень:

#
# Return the length of the longest sequence of true values in `x`.
max.subsequence <- function(x) max(diff(c(0, which(!x), length(x)+1)))

(Ми знаходимо розташування помилкових значень в порядку і обчислюємо їх відмінності: це довжини підрядів неправдивих значень. Повертається найбільша така довжина.)

По-четверте, ми застосовуємо max.subsequenceдля виявлення стаціонарних точок.

#
# Determine whether a point `x` is "stationary" relative to a sequence of its
# neighbors `a`.  It is provided there is a sequence of at least `k`
# points in `a` within distance `radius` of `x`, where the earth's radius is
# set to `R`.
is.stationary <- function(x, a, k=floor(length(a)/2), radius=100, R=6378.137) 
  max.subsequence(dist.array(a, x, R) <= radius) >= k

Це всі необхідні нам інструменти.


Як приклад, давайте створимо кілька цікавих даних, що мають кілька скупчень нерухомих точок. Я пройдусь випадковою прогулянкою біля Екватора.

set.seed(17)
n <- 67
theta <- 0:(n-1) / 50 - 1 + rnorm(n, sd=1/2)
rho <- rgamma(n, 2, scale=1/2) * (1 + cos(1:n / n * 6 * pi))
lon <- cumsum(cos(theta) * rho); lat <- cumsum(sin(theta) * rho)

Масиви lonі latмістять координати в градусах, nточки в послідовності. Застосування наших інструментів просте після першого перетворення в радіани:

p <- cbind(lon, lat) * pi / 180 # Convert from degrees to radians
p.stationary <- sapply(1:n, function(i) 
  is.stationary(p[i,], p[max(1,i-5):min(n,i+5), ], k=5))

Аргумент p[max(1,i-5):min(n,i+5), ]говорить, що слід дивитися на відстань на 5 кроків часу або вперед, як на 5 часових кроків від базової точки p[i,]. В тому числі k=5говорить, щоб шукати послідовність з 5 або більше підряд, які знаходяться в межах 100 км від базової точки. (Значенням 100 км було встановлено за замовчуванням, is.stationaryале ви можете його замінити тут.)

Вихід p.stationaryє логічним вектором, що вказує на стаціонарність: ми маємо те, за що прийшли. Однак для перевірки процедури краще побудувати дані та ці результати, а не перевіряти масиви значень. На наступному сюжеті я показую маршрут та пункти. Кожна десята точка позначена міткою, так що ви можете оцінити, скільки може перекриватися в межах нерухомих скупчень. Стаціонарні точки перемальовуються суцільним червоним кольором, щоб виділити їх та оточити їхніми 100 км буферами.

Малюнок

plot(p, type="l", asp=1, col="Gray", 
     xlab="Longitude (radians)", ylab="Latitude (radians)")
points(p)
points(p[p.stationary, ], pch=19, col="Red", cex=0.75)
i <- seq(1, n, by=10)
#
# Because we're near the Equator in this example, buffers will be nearly 
# circular: approximate them.
disk <- function(x, r, n=32) {
  theta <- 1:n / n * 2 * pi
  return (t(rbind(cos(theta), sin(theta))*r + x))
}
r <- 100 / 6378.137  # Buffer radius in radians
apply(p[p.stationary, ], 1, function(x) 
  invisible(polygon(disk(x, r), col="#ff000008", border="#00000040")))
text(p[i,], labels=paste(i), pos=3, offset=1.25, col="Gray")

Для інших (на статистиці) підходів до пошуку стаціонарних точок у відстежуваних даних, включаючи робочий код, відвідайте /mathematica/2711/clustering-of-space-time-data .


вау, спасибі! з нетерпінням чекаю, що я обернусь цим головою. ще раз дякую за ваш час та зусилля
Том Фінч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.