Каковы правила для объектов ppp? Возможен ли выбор двух переменных для функции sapply?

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

library(spatstat)
lambda<-100
win<-owin(c(0,1),c(0,1))
n.seeds<-lambda*win$xrange[2]*win$yrange[2]

Как только окно определено, я генерирую свои точки, используя функцию случайной генерации.

x=runif(min=win$xrange[1],max=win$xrange[2],n=pmax(1,n.seeds))
y=runif(min=win$yrange[1],max=win$yrange[2],n=pmax(1,n.seeds))

Это можно сразу построить, я знаю, используя функцию ppp.

seeds<-ppp(x=x,
y=y,
window=win)

plot(seeds)

В следующей строке я добавляю метки к объекту ppp, по-видимому, она описывает угол поворота точек, я не понимаю, как это работает прямо сейчас, но это нормально, я выясню позже.

marks<-data.frame(angles=runif(n=pmax(1,n.seeds),min=0,max=2*pi))
seeds1<-ppp(x=x,
           y=y,
           window=win,
           marks=marks)

Первая проблема, с которой я сталкиваюсь, заключается в том, что к объекту ppp добавляются объекты, называемые pops, описывающие заполнение окна. Я понимаю, как получаются значения, это распределение Пуассона с учетом входного значения mu, которое может быть любым значением и общим количеством наблюдений, равным точкам в окне.

seeds2<-ppp(x=x,
            y=y,
            window=win,
            marks=marks,
            pops=rpois(lambda=5,n=pmax(1,n.seeds)))

Мой первый вопрос: как можно добавить переменную, не имеющую классификации, в объект ppp? Я проверил документацию по ppp, и там нет упоминания о всплывающих окнах.

Второй вопрос, который у меня возник, касается использования переменных типа double, в следующей строке требуется функция sapply для определения размеров.

dim1<-pmax(1,sapply(seeds1$marks$pops, FUN=function(x)rpois(n=1,sqrt(x))))

Я никогда не видел, чтобы функция $ использовалась дважды, а оператор seed2 $ mark $ pop returns $ недействителен для атомарных векторов. Не могли бы вы объяснить, что здесь происходит?

Большое спасибо.


person OpenSauce    schedule 13.11.2020    source источник


Ответы (1)


Это несколько вопросов - задавайте, пожалуйста, по одному.

Из вашего сообщения неясно, пытаетесь ли вы понять чужой код или разрабатываете код самостоятельно. Это имеет значение для ответа.

Чтобы уточнить, этот код не исходит из пакета spatstat; это чей-то код, использующий пакет spatstat для генерации данных. В пакете spatstat есть код для создания смоделированных реализаций кластерного процесса Пуассона (что, я думаю, именно то, что вы хотите сделать), и вы можете посмотреть spatstat код для rPoissonCluster, чтобы увидеть, как это можно сделать правильно и эффективно.

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

  1. Правила создания ppp объектов изложены в файле справки для ppp. В справке сказано, что если задан аргумент window, то несовпадающие аргументы ... игнорируются. Это означает, что в строке seeds2<-ppp(x=x,y=y,window=win,marks=marks,pops=rpois(lambda=5,n=pmax(1,n.seeds))) аргумент pops будет проигнорирован.
  2. Идиома sapply(seeds1$marks$pops, FUN=f) является совершенно допустимым синтаксисом в R. Если объект seeds1 является структурой или списком, который имеет компонент с именем marks, который, в свою очередь, является структурой или списком, который имеет компонент с именем pops, то идиома seeds1$marks$pops извлечет его. Это не имеет ничего общего с sapply.

Теперь перейдем к ошибкам в коде,

  • Строка n.seeds<-lambda*win$xrange[2]*win$yrange[2] предположительно предназначена для вычисления ожидаемого числа родителей кластера (начальных чисел кластера) в окне. Это будет работать, только если окно представляет собой прямоугольник с нижним левым углом в начале координат (0,0). Надежнее было бы написать n.seeds <- lambda * area(win).
  • Однако переменная n.seeds используется позже, так как она была числом родителей кластера (начального числа кластера). Автор забыл, что количество начальных чисел случайно с распределением Пуассона. Итак, более правильным расчетом будет n.seeds <- rpois(1, lambda * area(win))
  • Однако это по-прежнему неверно, поскольку родительские элементы кластера (исходные точки) за пределами окна также могут создавать точки-потомки внутри окна. Таким образом, начальные точки должны фактически генерироваться в большем окне, полученном путем раскрытия win. Соответствующая команда, используемая внутри spatstat для создания родительских элементов кластера, - bigwin <- grow.rectangle(Frame(win), cluster_diameter) ; Parents <- rpoispp(lambda, bigwin)
  • Автор явно хочет присвоить каждой родительской точке два значения отметки: случайное angle и случайное число pops. Правильный способ сделать это - сделать marks фрейм данных с двумя столбцами, например marks(seeds1) <- data.frame(angles=runif(n.seeds, max=2*pi), pops=rpois(n.seeds, 5))
person Adrian Baddeley    schedule 14.11.2020