#
18 The **spatstat** package

The **spatstat** package (Baddeley, Turner, and Rubak 2022) can be used for statistical analysis of spatial point patterns.
In **spatstat**, spatial point patterns are represented with objects of class `ppp`

that contain the event locations with possibly associated marks, and the observation window where the events occur.
Here, we show how to use **spatstat** to create `ppp`

objects representing spatial point patterns, and how to transform `ppp`

objects to `sf`

objects to be able to work with the data using packages such as **sf**.

## 18.1 Creating spatial point patterns

In **spatstat**, spatial point patterns are represented as objects of class `ppp`

(planar point pattern). To create a `ppp`

object, we use the `ppp()`

function passing the vectors `x`

and `y`

with the event coordinates, and the observation window which is of class `owin`

.

For example, here we create a spatial point pattern of 100 randomly generated points in the region \([0, 1] \times [0, 2]\).
First, we use the `owin()`

function to create an object of class `owin`

with the observation window \([0, 1] \times [0, 2]\) passing the ranges of the horizontal and vertical axes.

Then, we simulate 100 random points in the observation window \([0, 1] \times [0, 2]\).

Finally, we create the `ppp`

object with the `ppp()`

function passing the `x`

and `y`

coordinates of the events, and the `owin`

object with the window.

```
X <- ppp(x = x, y = y, window = win)
X
```

```
Planar point pattern: 100 points
window: rectangle = [0, 1] x [0, 2] units
```

Figure 18.1 shows the plot of the `ppp`

object.

We can extract the observation window of the point pattern `X`

with `Window()`

.

`Window(X)`

`window: rectangle = [0, 1] x [0, 2] units`

An alternative way of simulating a spatial point pattern of independent uniform random points in a given region is by using the `runifpoint()`

function.
The arguments of `runifpoint()`

include the number `n`

of points and the window of class `owin`

where the point pattern is simulated. For example, the previous pattern could have been generated using `X <- runifpoint(n = 100, win = win)`

.

Marks denoting associated information of events can be set with `marks()`

or `%mark%`

. For example, Figure 18.2 shows the previous point pattern `X`

where we add a mark with a numeric value to each of the events.

```
# set marks with marks()
marks(X) <- 1:npoints(X)
# alternatively, set marks with %mark%
X <- X %mark% 1:npoints(X)
plot(X)
```

Note that the definition of an observation window that represents the study region of the point pattern needs to be carefully specified, as it affects the visualization and analysis of the data, and possibly the conclusions obtained. For example, if the previous point pattern was thought to be observed in the window \([0, 5] \times [0, 5]\), the data would appear as a cluster in the bottom left corner of the window instead of randomly in \([0, 1] \times [0, 2]\). Note that this situation, depicted in Figure 18.3, would change the interpretation of the data.

```
win2 <- owin(xrange = c(0, 5), yrange = c(0, 5))
X2 <- ppp(x = x, y = y, window = win2)
plot(X2)
axis(1)
axis(2)
```

The `inside.owin()`

function can be used to test whether a set of points lie within a particular observation window.
For example, we can identify the points in the point pattern `X`

that are inside the unit square by passing the points and the observation window as follows:

```
win <- owin() # unit square observation window
marks(X) <- inside.owin(X, w = win)
plot(X)
axis(1)
axis(2)
```

##
18.2 Converting between `ppp`

and `sf`

objects

### From `ppp`

to `sf`

In some situations, we may be interested in transforming an object of class `ppp`

to an object of class `sf`

to be able to manipulate and visualize the data using other packages such as **sf**.
Here, we show how to use the `st_as_sf()`

function from **sf** to transform
the `longleaf`

data from **sptatstat** which contains the locations and sizes of longleaf pine trees, from `ppp`

to `sf`

class.

First, we create a data frame containing the coordinates and the marks of the `ppp`

object.
Then, we create a `sf`

object by using the `st_as_sf()`

function of **sf** passing the data frame and specifying the name of the columns that contain the event coordinates in argument `coords`

.
The window of the point pattern can also be converted to `sf`

with `st_as_sf(Window(X))`

.

### From `sf`

to `ppp`

We can also convert a `sf`

object to a `ppp`

object with `as.ppp()`

by providing the point coordinates and the observation window.
For example, here we obtain the coordinates of the `sf`

object in matrix form with `st_coordinates()`

, and consider the observation window as the bounding box of the data which can be obtained with `st_bbox()`

.
Marks of the points can be set with `marks()`

or `%mark%`

.
Figure 18.5 shows the plot of the `ppp`

object obtained.

```
X <- as.ppp(st_coordinates(d), st_bbox(d))
marks(X) <- d$m # alternatively we can use X <- X %mark% d$m
plot(X)
```

In case we wish to use a polygon of class `sf`

as observation window,
we can use `as.owin()`

to transform the `sf`

object to an `owin`

object. Note that the `sf`

object needs to be in a projected coordinate reference system.
Here, we show an example on how to create a spatial point pattern with the boundary of Brazil as observation window.
First, we obtain the Brazil map with the **rnaturalearth** package.
Then, we use `st_transform()`

to transform the map to projection EPSG 29172 (UTM zone 22N).
Finally, we use `runifpoint()`

to generate 100 independent uniform random points within the observation window (Figure 18.5).

```
library(rnaturalearth)
map <- ne_countries(type = "countries", country = "Brazil",
scale = "medium", returnclass = "sf")
map <- st_transform(map, crs = "EPSG:29172")
win <- as.owin(map)
X <- runifpoint(100, win = win)
plot(X)
```