Я хотел бы переводить между spatstat и raster мирами без повреждения оригинальной информации.
Я пытаюсь преобразовать точечный процесс (объект ppp), присутствующий в наборе данных longleaf в пакете spatstat, в класс im, а после того, как я безуспешно пытаюсь преобразовать объект класса im в исходный набор данных longleaf как точечный процесс.
В моем примере:
#<start> ---
library(spatstat)
library(raster)
library(maptools)
# Compute a gaussian kernel smoothed intensity with longleaf data set
bw <- bw.diggle(longleaf) #First, defined bandwidth sigma
im_census<-density.ppp(longleaf, sigma=bw,diggle=TRUE)
# Now I'll try to convert im im_census object in original longleaf Point Pattern ppp again
im_census_p<-rasterToPoints(raster(as.SpatialGridDataFrame.im(im_census)))
par(mfrow=c(1,2))
plot(longleaf)
plot(im_census_p)
#<end> ---
Но очевидно, что это не работает? Может ли кто-нибудь помочь мне, пожалуйста?
Ответ 1 · рейтинг 3 · Adrian Baddeley
В spatstat преобразование между классами обычно выполняется функцией с именем, начинающимся с "as". Чтобы преобразовать ppp в im, вы можете использовать as.im. Общий as.im отправляет методу as.im.ppp, который вызывает pixellate. Пример:
X <- cells # or any point pattern
Z <- as.im(X)
plot(Z)
plot(X, add=TRUE)
В результирующем изображении Z значение в каждом пикселе представляет собой количество точек данных, попадающих в пиксель. Точные координаты точек данных теряются.
Для преобразования im в ppp не существует метода as.ppp.im, потому что эта операция обычно не имеет смысла. Но если предположить, что изображение Z было создано путем пикселизации точечного шаблона, вы можете сделать
P <- where.max(Z > 0, first=FALSE)
Тогда P является точечным паттерном. Операция Z > 0 возвращает двоичное изображение пикселя с записью TRUE для пикселов, содержащих хотя бы одну точку данных. Функция where.max находит центры пикселей, в которых изображение достигает своего максимума, и в данном случае это означает все TRUE пикселей. Чтобы увидеть эффект дискретизации:
plot(X)
plot(P, add=TRUE, pch=3)
P похож на X за исключением того, что точные местоположения точек данных были заменены местоположениями ближайших центров пикселей. Несколько точек данных, попадающих в один пиксель, заменяются одной точкой в центре пикселя.
Для более сложных манипуляций вы можете использовать as.data.frame для преобразования объекта im во фрейм данных с одной строкой для каждого пикселя со столбцами x, y, value. Затем обработайте этот фрейм данных и, наконец, используйте as.ppp, чтобы создать точечный шаблон из полученного фрейма данных.
Ответ 2 · рейтинг 1 · Ege Rubak
Если я правильно понимаю вашу проблему, то она некорректна. ppp - это векторный формат, который представляет координаты точек с точностью до двойной точности. С другой стороны, растровые форматы, такие как im и объекты из пакета raster, содержат сетку точек с заданным разрешением. Таким образом, если ваши точки не будут идеально выровнены в сетке, ваша задача преобразования из ppp в растровый формат "без какого-либо повреждения исходной информации" невозможна.
Если вам нужна растровая аппроксимация ppp, вы можете использовать pixellate в spatstat, которая создает сетку и подсчитывает, сколько точек попадает в каждую ячейку сетки (обычно 0 или 1).