Complex models in ecology: challenges and solutions

33

description

41st Annual Meeting of the SSC -- Recent developments in R packages, May 27, 2013

Transcript of Complex models in ecology: challenges and solutions

Page 1: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Complex models in ecology: challenges and solutions

Péter Sólymoswith K. Nadeem and S. R. Lele

University of Alberta

41st Annual Meeting of the SSCRecent developments in R packages

May 27, 2013

Page 2: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Complex models are everywhere

� Ecology is the scienti�c study of interactions of organisms with one another andwith their environment.

� Data is growing fast, models are becoming more complex.

� We need complex models for dealing with:� non-independence (spatial, temporal, phylogenetic),� missing data,� observation and measurement error.

Page 3: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Hierarchical models

� Inference:� (y | X = x) ∼ h(y ;X = x, θ1)� X ∼ g(x ; θ2)� θ = (θ1, θ2)� L(θ; y) =

∫h(y | x ; θ1)g(x ; θ2)dx

� Computation:� high dimensional integral � hard to calculate,� noisy likelihood surface � numerical search is hard,� second derivatives � hard to calculate.� life is hard � if you are a frequentist.

Page 4: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

The Bayesian toolkit

� MCMC is easy because others did the heavy lifting:� WinBUGS, OpenBUGS� JAGS� STAN

� Great interfaces with R:� R2WinBUGS, R2OpenBUGS, BRugs� coda, rjags� rstan

� Inference based on the posterior distribution:

� π(θ | y) = L(θ;y)π(θ)∫L(θ;y)π(θ)dθ

,

� π(θ) is the prior distribution.

Page 5: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Normal�Normal model

� Yij | µij ∼ Normal(µij , σ2)

� i = 1, . . . , n; j = 1, . . . ,mn

� µij = XTijθ + εi

� εi ∼ Normal(0, τ2)

model {for (ij in 1:nm) { #### <- likelihood

Y[ij] ~ dnorm(mu[ij], 1/sigma^2)mu[ij] <- inprod(X[ij,], theta) + e[gr[ij]]

}for (i in 1:n) {

e[i] ~ dnorm(0, 1/tau^2)}for (k in 1:np) { #### <- priors

theta[k] ~ dnorm(0, 0.001)}sigma ~ dlnorm(0, 0.001)tau ~ dlnorm(0, 0.001)

}

Page 6: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Normal�Normal model

> library(rjags)> library(dclone)> set.seed(1234)> theta <- c(1, -1)> sigma <- 0.6> tau <- 0.3> n <- 50 # number of clusters> m <- 10 # number of repeats within each cluster> nm <- n * m # total number of observations> gr <- rep(1:n, each = m) # group membership defining clusters> x <- rnorm(nm) # covariate> X <- model.matrix(~x) # design matrix> e <- rnorm(n, 0, tau) # random effect> mu <- drop(X %*% theta) + e[gr] # mean> Y <- rnorm(nm, mu, sigma) # outcome

Page 7: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

JAGS

> dat <- list(Y = Y, X = X, nm = nm, n = n, np = ncol(X), gr = gr)> str(dat)

List of 6$ Y : num [1:500] 1.669 0.34 -0.474 3.228 0.968 ...$ X : num [1:500, 1:2] 1 1 1 1 1 1 1 1 1 1 .....- attr(*, "dimnames")=List of 2.. ..$ : chr [1:500] "1" "2" "3" "4" ..... ..$ : chr [1:2] "(Intercept)" "x"..- attr(*, "assign")= int [1:2] 0 1

$ nm: num 500$ n : num 50$ np: int 2$ gr: int [1:500] 1 1 1 1 1 1 1 1 1 1 ...

> m <- jags.fit(dat, c("theta", "sigma", "tau"), model, n.update = 2000)

Page 8: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

JAGS

> summary(m)

Iterations = 3001:8000Thinning interval = 1Number of chains = 3Sample size per chain = 5000

1. Empirical mean and standard deviation for each variable,plus standard error of the mean:

Mean SD Naive SE Time-series SEsigma 0.581 0.0193 0.000158 0.000225tau 0.279 0.0410 0.000335 0.000739theta[1] 0.959 0.0479 0.000391 0.000959theta[2] -1.032 0.0260 0.000213 0.000230

2. Quantiles for each variable:

