Как реализовать двумерную функцию К Рипли?

9

Прикрепленное изображение показывает лесную щель с красной сосной, представленной в виде кругов, и белой сосной, представленной в виде крестов. Мне интересно определить, существует ли положительная или отрицательная связь между двумя видами сосен (то есть, растут ли они в одних и тех же областях). Я знаю о Kcross и Kmulti в пакете R spatstat. Однако, поскольку у меня есть 50 пробелов для анализа и я более знаком с программированием на python, чем с R, я хотел бы найти итеративный подход с использованием ArcGIS и python. Я также открыт для R решений.

Как я могу реализовать двумерную функцию К Рипли?

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

Аарон
источник
4
Для вашего второго запроса вы можете почерпнуть вдохновение из этого ответа . Перемешивание меток должно быть легко в Python. Для пространственной статистики в Python вы можете посмотреть на PySAL .
MannyG

Ответы:

8

После долгих поисков по задним краям документации ESRI я пришел к выводу, что нет разумного способа запустить двумерную функцию К Рипли в Arcpy / ArcGIS. Тем не менее, я нашел решение, используя R:

# Calculates an estimate of the cross-type L-function for a multitype point pattern.
library(maptools)
library(spatstat)
library(sp)

# Subset certain areas within a points shapefile.  In this case, features are grouped by gap number
gap = 1

# Read the shapefile
sdata = readShapePoints("C:/temp/GapPoints.shp")  #Read the shapefile
data = sdata[sdata$SITE_ID == gap,]  # segregate only those points in the given cluster

# Get the convex hull of the study area measurements
gapdata = readShapePoints("C:/temp/GapAreaPoints_merged.shp")  #Read the shapefile that is used to estimate the study area boundary
data2 = gapdata[gapdata$FinalGap == gap,]  # segregate only those points in the given cluster
whole = coordinates(data2) # get just the coords, excluding other data
win = convexhull.xy(whole) # Convex hull is used to get the study area boundary
plot(win)

# Converting to PPP
points = coordinates(data) # get just the coords, excluding other data
ppp = as.ppp(points, win) # Convert the points into the spatstat format
ppp = setmarks(ppp, data$SPECIES) # Set the marks to species type YB or EH
summary(ppp) # General info about the created ppp object
plot(ppp) # Visually check the points and bounding area

# Plot the cross type L function
# Note that the red and green lines show the effects of different edge corrections
plot(Lcross(ppp,"EH","YB"))

# Use the Lcross function to test the spatial relationship between YB and EH
L <- envelope(ppp, Lcross, nsim = 999, i = "EH", j = "YB")
plot(L)
Аарон
источник
3
Кроме того, в библиотеке spatstat реализована двумерная модель К. Рипли. Нецелесообразно определять область исследования с помощью выпуклой оболочки точек, см. Функцию ripras и цитируемую литературу.
Энди Ш
2
Обратите внимание, что вы стандартизируете нулевое ожидание около нуля и, таким образом, получаете статистику Besag-L.
Джеффри Эванс
6

Существует встроенный инструмент сценария под названием Multi-Расстояние Пространственный анализ кластеров (K Функция Ripleys) при пространственной статистики - Анализ Patterns Toolset в ArcToolbox. Вы можете прочитать исходный код инструмента, если зайдете в его свойства и найдете скрипт, используемый на вкладке «Источник».

blah238
источник
Любая идея о том, как запустить K как двумерную функцию в Arc, если это вообще возможно?
Аарон
1
Я уверен, что это возможно, но я не мог сказать вам, как это сделать. Вы смотрели на исходный код встроенного инструмента, чтобы увидеть, какие изменения необходимо внести?
blah238
Исходный код выглядит довольно интенсивно. Я решил изучить R решения.
Аарон
3
Я действительно не стал бы пытаться изменить код ArcGIS Python. В лучшем случае это код спагетти, который не выполняет правильного теста на значимость. Для двумерных задач точечного процесса особенно важно выполнить критерий значимости Монте-Карло, который доступен в R с функцией «envelop».
Джеффри Эванс
1
Спасибо, Джеффри, я не знаю, о чем думал, и рекомендую всем взглянуть на исходный код ESRI :)
blah238