# envelope

##### Simulation Envelopes of Summary Function

Computes simulation envelopes of a summary function.

##### Usage

`envelope(Y, fun, ...)` ## S3 method for class 'ppp':
envelope(Y, fun=Kest, nsim=99, nrank=1, \dots,
simulate=NULL, fix.n=FALSE, fix.marks=FALSE,
verbose=TRUE, clipdata=TRUE,
transform=NULL, global=FALSE, ginterval=NULL,
alternative=c("two.sided", "less", "greater"),
savefuns=FALSE, savepatterns=FALSE,
nsim2=nsim, VARIANCE=FALSE, nSD=2, Yname=NULL, maxnerr=nsim,
do.pwrong=FALSE, envir.simul=NULL)

## S3 method for class 'ppm':
envelope(Y, fun=Kest, nsim=99, nrank=1, \dots,
simulate=NULL, fix.n=FALSE, fix.marks=FALSE,
verbose=TRUE, clipdata=TRUE,
start=NULL, control=update(default.rmhcontrol(Y), nrep=nrep), nrep=1e5,
transform=NULL, global=FALSE, ginterval=NULL,
alternative=c("two.sided", "less", "greater"),
savefuns=FALSE, savepatterns=FALSE,
nsim2=nsim, VARIANCE=FALSE, nSD=2, Yname=NULL, maxnerr=nsim,
do.pwrong=FALSE, envir.simul=NULL)

## S3 method for class 'kppm':
envelope(Y, fun=Kest, nsim=99, nrank=1, \dots,
simulate=NULL,
verbose=TRUE, clipdata=TRUE,
transform=NULL, global=FALSE, ginterval=NULL,
alternative=c("two.sided", "less", "greater"),
savefuns=FALSE, savepatterns=FALSE,
nsim2=nsim, VARIANCE=FALSE, nSD=2, Yname=NULL, maxnerr=nsim,
do.pwrong=FALSE, envir.simul=NULL)

##### Arguments

- Y
- Object containing point pattern data.
A point pattern (object of class
`"ppp"`

) or a fitted point process model (object of class`"ppm"`

or`"kppm"`

). - fun
- Function that computes the desired summary statistic for a point pattern.
- nsim
- Number of simulated point patterns to be generated when computing the envelopes.
- nrank
- Integer. Rank of the envelope value amongst the
`nsim`

simulated values. A rank of 1 means that the minimum and maximum simulated values will be used. - ...
- Extra arguments passed to
`fun`

. - simulate
- Optional. Specifies how to generate the simulated point patterns.
If
`simulate`

is an expression in the R language, then this expression will be evaluated`nsim`

times, to obtain`nsim`

point patterns which are - fix.n
- Logical. If
`TRUE`

, simulated patterns will have the same number of points as the original data pattern. This option is currently not available for`envelope.kppm`

. - fix.marks
- Logical. If
`TRUE`

, simulated patterns will have the same number of points*and*the same marks as the original data pattern. In a multitype point pattern this means that the simulated patterns will have the same number of po - verbose
- Logical flag indicating whether to print progress reports during the simulations.
- clipdata
- Logical flag indicating whether the data point pattern should be
clipped to the same window as the simulated patterns,
before the summary function for the data is computed.
This should usually be
`TRUE`

to ensure that the data a - start,control
- Optional. These specify the arguments
`start`

and`control`

of`rmh`

, giving complete control over the simulation algorithm. Applicable only when`Y`

is a fitted model of class`"ppm"`

. - nrep
- Number of iterations in the Metropolis-Hastings simulation
algorithm. Applicable only when
`Y`

is a fitted model of class`"ppm"`

. - transform
- Optional. A transformation to be applied to the function values, before the envelopes are computed. An expression object (see Details).
- global
- Logical flag indicating whether envelopes should be pointwise
(
`global=FALSE`

) or simultaneous (`global=TRUE`

). - ginterval
- Optional.
A vector of length 2 specifying
the interval of $r$ values for the simultaneous critical
envelopes. Only relevant if
`global=TRUE`

. - alternative
- Character string determining whether the envelope corresponds
to a two-sided test (
`side="two.sided"`

, the default) or a one-sided test with a lower critical boundary (`side="less"`

) or a one-sided test with an upper - savefuns
- Logical flag indicating whether to save all the simulated function values.
- savepatterns
- Logical flag indicating whether to save all the simulated point patterns.
- nsim2
- Number of extra simulated point patterns to be generated
if it is necessary to use simulation to estimate the theoretical
mean of the summary function. Only relevant when
`global=TRUE`

and the simulations are not based on CSR. - VARIANCE
- Logical. If
`TRUE`