2.5% 25% 50% 75% 97.5%sigma 0.546 0.568 0.581 0.594 0.621tau 0.205 0.250 0.276 0.305 0.365theta[1] 0.862 0.927 0.959 0.991 1.052theta[2] -1.083 -1.050 -1.032 -1.014 -0.981

Page 9: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

JAGS

sigma

0.15 0.40 −1.15 −0.95

0.55

0.15

0.40

20

40

tau

20 10 theta[1]

0.8

1.1

0.55

−1.

15−

0.95

50

20

0.8 1.1

10

theta[2]

Page 10: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Data cloning (DC)

� Basic results1:� y (K) = (y , . . . , y)� L(θ; yK ) = L(θ; y)K

� πK (θ | y) = [L(θ;y)]Kπ(θ)∫[L(θ;y)]Kπ(θ)dθ

,

� πK (θ | y) ∼ MVN(θ̂, 1K I−1(θ̂))

� Implications:� we can use Bayesian MCMC toolkit for frequentist inference,� mean of the posterior is the MLE (θ̂),� K times the posterior variance is the variance of the MLE.� High dimensional integral � no need to calculate,� noisy likelihood surface � no numerical optimization involved,� second derivatives � no need to calculate.� This is independent of the speci�cation of the prior distribution.

1Lele et al. 2007 ELE; Lele et al. 2010 JASA

Page 11: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Iterative model �tting

> str(dclone(dat, n.clones = 2, unchanged = "np", multiply = c("nm",+ "n")))

List of 6$ Y : atomic [1:1000] 1.669 0.34 -0.474 3.228 0.968 .....- attr(*, "n.clones")= atomic [1:1] 2.. ..- attr(*, "method")= chr "rep"

$ X : num [1:1000, 1:2] 1 1 1 1 1 1 1 1 1 1 .....- attr(*, "dimnames")=List of 2.. ..$ : chr [1:1000] "1_1" "2_1" "3_1" "4_1" ..... ..$ : chr [1:2] "(Intercept)" "x"..- attr(*, "n.clones")= atomic [1:1] 2.. ..- attr(*, "method")= chr "rep"

$ nm: atomic [1:1] 1000..- attr(*, "n.clones")= atomic [1:1] 2.. ..- attr(*, "method")= chr "multi"

$ n : atomic [1:1] 100..- attr(*, "n.clones")= atomic [1:1] 2.. ..- attr(*, "method")= chr "multi"

$ np: int 2$ gr: atomic [1:1000] 1 1 1 1 1 1 1 1 1 1 .....- attr(*, "n.clones")= atomic [1:1] 2.. ..- attr(*, "method")= chr "rep"

> mk <- dc.fit(dat, c("theta", "sigma", "tau"), model, n.update = 2000,+ n.clones = c(1, 2, 4, 8), unchanged = "np", multiply = c("nm",+ "n"))

Page 12: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Marginal posterior summaries

sigma

Number of clones

1 2 4 8

0.54

0.60

x x x x

x

xx

x

tau

Number of clonesE

stim

ate

1 2 4 8

0.20

0.35

xx x x

xx x x

theta[1]

1 2 4 8

0.90

1.00

x x x x

x x x x

theta[2]E

stim

ate

1 2 4 8

−1.

08−

1.00

xx x x

xx

x x

Page 13: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

DC diagnostics

> dcdiag(mk)

n.clones lambda.max ms.error r.squared r.hat1 1 0.002150 0.04172 0.003217 1.0012 2 0.002234 0.08290 0.006286 1.0083 4 0.002322 0.10398 0.010156 1.0014 8 0.002117 0.08042 0.006313 1.012

� It can help in dientifying the number of clones required.

� Non-identi�ability can be spotted as a bonus.

Page 14: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Computational demands

1.0 2.0 3.0 4.0

04

812

Number of chains

Pro

cess

ing

time

(sec

)

1 2 3 4 5 6 7 8

020

4060

Number of clonesP

roce

ssin

g tim

e (s

ec)

Page 15: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

HPC to the rescue!

� MCMC is labelled as �embarassingly parallel problem�.

� Distributing independent chanins to workers:� Proper initialization (initial values, RNGs),� run the chains on workers,� collect results (large MCMC object might mean more communication overhead),� repeat this for di�erent number of clones.

� The paradox of burn-in:� one long chain: burn-in happens only once,� few-to-many chains: best trade-o� w.r.t. burn-in,� n.iter chains: burn-in happens n.iter times (even with ∞ chains).

� Computing time should drop to 1/n.iter + overhead.

