Неожиданное поведение в spatstat неоднородных K-, F- и G-функций - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть точечный паттерн с 84 000 очков.Тесты Quadrat предложили неоднородную интенсивность, чтобы я попробовал разные полосы пропускания ядра и получил очень странное поведение в неоднородных реализациях K-, F- и G-функций.Вот пример графика неоднородной F-функции .Ясно, что предполагаемая F-функция не достигает 1 в пределах диапазона расстояний, в то время как пуассоновский процесс просто выравнивается.F-функция также должна увеличиваться, чтобы провалы были странными.При ручном указании более длинного диапазона r в функции Finhom() функция по-прежнему не выполняет оценку, выходящую за пределы рекомендуемого диапазона 2000.

К сожалению, я не могу поделиться своими данными.Тем не менее, мне удалось воспроизвести некоторые ошибки на очень простом примере точечного рисунка на единичном квадрате:

library(spatstat) # version 1.57-1
# define point pattern
ex <- as.ppp(data.frame(x = c(.9, .25, .29, .7, .72, .8, .72, .85), 
                        y = c(.1, .25, .29, .5, .5, .1, .45, .08)), 
                        W = owin(c(0,1), c(0,1)))

plot(ex) 
# testing inhomogeneity
quadrat.test(ex, 3, 3, method = "M", nsim = 500) # p around 0.05
# set bandwidth
diggle <- bw.diggle(ex)
# suggested bandwidth of 0.028

# estimate inhomogeneous F-function
Fi <- Finhom(ex, sigma = diggle)
plot(Fi, main ="Finhom for ex pattern")

Сюжет прикреплен здесь .Как и в случае с моими реальными данными, график перестает оцениваться по r = 0.5, выравнивается и не поднимается до 1. Интересно, что при подаче интенсивности напрямую через аргумент lambda в функции Finhom() поведение меняется:

lambda_ex <- density(ex, sigma = diggle, at = "points")
Fi_lambda <- Finhom(ex, lambda = lambda_ex)
plot(Fi_lambda, main ="Finhom w/ lambda directly")

Здесь функции ведут себя , как и ожидалось .

Мои вопросы:

  1. Почему существуетРазница между непосредственно поставляемой интенсивностью и интенсивностью, внутренне оцененной в функции Finhom()?

  2. , что может быть причиной странного поведения F-функции здесь?Проблема с кодом или ошибка пользователя?(Sidenote, G- и K-функции также возвращают странное поведение, чтобы кратко остановиться на этом вопросе, я сосредоточился на F-функции)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

«Неоднородные» функции Kinhom, Ginhom, Finhom включают в себя настройку пространственно изменяющейся интенсивности точечного процесса.Они работают только в том случае, если (а) интенсивность была точно оценена, и (б) точечный процесс удовлетворяет определенным техническим предположениям, которые оправдывают расчет корректировки (см. Ссылки в файлах справки или соответствующий раздел книги spatstat).

График density(ex, sigma=bw.diggle) показывает очень высокие пики и очень низкие впадины в оценочной интенсивности, что свидетельствует о недостаточном сглаживании данных, поэтому (а) не выполняется.Результаты, полученные с bw.scott или bw.CvL, ведут себя намного лучше.(Помните, что bw.diggle предназначен для кластеризованных шаблонов.) Например, я получаю довольно хороший график с

plot(Finhom(ex, sigma=bw.CvL))

Да, кажется, немного смущает, что результаты отличаются, когда «лямбда»дано как пиксельное изображение и как числовой вектор.Как объясняет Эге, это происходит из-за различных правил вычисления значения по умолчанию для важного аргумента lmin.На самом деле это не ошибка - авторы кода для Ginhom и Finhom разработали его таким образом;Я проконсультируюсь с ними, чтобы узнать, стоит ли нам это менять.В то же время вы можете согласовать два вычисления, если укажите значение lmin.

0 голосов
/ 22 ноября 2018

Как указал Адриан Бадделей в другом ответе, это не ошибка в Finhom как таковая.Можно ожидать, что

Fi <- Finhom(ex, sigma = diggle)

должно быть эквивалентно

lambda_ex <- density(ex, sigma = diggle, at = "points")
Fi_lambda <- Finhom(ex, lambda = lambda_ex)

Однако эти команды подразумевают различные значения аргумента lmin.В первом случае лямбда оценивается везде в окне и используется минимальное значение.Во втором случае используются только заданные значения лямбда, чтобы найти минимум.Это, конечно, может быть совсем по-другому.Важность lmin иллюстрируется в приведенном ниже коде (обратите внимание, что несоответствие между данными и неоднородным Пуассоном во всех случаях имеет одинаковый тип).

Другая часть, касающаяся оценки, останавливающейся при r = 0,5, неУдивительно, поскольку используется коррекция границы, а окно - это единичный квадрат.Когда r = 0,5, все окно «выбривается», поэтому данные не остаются.

library(spatstat)
#> spatstat 1.56-1.031       (nickname: 'Psycho chicken') 
X <- swedishpines
lam <- density(X, at = "points", sigma = 10)
lam_min <- min(lam)
plot(Finhom(X, lmin = lam_min), legend = FALSE, col = 1, main = "Finhom for different values of lmin")
s <- 2^(1:3)
for(i in seq_along(s)){
  plot(Finhom(X, lmin = lam_min/s[i]), col = i+1, add = TRUE)
}
s <- c(1,s)
legend("topleft", legend = paste0("min(lam)/", s), lty = 1, col = 1:length(s))

Создано в 2018-11-24 Представить пакет (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...