# project.ppm

##### Force Point Process Model to be Valid

Ensures that a fitted point process model satisfies the integrability conditions for existence of the point process.

##### Usage

`project.ppm(object, ..., fatal=FALSE, trace=FALSE)`

##### Arguments

- object
- Fitted point process model (object of class
`"ppm"`

). - ...
- Ignored.
- fatal
- Logical value indicating whether to generate an error if the model cannot be projected to a valid model.
- trace
- Logical value indicating whether to print a trace of the decision process.

##### Details

The model-fitting function `ppm`

fits Gibbs point process models to point pattern data.
By default, the fitted model returned by `ppm`

may not
actually exist as a point process.

First, some of the fitted coefficients of the model
may be `NA`

or infinite values.
This usually occurs when the data are insufficient to estimate
all the parameters. The model is said to be
*unidentifiable* or *confounded*.

Second, unlike a regression model, which is well-defined for any finite values
of the fitted regression coefficients, a Gibbs point process model
is only well-defined if the fitted interaction parameters
satisfy some constraints.
A famous example is the Strauss process (see `Strauss`

)
which exists only when the interaction parameter $\gamma$
is less than or equal to 1. For values $\gamma > 1$,
the probability density is not integrable and the process does not
exist (and cannot be simulated).

By default, `ppm`

does not enforce the constraint that
a fitted Strauss process (for example) must satisfy
$\gamma \le 1$.
This is because a fitted parameter value of $\gamma > 1$
could be useful information for data analysis, as it indicates that
the Strauss model is not appropriate, and suggests a clustered model should be
fitted.

The function `project.ppm`

modifies the model `object`

so that the model is valid.

`project.ppm`

identifies the terms in the model `object`

that are associated with illegal parameter values (i.e. parameter
values which are either `NA`

, infinite, or outside their permitted
range). It considers all possible sub-models of `object`

obtained by deleting one or more
of these terms. It identifies which of these submodels are valid,
and chooses the valid submodel with the largest pseudolikelihood. The result
of `project.ppm`

is the true maximum pseudolikelihood fit to the
data.

For large datasets or complex models, the algorithm used in
`project.ppm`

may be time-consuming, because it takes time to
compute all the sub-models. A faster, approximate
algorithm can be applied by setting
`spatstat.options(project.fast=TRUE)`

. This produces a
valid submodel, which may not be the maximum pseudolikelihood submodel.

Use the function `valid.ppm`

to check whether a fitted model
object specifies a well-defined point process.

Use the expression `all(is.finite(coef(object)))`

to determine
whether all parameters are identifiable.

##### Value

- Another point process model (object of class
`"ppm"`

).

##### See Also

##### Examples

```
fit <- ppm(redwood, ~1, Strauss(0.1))
coef(fit)
fit2 <- project.ppm(fit)
coef(fit2)
```

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