� This works for Bayesian analysis and DC.

� �Learning� can happen, i.e. results can be used to make priors more informative(this improves mixing and reduces burn-in).

Page 16: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Workload optimization

� Size balancing for DC:� start with largest problem chighest K ,� run smaller problems on other workers.� collect results (collect whole MCMC object for highest K , only summaries forothers),

� �Learning� is not an option here, need to have good guesses or rely onnon-informative priors.

� Can be combined with the parallel chains approach.

� Computing time is de�ned by the highest K problem.

Page 17: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Size balancing

0 2 4 6 8 12

2

1

No Balancing

Max = 12Approximate Processing Time

Wor

kers 1 2

3 4 5

0 2 4 6 8 12

2

1

Size Balancing

Max = 8Approximate Processing Time

Wor

kers 5 2 1

4 3

Page 18: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Types of parallelism

> ## snow type clusters> cl <- makeCluster(3)> m <- jags.parfit(cl, ...)> mk <- dc.parfit(cl, ...)> stopCluster(cl)>> ## muticore type forking> m <- jags.parfit(3, ...)> mk <- dc.parfit(3, ...)

� Parallel chains approach not available for WinBUGS/OpenBUGS,

� dc.parfit allows size balancing for WinBUGS/OpenBUGS.

� Forking does not work on Windows.

� (STAN: all works, see R-Forge2)

2http://dcr.r-forge.r-project.org/extras/stan.�t.R

Page 19: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Random Number Generation� WinBUGS/OpenBUGS: seeds approach does not guarantee independence of verylong chains.

� STAN uses L'Ecuyer RNGs.� JAGS: uses 4 RNGs in base module, but there is the lecuyer module whichallows high number of independent chains.

> ## 'base::BaseRNG' factory> str(parallel.inits(NULL, 2))

List of 2$ :List of 2..$ .RNG.name : chr "base::Marsaglia-Multicarry"..$ .RNG.state: int [1:2] 2087563718 113920118

$ :List of 2..$ .RNG.name : chr "base::Super-Duper"..$ .RNG.state: int [1:2] 1968324500 1720729645

> ## 'lecuyer::RngStream' factory> load.module("lecuyer", quiet = TRUE)> str(parallel.inits(NULL, 2))

List of 2$ :List of 2..$ .RNG.name : chr "lecuyer::RngStream"..$ .RNG.state: int [1:6] -1896643356 145063650 -1913397488 -341376786 297806844 1434416058

$ :List of 2..$ .RNG.name : chr "lecuyer::RngStream"..$ .RNG.state: int [1:6] -1118475959 1854133089 -159660578 -80247816 -567553258 -1472234812

> unload.module("lecuyer", quiet = TRUE)

Page 20: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

HMC in STAN

� Another way to cut back on burn-in is to use Hamiltonian Monte Carlo andrelated algorithms (No-U-Turn sampler, NUTS).

� This is also helpful when parameters are correlated.

� See http://mc-stan.org/.

� DC support exists3: currently not through CRAN because rstan is not hosted onCRAN (might never be).

3http://dcr.r-forge.r-project.org/extras/stan.�t.R

Page 21: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

The two mind-sets

1. Analytic mid-set� use a prede�ned general model,� possibly �t it to many similar data sets,� not that interested in algorithms (...),� want something like this:

> FIT <- MODEL(y ~ x, DATA, ...)

2. Algorithmic mid-set� �t a speci�c model� to a speci�c data set,� more focus on algorithmic settings:

> DATA <- list(y = y, x = x)> MODEL <- y ~ x> FIT <- WRAPPER(DATA, MODEL, ...)

How do we provide estimating procedures for folks with an analytic mind-set?

Page 22: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

sharx: an example

sharx is a package to �t hierarchical species�are relationship models (a kind ofmultivariate mixed model for mata-analysis).

> library(sharx)> hsarx

function (formula, data, n.clones, cl = NULL, ...){

if (missing(n.clones))stop("'n.clones' argument missing")

if (missing(data))data <- parent.frame()

tmp <- parse_hsarx(formula, data)dcf <- make_hsarx(tmp$Y, tmp$X, tmp$Z, tmp$G)dcm <- dcmle(dcf, n.clones = n.clones, cl = cl, nobs = length(tmp$Y),

...)out <- as(dcm, "hsarx")title <- if (ncol(tmp$X) > 2)

"SARX"else "SAR"if (!is.null(tmp$Z)) {

if (title != "SARX" && NCOL(tmp$Z) > 1)title <- paste(title, "X", sep = "")

title <- paste("H", title, sep = "")}out@title <- paste(title, "Model")out@data <- dcfout

}<environment: namespace:sharx>

