Статистичні тести для просторових ліній?


32

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

Дані, які я хочу проаналізувати, - це ОР (походження-призначення) лінії руху людини та тварин. (Аналогічно прикладу в Кластеризації непрямих ліній .)

Поки одна ідея полягала в тому, щоб розглядати лінії, як 4D точки, і використовувати тестові схеми, але я не впевнений, чи це підходить.

Ідеальний тест дозволив би визначити, є кластери ліній чи ні.

Інстинктивно я б сказав, що багато ліній, які починаються з одного походження, але мають всілякі різні напрямки, не слід вважати кластером. З іншого боку, багато ліній, які тривають (близькі до) паралельно довший час, були б кластером. введіть тут опис зображення


Якою має бути ваша поведінка, якщо одна лінія паралельна іншій лінії, але 1) набагато коротша, ніж перша лінія або 2) "далеко" в напрямку до першої лінії
radouxju

@radouxju у цих випадках я б сказав, що вони не належать до одного кластеру
underdark

Відповіді:


17

Це складне питання, оскільки просто не було багато просторових статистичних процесів, розроблених для особливостей ліній. Без серйозного заглиблення в рівняння та код, статистика точкових процесів не легко застосувати до лінійних ознак і, таким чином, статистично недійсна. Це тому, що нуль, на який протестується дана закономірність, ґрунтується на точкових подіях, а не лінійних залежності у випадковому полі. Треба сказати, що я навіть не знаю, якою буде нуль, наскільки інтенсивність та розташування / орієнтація будуть ще складнішими.

Я просто плюнув кулю, але мені цікаво, чи багатомасштабна оцінка щільності лінії в поєднанні з евклідовою відстані (або відстань Хаусдорфа, якщо лінії складні) не вказуватиме на постійний показник кластеризації. Потім ці дані можуть бути узагальнені до лінійних векторів, використовуючи відмінність для обліку розбіжності в довжинах (Thomas 2011), і присвоїти значення кластеру, використовуючи статистику, таку як K-засоби. Я знаю, що вам не надані кластери, але значення кластера може розділити ступеня кластеризації. Це, очевидно, вимагало б оптимального розміщення k, тому довільні кластери не присвоюються. Я думаю, що це був би цікавий підхід при оцінці структури краю в теоретичних моделях графа.

Ось відпрацьований приклад в R, вибачте, але він швидший і відтворюваний, ніж надання прикладу QGIS, і більше в моїй зоні комфорту :)

Додайте бібліотеки і використовуйте мідний об'єкт psp зі spatstat як приклад рядка

library(spatstat)
library(raster)
library(spatialEco)

data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/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))

Примусовий spatstat 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 (кількість кластерів) за допомогою функції optimal.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-K-hat (для безмаркірованих точкових процесів). Іншим підходом може бути аналіз кросу (наприклад, крос-К), де два точкові процеси тестуються одночасно, позначаючи їх як [початок, зупинка]. Це вказувало б на відстані співвідношень у процесі кластеризації між початковою та зупинкою. Однак, просторова залежність (нестаціонарність) від основного процесу інтенсивності може бути проблемою для цих типів моделей, що робить їх неоднорідними та вимагає іншої моделі. За іронією долі, неоднорідний процес моделюється за допомогою функції інтенсивності, яка повертає нас до повного кола до щільності, таким чином, підтримуючи ідею використання інтегрованої в масштаб щільності як міру кластеризації.

Ось швидкий приклад того, як статистика Ripleys K (Besags L) для автокореляції процесу без маркування з використанням пунктів старту, зупинки класу функцій лінії. Остання модель - це крос-к, що використовує як місця запуску, так і зупинки як номінальний маркований процес.

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) ) )

Список літератури

Томас JCR (2011) Новий алгоритм кластеризації, заснований на K-засобах, що використовують як прототип лінійний сегмент. В: Сан-Мартин С., Кім SW. (eds) Прогрес у розпізнаванні візерунків, аналізі зображень, комп’ютерному баченні та додатках. CIARP 2011. Конспекти лекцій з інформатики, т. 7042. Спрингер, Берлін, Гейдельберг