, critical envelopes will be calculated as sample mean plus or minus`nSD`

times sample standard deviation. - nSD
- Number of estimated standard deviations used to determine
the critical envelopes, if
`VARIANCE=TRUE`

. - Yname
- Character string that should be used as the name of the
data point pattern
`Y`

when printing or plotting the results. - maxnerr
- Maximum number of rejected patterns.
If
`fun`

yields an error when applied to a simulated point pattern (for example, because the pattern is empty and`fun`

requires at least one point), the pattern will be rejected a - do.pwrong
- Logical. If
`TRUE`

, the algorithm will also estimate the true significance level of thewrong test (the test that declares the summary function for the data to be significant if it lies outside the*pointwise* - envir.simul
- Environment in which to evaluate the expression
`simulate`

, if not the current environment.

##### Details

The `envelope`

command performs simulations and
computes envelopes of a summary statistic based on the simulations.
The result is an object that can be plotted to display the envelopes.
The envelopes can be used to assess the goodness-of-fit of
a point process model to point pattern data.

For the most basic use, if you have a point pattern `X`

and
you want to test Complete Spatial Randomness (CSR), type
`plot(envelope(X, Kest,nsim=39))`

to see the $K$ function
for `X`

plotted together with the envelopes of the
$K$ function for 39 simulations of CSR.
The `envelope`

function is generic, with methods for
the classes `"ppp"`

, `"ppm"`

and `"kppm"`

described here. There are also methods for the classes `"pp3"`

,
`"lpp"`

and `"lppm"`

which are described separately
under `envelope.pp3`

and `envelope.lpp`

.
Envelopes can also be computed from other envelopes, using
`envelope.envelope`

.
To create simulation envelopes, the command `envelope(Y, ...)`

first generates `nsim`

random point patterns
in one of the following ways.

- If
`Y`

is a point pattern (an object of class`"ppp"`

) and`simulate=NULL`

, then we generate`nsim`

simulations of Complete Spatial Randomness (i.e.`nsim`

simulated point patterns each being a realisation of the uniform Poisson point process) with the same intensity as the pattern`Y`

. (If`Y`

is a multitype point pattern, then the simulated patterns are also given independent random marks; the probability distribution of the random marks is determined by the relative frequencies of marks in`Y`

.) - If
`Y`

is a fitted point process model (an object of class`"ppm"`

or`"kppm"`

) and`simulate=NULL`

, then this routine generates`nsim`

simulated realisations of that model. - If
`simulate`

is supplied, then it determines how the simulated point patterns are generated. It may be either- an expression in the R language, typically containing a call
to a random generator. This expression will be evaluated
`nsim`

times to yield`nsim`

point patterns. For example if`simulate=expression(runifpoint(100))`

then each simulated pattern consists of exactly 100 independent uniform random points. - a list of point patterns. The entries in this list will be taken as the simulated patterns.
- an object of class
`"envelope"`

. This should have been produced by calling`envelope`

with the argument`savepatterns=TRUE`

. The simulated point patterns that were saved in this object will be extracted and used as the simulated patterns for the new envelope computation. This makes it possible to plot envelopes for two different summary functions based on exactly the same set of simulated point patterns.

- an expression in the R language, typically containing a call
to a random generator. This expression will be evaluated

`fun`

is applied to each of these simulated
patterns. Typically `fun`

is one of the functions
`Kest`

, `Gest`

, `Fest`

, `Jest`

, `pcf`

,
`Kcross`

, `Kdot`

, `Gcross`

, `Gdot`

,
`Jcross`

, `Jdot`

, `Kmulti`

, `Gmulti`

,
`Jmulti`

or `Kinhom`

. It may also be a character string
containing the name of one of these functions. The statistic `fun`

can also be a user-supplied function;
if so, then it must have arguments `X`

and `r`

like those in the functions listed above, and it must return an object
of class `"fv"`

.

Upper and lower critical envelopes are computed in one of the following ways:
[object Object],[object Object],[object Object]
The return value is an object of class `"fv"`

containing
the summary function for the data point pattern,
the upper and lower simulation envelopes, and
the theoretical expected value (exact or estimated) of the summary function
for the model being tested. It can be plotted
using `plot.envelope`

.

If `VARIANCE=TRUE`

then the return value also includes the
sample mean, sample variance and other quantities.

Arguments can be passed to the function `fun`

through
`...`

. In particular, the argument `correction`

determines the edge correction to be used to calculate the summary statistic.
See the section on Edge Corrections, and the Examples.

If `Y`

is a fitted cluster point process model (object of
class `"kppm"`

), and `simulate=NULL`

,
then the model is simulated directly
using `simulate.kppm`

.
If `Y`

is a fitted Gibbs point process model (object of
class `"ppm"`

), and `simulate=NULL`

,
then the model is simulated
by running the Metropolis-Hastings algorithm `rmh`

.
Complete control over this algorithm is provided by the
arguments `start`

and `control`

which are passed
to `rmh`

.

For simultaneous critical envelopes (`global=TRUE`

)
the following options are also useful:
[object Object],[object Object]

It is also possible to extract the summary functions for each of the
individual simulated point patterns, by setting `savefuns=TRUE`

.
Then the return value also
has an attribute `"simfuns"`

containing all the
summary functions for the individual simulated patterns.
It is an `"fv"`

object containing
functions named `sim1, sim2, ...`

representing the `nsim`

summary functions.

It is also possible to save the simulated point patterns themselves,
by setting `savepatterns=TRUE`

. Then the return value also has
an attribute `"simpatterns"`

which is a list of length
`nsim`

containing all the simulated point patterns.

See `plot.envelope`

and `plot.fv`

for information about how to plot the envelopes.

Different envelopes can be recomputed from the same data
using `envelope.envelope`

.
Envelopes can be combined using `pool.envelope`

.

##### Value

- An object of class
`"fv"`

, see`fv.object`

, which can be printed and plotted directly.Essentially a data frame containing columns

r the vector of values of the argument $r$ at which the summary function `fun`

has been estimatedobs values of the summary function for the data point pattern lo lower envelope of simulations hi upper envelope of simulations - and
*either* theo theoretical value of the summary function under CSR (Complete Spatial Randomness, a uniform Poisson point process) if the simulations were generated according to CSR mmean estimated theoretical value of the summary function, computed by averaging simulated values, if the simulations were not generated according to CSR. - Additionally, if
`savepatterns=TRUE`

, the return value has an attribute`"simpatterns"`

which is a list containing the`nsim`

simulated patterns. If`savefuns=TRUE`

, the return value has an attribute`"simfuns"`

which is an object of class`"fv"`

containing the summary functions computed for each of the`nsim`

simulated patterns.

##### Errors and warnings

An error may be generated if one of the simulations produces a
point pattern that is empty, or is otherwise unacceptable to the
function `fun`

.
The upper envelope may be `NA`

(plotted as plus or minus
infinity) if some of the function values
computed for the simulated point patterns are `NA`

.
Whether this occurs will depend on the function `fun`

,
but it usually happens when the simulated point pattern does not contain
enough points to compute a meaningful value.

##### Confidence intervals

Simulation envelopes do **not** compute confidence intervals;
they generate significance bands.
If you really need a confidence interval for the true summary function
of the point process, use `lohboot`

.
See also `varblock`

.

##### References

Baddeley, A., Diggle, P.J., Hardegen, A., Lawrence, T., Milne,
R.K. and Nair, G. (2014) On tests of spatial pattern based on
simulation envelopes. *Ecological Monographs*, to appear.
Cressie, N.A.C. *Statistics for spatial data*.
John Wiley and Sons, 1991.

Diggle, P.J. *Statistical analysis of spatial point patterns*.
Arnold, 2003.

Ripley, B.D. (1981)
*Spatial statistics*.
John Wiley and Sons.

Ripley, B.D. *Statistical inference for spatial processes*.
Cambridge University Press, 1988.

Stoyan, D. and Stoyan, H. (1994) Fractals, random shapes and point fields: methods of geometrical statistics. John Wiley and Sons.

##### See Also

`dclf.test`

,
`mad.test`

for envelope-based tests.
`fv.object`

,
`plot.envelope`

,
`plot.fv`

,
`envelope.envelope`

,
`pool.envelope`

for handling envelopes.
`Kest`

,
`Gest`

,
`Fest`

,
`Jest`

,
`pcf`

,
`ppp`

,
`ppm`

,
`default.expand`

##### Examples

```
X <- simdat
# Envelope of K function under CSR
plot(envelope(X))
<testonly>plot(envelope(X, nsim=3))</testonly>
# Translation edge correction (this is also FASTER):
plot(envelope(X, correction="translate"))
<testonly>E <- envelope(X, nsim=3, correction="translate")</testonly>
# Envelope of K function for simulations from Gibbs model
fit <- ppm(cells, ~1, Strauss(0.05))
plot(envelope(fit))
plot(envelope(fit), global=TRUE)
<testonly>fit <- ppm(cells, ~1, Strauss(0.05), nd=20)
E <- envelope(fit, nsim=3, correction="border", nrep=100)
E <- envelope(fit, nsim=3, correction="border", global=TRUE, nrep=100)</testonly>
# Envelope of K function for simulations from cluster model
fit <- kppm(redwood, ~1, "Thomas")
plot(envelope(fit, Gest))
plot(envelope(fit, Gest, global=TRUE))
<testonly>E <- envelope(fit, Gest, correction="rs", nsim=3, global=TRUE, nrep=100)</testonly>
# Envelope of G function under CSR
plot(envelope(X, Gest))
<testonly>E <- envelope(X, Gest, correction="rs", nsim=3)</testonly>
# Envelope of L function under CSR
# L(r) = sqrt(K(r)/pi)
E <- envelope(X, Kest)
plot(E, sqrt(./pi) ~ r)
<testonly>E <- envelope(X, Kest, correction="border", nsim=3)
plot(E, sqrt(./pi) ~ r)</testonly>
# Simultaneous critical envelope for L function
# (alternatively, use Lest)
plot(envelope(X, Kest, transform=expression(sqrt(./pi)), global=TRUE))
<testonly>E <- envelope(X, Kest, nsim=3, correction="border",
transform=expression(sqrt(./pi)), global=TRUE)</testonly>
## One-sided envelope
plot(envelope(X, Lest, alternative="less"))
<testonly>E <- envelope(X, Lest, nsim=3, alternative="less")</testonly>
# How to pass arguments needed to compute the summary functions:
# We want envelopes for Jcross(X, "A", "B")
# where "A" and "B" are types of points in the dataset 'demopat'
data(demopat)
plot(envelope(demopat, Jcross, i="A", j="B"))
<testonly>plot(envelope(demopat, Jcross, correction="rs", i="A", j="B", nsim=3))</testonly>
# Use of `simulate'
plot(envelope(cells, Gest, simulate=expression(runifpoint(42))))
plot(envelope(cells, Gest, simulate=expression(rMaternI(100,0.02))))
<testonly>plot(envelope(cells, Gest, correction="rs", simulate=expression(runifpoint(42)), nsim=3))
plot(envelope(cells, Gest, correction="rs", simulate=expression(rMaternI(100, 0.02)),
nsim=3, global=TRUE))</testonly>
# Envelope under random toroidal shifts
data(amacrine)
plot(envelope(amacrine, Kcross, i="on", j="off",
simulate=expression(rshift(amacrine, radius=0.25))))
# Envelope under random shifts with erosion
plot(envelope(amacrine, Kcross, i="on", j="off",
simulate=expression(rshift(amacrine, radius=0.1, edge="erode"))))
# Envelope of INHOMOGENEOUS K-function with fitted trend
# The following is valid.
# Setting lambda=fit means that the fitted model is re-fitted to
# each simulated pattern to obtain the intensity estimates for Kinhom.
# (lambda=NULL would also be valid)
fit <- kppm(redwood, ~1, clusters="MatClust")
plot(envelope(fit, Kinhom, lambda=fit, nsim=19))
<testonly>envelope(fit, Kinhom, lambda=fit, nsim=3)</testonly>
# Note that the principle of symmetry, essential to the validity of
# simulation envelopes, requires that both the observed and
# simulated patterns be subjected to the same method of intensity
# estimation. In the following example it would be incorrect to set the
# argument 'lambda=red.dens' in the envelope command, because this
# would mean that the inhomogeneous K functions of the simulated
# patterns would be computed using the intensity function estimated
# from the original redwood data, violating the symmetry. There is
# still a concern about the fact that the simulations are generated
# from a model that was fitted to the data; this is only a problem in
# small datasets.
red.dens <- density(redwood, sigma=bw.diggle)
plot(envelope(redwood, Kinhom, sigma=bw.diggle,
simulate=expression(rpoispp(red.dens))))
# Precomputed list of point patterns
nX <- npoints(X)
PatList <- list()
for(i in 1:19) PatList[[i]] <- runifpoint(nX)
E <- envelope(X, Kest, nsim=19, simulate=PatList)
<testonly>PatList <- list()
for(i in 1:3) PatList[[i]] <- runifpoint(10)
E <- envelope(X, Kest, nsim=3, simulate=PatList)</testonly>
# re-using the same point patterns
EK <- envelope(X, Kest, savepatterns=TRUE)
EG <- envelope(X, Gest, simulate=EK)
<testonly>EK <- envelope(X, Kest, nsim=3, savepatterns=TRUE)
EG <- envelope(X, Gest, nsim=3, simulate=EK)</testonly>
```

*Documentation reproduced from package spatstat, version 1.41-1, License: GPL (>= 2)*