Page 23: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

dcmle

� The dcmle package was motivated by stats4:::mle and the modeltools

package.

� Wanted to provide:� a wrapper around wrappers around wrappers (another abstraction layer),� uni�ed S4 object classes for data and �tted models for Bayesian analysis and DC,� lots of methods for access, coercion, summaries, plots.

� This is the engine for package development with DC.

� Classic BUGS examples:

module glm loaded

> library(dcmle)> as.character(listDcExamples()$topic)

[1] "blocker" "bones" "dyes" "epil"[5] "equiv" "leuk" "litters" "lsat"[9] "mice" "oxford" "pump" "rats"

[13] "salm" "seeds" "air" "alli"[17] "asia" "beetles" "biops" "birats"[21] "cervix" "dugongs" "eyes" "hearts"[25] "ice" "jaw" "orange" "pigs"[29] "schools" "paramecium"

Page 24: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

seeds example

> sourceDcExample("seeds")> seeds

Formal class 'dcFit' [package "dcmle"] with 10 slots..@ multiply : chr "N"..@ unchanged: NULL..@ update : NULL..@ updatefun: NULL..@ initsfun : NULL..@ flavour : chr "jags"..@ data :List of 5.. ..$ N : num 21.. ..$ r : num [1:21] 10 23 23 26 17 5 53 55 32 46 ..... ..$ n : num [1:21] 39 62 81 51 39 6 74 72 51 79 ..... ..$ x1: num [1:21] 0 0 0 0 0 0 0 0 0 0 ..... ..$ x2: num [1:21] 0 0 0 0 0 1 1 1 1 1 .....@ model :function ()..@ params : chr [1:5] "alpha0" "alpha1" "alpha2" "alpha12" .....@ inits :List of 5.. ..$ tau : num 1.. ..$ alpha0 : num 0.. ..$ alpha1 : num 0.. ..$ alpha2 : num 0.. ..$ alpha12: num 0

Page 25: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

seeds example

> custommodel(seeds@model)

Object of class "custommodel":

model{

alpha0 ~ dnorm(0.00000E+00, 1.00000E-06)alpha1 ~ dnorm(0.00000E+00, 1.00000E-06)alpha2 ~ dnorm(0.00000E+00, 1.00000E-06)alpha12 ~ dnorm(0.00000E+00, 1.00000E-06)tau ~ dgamma(0.001, 0.001)sigma <- 1/sqrt(tau)for (i in 1:N) {

b[i] ~ dnorm(0.00000E+00, tau)logit(p[i]) <- alpha0 + alpha1 * x1[i] + alpha2 * x2[i] +

alpha12 * x1[i] * x2[i] + b[i]r[i] ~ dbin(p[i], n[i])

}}

Page 26: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

seeds example

> dcm <- dcmle(seeds, n.clones = 1:3, n.iter = 1000)

> summary(dcm)

Maximum likelihood estimation with data cloning

Call:dcmle(x = seeds, n.clones = 1:3, n.iter = 1000)

Settings:start end thin n.iter n.chains n.clones1001 2000 1 1000 3 3

Coefficients:Estimate Std. Error z value Pr(>|z|)

alpha0 -0.5556 0.1738 -3.20 0.0014 **alpha1 0.0981 0.2909 0.34 0.7360alpha12 -0.8319 0.3947 -2.11 0.0350 *alpha2 1.3547 0.2542 5.33 9.8e-08 ***sigma 0.2450 0.1244 1.97 0.0490 *---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Convergence:n.clones lambda.max ms.error r.squared r.hat

1 0.494 NA NA 1.052 0.184 NA NA 1.043 0.130 NA NA 1.02

Page 27: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

PVAClone

� Likelihood based population viability analysis in the presence of observation errorand missing data4.

� Builds upon JAGS, dclone, and dcmle.

� Growth models: Xt | σ2 ∼ Normal(m(Xt−1, η), σ2)� gompertz: m(Xt−1) = Xt−1 + a + bXt−1,

� ricker: m(Xt−1) = Xt−1 + a + beXt−1 ,� bevertonholt,� thetalogistic,� thetalogistic_D.