14

Ви можете заглянути в відстань Фреше . Я нещодавно дізнався про це після нещодавнього запитання, що шукає реалізації python.

Це показник для знаходження просторової подібності рядків . Це схожа ідея на відстань Хаусдорфа, еквівалентна мірам подібності полігону, але для рядків з напрямком.

Відстань Фреше визначається як мінімальна довжина повідка, що з'єднує собаку на одній траєкторії з її власником на другій траєкторії, обидві ніколи не рухаються назад

Цей показник матиме невелике значення для двох кривих, які розташовані близько, майже паралельно, вирівняні однаково і з однаковою довжиною.

Однак це не відповідає частині ідентифікації кластера.

Тут є вичерпна презентація . Ваша ситуація звучить як деякі випадки використання, згадані в розділах 46-49

Цей показник має безліч геопросторових звичаїв, таких як

  • виявлення загальних підшартов у послідовності генів
  • розпізнавання рукописного тексту
  • виявлення співвідносних періодів у часових рядах, таких як історія цін на акції

тож хоча багато робіт у бібліографії висвітлюють цю тему, більшість із них не є геопросторовими. Крім того, більшість цих робіт підпадає під алгоритміку / математику / інформатику, а не на геопросторові / геонауки і спрямовані відповідно.

Однак цей документ виглядав багатообіцяючим:

Бучін, К., Бучин, М., Ван, Ю. (2009). Точні алгоритми часткового узгодження кривої через відстань Фреше. У працях 20-го симпозіуму ACM-SIAM з дискретних алгоритмів, стор. 645–654

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


2
Я думаю, кластеризація мінімальних зв'язків (або DBSCAN) за допомогою відстані Фреше або Хаусдорфа замість відстані Евкліда буде приємним рішенням.
дбастон

Мені подобається, що відстань Фреше існує, і мені також подобається, що у презентації порівнюються "медузи" та "черевоногі".
Фестер

5

Я пропоную використовувати підхід, аналогічний описаному тут .

АЛГОРИТМ і називання:

a) Назвіть рівень рядка NODES. Обчислити підшипники

б) просторово приєднатися до себе (один до багатьох), використовуючи відстань на відстані. Шар імені ПОСИЛАННЯ

c) видалити з LINKS приєднується до себе, тобто NAME = NAME_1

г) всередині ПОСИЛАННЯ знайдіть «однакові» пари напрямів. Я використав:

def theSame(aList,tol):
    maxB=max(aList);minB=min(aList)
    if abs(maxB-minB)<tol:return 1
    if abs(maxB-minB-180)<tol:return 1
    return 0
#-----------
theSame( [!BEARING!, !BEARING_1!],15)

тобто припущені лінії, що йдуть у зворотному напрямку, схожі за напрямом

г) видалити не схожі (0) пари з ПОСИЛАННЯ.

e) обчислити групи посилань, з'єднаних через NODES, та номери груп передачі до таблиці NODES:

введіть тут опис зображення

На жаль:

введіть тут опис зображення

Однак проста статистика підшипників у групі, наприклад стандартне відхилення:

abs(tan(bearing))

не показано відхилень у першому випадку та дуже велике у другому. Аналогічно, статистика довжин може допомогти "паралельно тривати паралельно".

Якщо вище викликає інтерес, я можу оновити відповідь за допомогою сценарію, який обчислює пов'язані групи посилань. Він використовує модуль arcpy та networkx.

Не знаєте, як лікувати пару ліній, що йдуть від тієї ж точки в протилежних напрямках ...


Мені було б цікаво переглянути сценарій.
alphabetasoup

1
@RichardLaw перейдіть за посиланням у 1-му рядку мого рішення та прокрутіть униз, щоб побачити його. У мене є трохи краще відшліфована версія, але це зробить. Логіка надзвичайно проста: 1. зробіть графік, використовуючи приєднані до нього посилання та вузли 2. Візьміть 1-й вузол і знайдіть предків (група 0) 3) видаліть вузли з графіка і повторіть, поки не залишиться жодних вузлів. Я використовую це неодноразово, щоб знайти роз'єднані групи труб (потоки та інше) тощо для високоякісних наборів даних Ради /
ЛІНЗ

