probe_match {pomp} | R Documentation |

## Probe matching

### Description

Estimation of parameters by maximum synthetic likelihood

### Usage

```
## S4 method for signature 'data.frame'
probe_objfun(
data,
est = character(0),
fail.value = NA,
probes,
nsim,
seed = NULL,
params,
rinit,
rprocess,
rmeasure,
partrans,
...,
verbose = getOption("verbose", FALSE)
)
## S4 method for signature 'pomp'
probe_objfun(
data,
est = character(0),
fail.value = NA,
probes,
nsim,
seed = NULL,
...,
verbose = getOption("verbose", FALSE)
)
## S4 method for signature 'probed_pomp'
probe_objfun(
data,
est = character(0),
fail.value = NA,
probes,
nsim,
seed = NULL,
...,
verbose = getOption("verbose", FALSE)
)
## S4 method for signature 'probe_match_objfun'
probe_objfun(
data,
est,
fail.value,
seed = NULL,
...,
verbose = getOption("verbose", FALSE)
)
```

### Arguments

`data` |
either a data frame holding the time series data,
or an object of class ‘pomp’,
i.e., the output of another pomp calculation.
Internally, |

`est` |
character vector; the names of parameters to be estimated. |

`fail.value` |
optional numeric scalar;
if non- |

`probes` |
a single probe or a list of one or more probes. A probe is simply a scalar- or vector-valued function of one argument that can be applied to the data array of a ‘pomp’. A vector-valued probe must always return a vector of the same size. A number of useful probes are provided with the package: see basic probes. |

`nsim` |
the number of model simulations to be computed. |

`seed` |
integer.
When fitting, it is often best to fix the seed of the random-number generator (RNG).
This is accomplished by setting |

`params` |
optional; named numeric vector of parameters.
This will be coerced internally to storage mode |

`rinit` |
simulator of the initial-state distribution.
This can be furnished either as a C snippet, an |

`rprocess` |
simulator of the latent state process, specified using one of the rprocess plugins.
Setting |

`rmeasure` |
simulator of the measurement model, specified either as a C snippet, an |

`partrans` |
optional parameter transformations, constructed using Many algorithms for parameter estimation search an unconstrained space of parameters.
When working with such an algorithm and a model for which the parameters are constrained, it can be useful to transform parameters.
One should supply the |

`...` |
additional arguments are passed to |

`verbose` |
logical; if |

### Details

In probe-matching, one attempts to minimize the discrepancy between simulated and actual data, as measured by a set of summary statistics called *probes*.
In pomp, this discrepancy is measured using the “synthetic likelihood” as defined by Wood (2010).

### Value

`probe_objfun`

constructs a stateful objective function for probe matching.
Specifically, `probe_objfun`

returns an object of class ‘probe_match_objfun’, which is a function suitable for use in an `optim`

-like optimizer.
In particular, this function takes a single numeric-vector argument that is assumed to contain the parameters named in `est`

, in that order.
When called, it will return the negative synthetic log likelihood for the probes specified.
It is a stateful function:
Each time it is called, it will remember the values of the parameters and its estimate of the synthetic likelihood.

### Note for Windows users

Some Windows users report problems when using C snippets in parallel computations.
These appear to arise when the temporary files created during the C snippet compilation process are not handled properly by the operating system.
To circumvent this problem, use the `cdir`

and `cfile`

options to cause the C snippets to be written to a file of your choice, thus avoiding the use of temporary files altogether.

### Important Note

Since pomp cannot guarantee that the *final* call an optimizer makes to the function is a call *at* the optimum, it cannot guarantee that the parameters stored in the function are the optimal ones.
Therefore, it is a good idea to evaluate the function on the parameters returned by the optimization routine, which will ensure that these parameters are stored.

### Warning! Objective functions based on C snippets

If you use C snippets (see `Csnippet`

), a dynamically loadable library will be built.
As a rule, pomp functions load this library as needed and unload it when it is no longer needed.
The stateful objective functions are an exception to this rule.
For efficiency, calls to the objective function do not execute `pompLoad`

or `pompUnload`

:
rather, it is assumed that `pompLoad`

has been called before any call to the objective function.
When a stateful objective function using one or more C snippets is created, `pompLoad`

is called internally to build and load the library:
therefore, within a single **R** session, if one creates a stateful objective function, one can freely call that objective function and (more to the point) pass it to an optimizer that calls it freely, without needing to call `pompLoad`

.
On the other hand, if one retrieves a stored objective function from a file, or passes one to another **R** session, one must call `pompLoad`

before using it.
**Failure to do this will typically result in a segmentation fault (i.e., it will crash the R session).**

### Author(s)

Aaron A. King

### References

B.E. Kendall, C.J. Briggs, W.W. Murdoch, P. Turchin, S.P. Ellner, E. McCauley, R.M. Nisbet, and S.N. Wood. Why do populations cycle? A synthesis of statistical and mechanistic modeling approaches. *Ecology* **80**, 1789–1805, 1999. doi:10.2307/176658.

S. N. Wood Statistical inference for noisy nonlinear ecological dynamic systems. *Nature* **466**, 1102–1104, 2010. doi:10.1038/nature09319.

### See Also

More on methods based on summary statistics:
`abc()`

,
`basic_probes`

,
`nlf`

,
`probe()`

,
`spect()`

,
`spect_match`

More on pomp estimation algorithms:
`abc()`

,
`bsmc2()`

,
`estimation_algorithms`

,
`mif2()`

,
`nlf`

,
`pmcmc()`

,
`pomp-package`

,
`spect_match`

More on maximization-based estimation methods:
`mif2()`

,
`nlf`

,
`spect_match`

,
`traj_match`

### Examples

```
gompertz() -> po
## A list of probes:
plist <- list(
mean=probe_mean("Y",trim=0.1,transform=sqrt),
sd=probe_sd("Y",transform=sqrt),
probe_marginal("Y",ref=obs(po)),
probe_acf("Y",lags=c(1,3,5),type="correlation",transform=sqrt),
probe_quantile("Y",prob=c(0.25,0.75),na.rm=TRUE)
)
## Construct the probe-matching objective function.
## Here, we just want to estimate 'K'.
po |>
probe_objfun(probes=plist,nsim=100,seed=5069977,
est="K") -> f
## Any numerical optimizer can be used to minimize 'f'.
if (require(subplex)) {
subplex(fn=f,par=0.4,control=list(reltol=1e-5)) -> out
} else {
optim(fn=f,par=0.4,control=list(reltol=1e-5)) -> out
}
## Call the objective one last time on the optimal parameters:
f(out$par)
coef(f)
## There are 'plot' and 'summary' methods:
f |> as("probed_pomp") |> plot()
f |> summary()
## One can convert an objective function to a data frame:
f |> as("data.frame") |> head()
f |> as("probed_pomp") |> as("data.frame") |> head()
f |> probe() |> plot()
## One can modify the objective function with another call
## to 'probe_objfun':
f |> probe_objfun(est=c("r","K")) -> f1
optim(fn=f1,par=c(0.3,0.3),control=list(reltol=1e-5)) -> out
f1(out$par)
coef(f1)
```

*pomp*version 5.11.0.0 Index]