Parameter estimation by maximum simulated quasi-likelihood.
# S4 method for data.frame
nlf_objfun(
data,
est = character(0),
lags,
nrbf = 4,
ti,
tf,
seed = NULL,
transform.data = identity,
period = NA,
tensor = TRUE,
fail.value = NA_real_,
params,
rinit,
rprocess,
rmeasure,
...,
verbose = getOption("verbose")
)# S4 method for pomp
nlf_objfun(
data,
est = character(0),
lags,
nrbf = 4,
ti,
tf,
seed = NULL,
transform.data = identity,
period = NA,
tensor = TRUE,
fail.value = NA,
...,
verbose = getOption("verbose")
)
# S4 method for nlf_objfun
nlf_objfun(
data,
est,
lags,
nrbf,
ti,
tf,
seed = NULL,
period,
tensor,
transform.data,
fail.value,
...,
verbose = getOption("verbose", FALSE)
)
nlf_objfun
constructs a stateful objective function for NLF estimation.
Specfically, nlf_objfun
returns an object of class ‘nlf_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 log quasilikelihood.
It is a stateful function:
Each time it is called, it will remember the values of the parameters and its estimate of the log quasilikelihood.
either a data frame holding the time series data,
or an object of class ‘pomp’,
i.e., the output of another pomp calculation.
Internally, data
will be internally coerced to an array with storage-mode double
.
character vector; the names of parameters to be estimated.
A vector specifying the lags to use when constructing the nonlinear autoregressive prediction model. The first lag is the prediction interval.
integer scalar; the number of radial basis functions to be used at each lag.
required numeric values.
NLF works by generating simulating long time series from the model.
The simulated time series will be from ti
to tf
, with the same sampling frequency as the data.
ti
should be chosen large enough so that transient dynamics have died away.
tf
should be chosen large enough so that sufficiently many data points are available to estimate the nonlinear forecasting model well.
An error will be generated unless the data-to-parameter ratio exceeds 10 and
a warning will be given if the ratio is smaller than 30.
integer.
When fitting, it is often best to fix the seed of the random-number generator (RNG).
This is accomplished by setting seed
to an integer.
By default, seed = NULL
, which does not alter the RNG state.
optional function.
If specified, forecasting is performed using data and model simulations transformed by this function.
By default, transform.data
is the identity function,
i.e., no transformation is performed.
The main purpose of transform.data
is to achieve approximately multivariate normal forecasting errors.
If the data are univariate, transform.data
should take a scalar and return a
scalar.
If the data are multivariate, transform.data
should assume a vector input and return a vector of the same length.
numeric; period=NA
means the model is nonseasonal.
period > 0
is the period of seasonal forcing.
period <= 0
is equivalent to period = NA
.
logical; if FALSE, the fitted model is a generalized additive model with time mod period as one of the predictors, i.e., a gam with time-varying intercept. If TRUE, the fitted model is a gam with lagged state variables as predictors and time-periodic coefficients, constructed using tensor products of basis functions of state variables with basis functions of time.
optional numeric scalar;
if non-NA
, this value is substituted for non-finite values of the objective function.
It should be a large number (i.e., bigger than any legitimate values the objective function is likely to take).
optional; named numeric vector of parameters.
This will be coerced internally to storage mode double
.
simulator of the initial-state distribution.
This can be furnished either as a C snippet, an R function, or the name of a pre-compiled native routine available in a dynamically loaded library.
Setting rinit=NULL
sets the initial-state simulator to its default.
For more information, see rinit specification.
simulator of the latent state process, specified using one of the rprocess plugins.
Setting rprocess=NULL
removes the latent-state simulator.
For more information, see rprocess specification for the documentation on these plugins.
simulator of the measurement model, specified either as a C snippet, an R function, or the name of a pre-compiled native routine available in a dynamically loaded library.
Setting rmeasure=NULL
removes the measurement model simulator.
For more information, see rmeasure specification.
additional arguments supply new or modify existing model characteristics or components.
See pomp
for a full list of recognized arguments.
When named arguments not recognized by pomp
are provided, these are made available to all basic components via the so-called userdata facility.
This allows the user to pass information to the basic components outside of the usual routes of covariates (covar
) and model parameters (params
).
See userdata for information on how to use this facility.
logical; if TRUE
, diagnostic messages will be printed to the console.
Unlike other pomp estimation methods, NLF cannot accommodate general time-dependence in the model via explicit time-dependence or dependence on time-varying covariates.
However, NLF can accommodate periodic forcing.
It does this by including forcing phase as a predictor in the nonlinear autoregressive model.
To accomplish this, one sets period
to the period of the forcing (a positive numerical value).
In this case, if tensor = FALSE
, the effect is to add a periodic intercept in the autoregressive model.
If tensor = TRUE
, by contrast, the fitted model includes time-periodic coefficients,
constructed using tensor products of basis functions of observables with
basis functions of time.
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.
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.
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).
Stephen P. Ellner, Bruce E. Kendall, Aaron A. King
Nonlinear forecasting (NLF) is an ‘indirect inference’ method. The NLF approximation to the log likelihood of the data series is computed by simulating data from a model, fitting a nonlinear autoregressive model to the simulated time series, and quantifying the ability of the resulting fitted model to predict the data time series. The nonlinear autoregressive model is implemented as a generalized additive model (GAM), conditional on lagged values, for each observation variable. The errors are assumed multivariate normal.
The NLF objective function constructed by nlf_objfun
simulates long time series (nasymp
is the number of observations in the simulated times series), perhaps after allowing for a transient period (ntransient
steps).
It then fits the GAM for the chosen lags to the simulated time series.
Finally, it computes the quasi-likelihood of the data under the fitted GAM.
NLF assumes that the observation frequency (equivalently the time between successive observations) is uniform.
S.P. Ellner, B.A. Bailey, G.V. Bobashev, A.R. Gallant, B.T. Grenfell, and D.W. Nychka. Noise and nonlinearity in measles epidemics: combining mechanistic and statistical approaches to population modeling. American Naturalist 151, 425--440, 1998.
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.
B.E. Kendall, S.P. Ellner, E. McCauley, S.N. Wood, C.J. Briggs, W.W. Murdoch, and P. Turchin. Population cycles in the pine looper moth (Bupalus piniarius): dynamical tests of mechanistic hypotheses. Ecological Monographs 75 259--276, 2005.
More on pomp estimation algorithms:
approximate Bayesian computation
,
bsmc2()
,
estimation algorithms
,
mif2()
,
pmcmc()
,
pomp-package
,
probe matching
,
spectrum matching
More on methods based on summary statistics:
approximate Bayesian computation
,
basic probes
,
probe matching
,
probe()
,
spectrum matching
,
spect()
More on maximization-based estimation methods:
mif2()
,
probe matching
,
spectrum matching
,
trajectory matching
# \donttest{
if (require(subplex)) {
ricker() |>
nlf_objfun(est=c("r","sigma","N_0"),lags=c(4,6),
partrans=parameter_trans(log=c("r","sigma","N_0")),
paramnames=c("r","sigma","N_0"),
ti=100,tf=2000,seed=426094906L) -> m1
subplex(par=log(c(20,0.5,5)),fn=m1,control=list(reltol=1e-4)) -> out
m1(out$par)
coef(m1)
plot(simulate(m1))
}
# }
Run the code above in your browser using DataLab