5

В моїх очах існує проблема з визначенням рядків, яка визначає, які підходи використовувати (деякі із згаданих вище). Якщо це пари OD, і геометрія не грає ролі, я б підійшов до цього, грунтуючись на мережевій кластеризації. Ви кажете, що мережі не утворюють мережу - так і нехай, але ймовірно, що джерела та місця призначення потрапляють у значущі регіони, і, таким чином, ви можете трактувати це як мережу.

Якщо про геометрію є що сказати (це, скажімо, траєкторії GPS, і ви хочете врахувати геометрію), то вам знадобиться дійсно працювати в (х, у, т) просторі - подібна геометрія сліду руху, але в різних Часи можуть не оцінюватися як однакові - це не вказано у питанні.

Деякі можливості, на які ви можете подивитися:

  1. Найближчим до ваших потреб є Dodge, Weibel, Forootan (2009), тут http://orca.cf.ac.uk/94865/1/PhysicsMovement.pdf
  2. Якщо геометрію можна спростити, можливо, параметри, згадані тут, можуть бути корисними: http://www.tandfonline.com/doi/full/10.1080/17445647.2017.1313788

Але, нарешті, перечитавши ще раз своє початкове запитання, це може бути простіше: чи можна обчислити попарно (між сегментами) відстань між перетином лінійного розширення сегментів та їх найближчими точками, якось нормалізуватись (можливо, виходячи з довжини самого сегмента) та використовувати алгоритм кластеризації матриць? Обґрунтування: відрізки, що перетинаються далеко, більш схожі (паралельні), ніж ті, що перетинаються поруч. На кресленнях ви не кажете, як поводитися з лінійними або паралельними відрізками, які знаходяться в зміщенні (довгий розрив частоти). Я припускаю, що це може спричинити неприємності для рішення вище. (відредаговано для наочності, чітко вказавши "лінійне розширення" вище)

Примітка (січень 2018 р.): Нещодавно я натрапив на це:

  1. Чай, Юхан та Реймонд Нг. "Індексація просторово-часових траєкторій за допомогою многочленів Чебишева." Матеріали міжнародної конференції ACM SIGMOD 2004 року з питань управління даними. ОСБ, 2004.

Це стосується подібності траєкторії і, таким чином, дозволило б певною мірою оцінити подібність. На цьому ґрунтується поліноміальне наближення кривих та обчислення відстані Чебишева.


4

Чи можете ви детальніше розповісти про тип даних, з яким ви працюєте? Це лише ряд роз'єднаних ліній чи вони утворюють мережу? Чи використовували ви будь-який із інструментів ArcGIS для аналізу просторової структури? Багато методів ArcGIS (індекс Ріплі, NN індекс, Моранс I) просто використовують центроїд ліній / багатокутників при використанні на неточкових даних. Однак тут вам може знадобитися розглянути розділення кожної лінії на рівні відрізки, щоб уникнути розгляду дуже довгих ліній через те, що їх центр знаходиться дуже далеко.

Інша річ, про яку слід подумати - це концептуально це скупчення ліній? У вас може бути багато рядків, що походять близько один від одного, але тоді їх кінцеві точки можуть бути розігнані. Так само ви можете отримати багато рядків, які починаються та закінчуються дуже близько один до одного, але потім стають дуже розсіяними між їх початковими та кінцевими точками.

Одним із підходів, однак, може бути просто провести аналіз щільності ліній, щоб ділянки з більшою кількістю ліній (які можна було б вважати згрупованими в деякому сенсі) матимуть високі значення сітки, тоді як ділянки з низькою щільністю матимуть низькі значення. Таким чином, ви отримуєте трохи виходу гарячої точки; однак це не дає вам жодної статистики, як Моранс I або NNI. Він також не буде відрізняти щільність в результаті однієї дуже неправильної лінії (тобто щільної спіралі) проти багатьох ліній.

