I want to fit a Poisson point-process model with spatstat::ppm
and I'm unsure what is the best way to feed covariate data to the function. I understand that spatstat
expects planar coordinates, so I have transformed my point location data to a planar crs before creating a ppp
point pattern object. The covariate data are in a raster stack with unprojected geographic coordinates and I understand that projecting rasters is generally ill-advised. I extracted covariate values for the point locations from the raster using the points' original geographic coordinates and raster::extract
. So far so good. The issue is ...
it is not sufficient to have observed the covariate only at the points of the data point pattern; the covariate must also have been observed at other locations in the window. -
ppm
helpfile
I appear to have two options for providing the covariate data to the data
argument.
- A pixel image; seems ill-advised because of raster projection issues.
- A list of functions (one per covariate) that can be evaluated at any location (x,y) to obtain corresponding covariate values. This seems like the way to go, but my attempt at writing such a function turns out to be ridiculously slow. It calls
raster::extract
for each coordinate pair after transforming the coordinates to the raster's crs. Whileraster::extract
is reasonably fast when given a large number of points, there appears to be a substantial overhead for each call. According tomicrobenchmark
, the coordinate transformation takes about 4ms and the extraction takes about 582ms for a single covariate, or about 4 seconds for each point to get all 7 covariates. I don't know how many timesppm
will want to call this, but if it's even once per point in the pattern, it'll take too long.
Is there some way I can find out what is the complete set of points that ppm
will query for covariate data so that I can extract those beforehand with a single call?
It seems like my use case (covariates in a geographic raster) should be pretty common, so I'm guessing there's an established way to do this right. What is it?