� Observation error: Yt ∼ f (yt ;Xt ,Ψ)� none,� poisson,� normal,

4Nadeem and Lele 2012 OIKOS

Page 28: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Growth model objects

> library(PVAClone)> gm <- ricker("normal", fixed = c(sigma = 0.5))> str(gm)

Formal class 'pvamodel' [package "PVAClone"] with 14 slots..@ growth.model: chr "ricker"..@ obs.error : chr "normal"..@ model :Class 'custommodel' chr [1:20] "model {" " for (i in 1:kk) {" " N[1,i] <- exp(y[1,i])" " x[1,i] <- y[1,i]" .....@ genmodel :function ()..@ p : int 4..@ support : num [1:4, 1:2] -Inf -Inf 2.22e-16 2.22e-16 Inf ..... ..- attr(*, "dimnames")=List of 2.. .. ..$ : chr [1:4] "a" "b" "sigma" "tau".. .. ..$ : chr [1:2] "Min" "Max"..@ params : chr [1:3] "a" "b" "lntau"..@ varnames : chr [1:4] "a" "b" "sigma" "tau"..@ fixed : Named num 0.5.. ..- attr(*, "names")= chr "sigma"..@ fancy : chr [1:2] "Ricker" "Normal"..@ transf :function (mcmc, obs.error)..@ backtransf :function (mcmc, obs.error)..@ logdensity :function (logx, mle, data, null_obserror = FALSE, alt_obserror = FALSE)..@ neffective :function (obs)

Page 29: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Model with �xed parameters

> gm@model

Object of class "custommodel":

model {for (i in 1:kk) {

N[1,i] <- exp(y[1,i])x[1,i] <- y[1,i]for (j in 2:T) {

x[j,i] ~ dnorm(mu[j,i], prcx)mu[j,i] <- a + b * N[j-1,i] + x[j-1,i]N[j,i] <- min(exp(x[j,i]), 10000)y[j,i] ~ dnorm(x[j,i], prcy)

}}sigma <- 0.5tau <- exp(lntau)lnsigma <- log(sigma)lntau ~ dnorm(0, 1)a ~ dnorm(0, 0.01)b ~ dnorm(0, 10)prcx <- 1/sigma^2prcy <- 1/tau^2

}

Page 30: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Likelihood ratio test (DCLR)

> m1 <- pva(redstart, gompertz("normal"), 50, n.update = 2000,+ n.iter = 1000)> m2 <- pva(redstart, ricker("normal"), 50, n.update = 2000, n.iter = 1000)> ms <- model.select(m1, m2)

> coef(m2)

a b sigma tau0.07159 -0.01721 0.05096 0.58996

> ms

PVA Model Selection:Time series with 30 observations (missing: 0)

Null Model: m1Gompertz growth model with Normal observation error

Alternative Model: m2Ricker growth model with Normal observation error

log_LR delta_AIC delta_BIC delta_AICc1 -249.6 499.3 499.4 499.3

Alternative Model is strongly supported over the Null Model

Page 31: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Pro�le likelihood

> alt <- pva(redstart, ricker("normal", fixed = c(sigma = 0.05)),+ 50, n.update = 2000, n.iter = 1000)> p <- generateLatent(alt, n.chains = 1, n.iter = 10000)> a <- c(-0.1, -0.05, 0, 0.05, 0.1, 0.15, 0.2)> llr_res <- numeric(length(a))> for (i in seq_len(length(a))) {+ null <- pva(redstart, ricker("normal", fixed = c(a = a[i],+ sigma = 0.05)), 50, n.update = 2000, n.iter = 1000)+ llr_res[i] <- pva.llr(null, alt, pred = p)+ }

Page 32: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

Pro�le likelihood

−0.10 −0.05 0.00 0.05 0.10 0.15 0.20

−30

0−

200

−10

00

a

Pro

file

log−

likel

ihoo

d

Page 33: Complex models in ecology: challenges and solutions

Motivation Bayesian tools Data cloning HPC dcmle PVAClone Next

What's next?

� Things done:� DC support for OpenBUGS, WinBUGS, JAGS, STAN.� Support for parallel computing.� dcmle engine for package development (sharx, PVAClone, and soon detect).

� Things to do:� Full integration with STAN (dc.fit, dcmle).� More examples.� Prediction/forecasting features for PVAClone.

� Find out more:� Sólymos 2010 R Journal [PDF]� http://dcr.r-forge.r-project.org/