Вибачте, це не є повною відповіддю на вашу проблему, але я думаю, що цвях повної концепції того, що ви намагаєтесь досягти, може запропонувати кращі рішення.

ОНОВЛЕННЯ

Виходячи з прикладу, який ви наводили, я думаю, що пропозиція FelixlP створити точку з атрибутом несучої лінії для використання при заходах з точковим малюнком - це, мабуть, хороший спосіб. За винятком того, що я б розділив точки на рівні відрізки і мав би точку з лінією, що несе в кожній вершині лінії. Тоді потрібно подивитися на заходи, які будуть дивитися на близькість кожної точки і схожість між підшипниками (так ви виявите лінії, ближчі до перпендикуляру).

Тож використання GI Getis-Ord (аналіз Hotspot) було б хорошим інструментом для візуалізації місця розташування кластерів; а потім глобальний Іран Морана для оцінки глобального рівня кластеризації.

Відстань, на якій ви сегментуєте лінії, однак впливатиме на знайдений ступінь кластеризації. Якщо ви шукаєте кластери за шкалою 1 км, тоді вам потрібно буде сегментувати лінії навколо цього. Аналогічно, якщо ви шукаєте кластери в масштабі 100 м, вам потрібно буде відповідно сегментувати лінії. Це так, що ви не пропускаєте рядки, а також не визначаєте кожен рядок як кластер.


Лінії відображають походження та напрямки подорожі. Вони не утворюють мережі. Я до цього часу використовував методи R для просторових точкових моделей точок початку та призначення. Мені не дуже подобається ідея використання лінійних центроїдів, але, можливо, варто спробувати ущільнити лінію та проаналізувати отримані вузли, дякую!
underdark

Аналіз щільності лінії може бути резервним рішенням, якщо я не можу знайти щось більш підходяще.
underdark

Чи буферизація первинного рядка певна відстань, а потім запит на лінії, які не повністю закриті буфером, є рішенням? У минулому я багато робив для цього, щоб знайти найбільш вірогідний пройдений маршрут, але дані складалися з багатовузлових поліліній, а не простих лінійних сегментів.
jbgramm

@jbgramm Я можу придумати багато підходів, які б щось обчислили, але я не статистик, і тому я шукаю встановлені методи - якщо такі існують
underdark

2
Використання точкової лінії або вершин для представлення точкових процесів не є статистично достовірним підходом. Крім того, ви глибоко змінюєте подання просторового процесу. Я опублікую деякі зауваження, але, чесно кажучи, єдиний, який запропонував дещо справедливий підхід, - це пропозиція @underdark про щільність лінії. Навколо масштабів у поєднанні зі статистикою автокореляції вказувало б на ступінь кластеризації лінійних ознак.
Джефрі Еванс

3

Дякую за приклади.

Я не бачив жодних усталених методів розрахунку того, що ви шукаєте, проте це був би мій підхід. Це свого роду жорстоке рішення.

Обчисліть мінімальний обмежуючий прямокутник, а потім розгорніть його довільну, але рівну велику кількість на кожному з чотирьох кутів.

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

Тест на паралелізм від кожного з чотирьох кутів до кінця кожного променя. Випробування на паралелізм від центру маси до кінця кожного променя.

Роблячи це, ви могли порівняти відхилення від кутів до кінців. У прикладі (а) у вас були б паралельні прямі від двох кутів до кожного з трьох кластерних ліній. У вас також були б паралельні лінії від центру маси до кінців далеких кінців ліній.

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

Приклад (с) здається випадковим

Приклад (d) не випадковий, він радіальний.

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

Сказане - лише думка одного дурня, і я, мабуть, помиляюся.


-1

Дотримуючись вашого інстинктивного опису, який критерій для двох рядків є паралельними?

Ви можете в основному зробити тест на початкові або кінцеві точки:
Нехай Sx = (start_x_line_1 - start_x_line_2),
Sy = (start_y_line_1 - start_y_line_2)
та Ex, Ey те саме, але для їх кінцевих точок.

Отже, якщо sqrt (Sx² + Sy²) AND sqrt (Ex² + Ey²) нижче певного порогу, ви можете вважати ці рядки паралельними.

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