| qmle | R Documentation |
Calculate the quasi-likelihood and estimate of the parameters of the stochastic differential equation by the maximum likelihood method or least squares estimator of the drift parameter.
qmle(yuima, start, method = "L-BFGS-B", fixed = list(), print = FALSE, envir = globalenv(), lower, upper, joint = FALSE, Est.Incr ="NoIncr", aggregation = TRUE, threshold = NULL, rcpp =FALSE, ...) quasilogl(yuima, param, print = FALSE, rcpp = FALSE) lse(yuima, start, lower, upper, method = "BFGS", ...)
yuima |
a yuima object. |
print |
you can see a progress of the estimation when print is TRUE. |
envir |
an environment where the model coefficients are evaluated. |
method |
see Details. |
param |
|
lower |
a named list for specifying lower bounds of parameters |
upper |
a named list for specifying upper bounds of parameters |
start |
initial values to be passed to the optimizer. |
fixed |
for conditional (quasi)maximum likelihood estimation. |
joint |
perform joint estimation or two stage estimation? by default |
Est.Incr |
If the yuima model is an object of |
aggregation |
If |
threshold |
If the model has Compund Poisson type jumps, the threshold is used to perform thresholding of the increments. |
... |
passed to |
rcpp |
use C++ code? |
qmle behaves more likely the standard mle function in stats4 and
argument method is one of the methods available in optim.
lse calculates least squares estimators of the drift parameters. This is
useful for initial guess of qmle estimation.
quasilogl returns the value of the quasi loglikelihood for a given
yuima object and list of parameters coef.
QL |
a real value. |
opt |
a list with components the same as 'optim' function. |
carmaopt |
if the model is an object of |
cogarchopt |
if the model is an object of |
The function qmle uses the function optim internally.
The function qmle uses the function CarmaNoise internally for estimation of underlying Levy if the model is an object of yuima.carma-class.
The YUIMA Project Team
## Non-ergodic diffucion
Genon-Catalot, V., & Jacod, J. (1993). On the estimation of the diffusion coefficient for multi-dimensional diffusion processes. In Annales de l'IHP Probabilités et statistiques, 29(1), 119-151.
Uchida, M., & Yoshida, N. (2013). Quasi likelihood analysis of volatility and nondegeneracy of statistical random field. Stochastic Processes and their Applications, 123(7), 2851-2876.
## Ergodic diffusion
Kessler, M. (1997). Estimation of an ergodic diffusion from discrete observations. Scandinavian Journal of Statistics, 24(2), 211-229.
## Jump diffusion
Shimizu, Y., & Yoshida, N. (2006). Estimation of parameters for diffusion processes with jumps from discrete observations. Statistical Inference for Stochastic Processes, 9(3), 227-277.
Ogihara, T., & Yoshida, N. (2011). Quasi-likelihood analysis for the stochastic differential equation with jumps. Statistical Inference for Stochastic Processes, 14(3), 189-229.
## COGARCH
Iacus S. M., Mercuri L. and Rroji E.(2015) Discrete time approximation of a COGARCH (p, q) model and its estimation. doi: 10.48550/arXiv.1511.00253
## CARMA
Iacus S. M., Mercuri L. (2015) Implementation of Levy CARMA model in Yuima package. Comp. Stat. (30) 1111-1141. doi: 10.1007/s00180-015-0569-7
#dXt^e = -theta2 * Xt^e * dt + theta1 * dWt
diff.matrix <- matrix(c("theta1"), 1, 1)
ymodel <- setModel(drift=c("(-1)*theta2*x"), diffusion=diff.matrix,
time.variable="t", state.variable="x", solve.variable="x")
n <- 100
ysamp <- setSampling(Terminal=(n)^(1/3), n=n)
yuima <- setYuima(model=ymodel, sampling=ysamp)
set.seed(123)
yuima <- simulate(yuima, xinit=1, true.parameter=list(theta1=0.3,
theta2=0.1))
QL <- quasilogl(yuima, param=list(theta2=0.8, theta1=0.7))
##QL <- ql(yuima, 0.8, 0.7, h=1/((n)^(2/3)))
QL
## another way of parameter specification
##param <- list(theta2=0.8, theta1=0.7)
##QL <- ql(yuima, h=1/((n)^(2/3)), param=param)
##QL
## old code
##system.time(
##opt <- ml.ql(yuima, 0.8, 0.7, h=1/((n)^(2/3)), c(0, 1), c(0, 1))
##)
##cat(sprintf("\nTrue param. theta2 = .3, theta1 = .1\n"))
##print(coef(opt))
system.time(
opt2 <- qmle(yuima, start=list(theta1=0.8, theta2=0.7), lower=list(theta1=0,theta2=0),
upper=list(theta1=1,theta2=1), method="L-BFGS-B")
)
cat(sprintf("\nTrue param. theta1 = .3, theta2 = .1\n"))
print(coef(opt2))
## initial guess for theta2 by least squares estimator
tmp <- lse(yuima, start=list(theta2=0.7), lower=list(theta2=0), upper=list(theta2=1))
tmp
system.time(
opt3 <- qmle(yuima, start=list(theta1=0.8, theta2=tmp), lower=list(theta1=0,theta2=0),
upper=list(theta1=1,theta2=1), method="L-BFGS-B")
)
cat(sprintf("\nTrue param. theta1 = .3, theta2 = .1\n"))
print(coef(opt3))
## perform joint estimation? Non-optimal, just for didactic purposes
system.time(
opt4 <- qmle(yuima, start=list(theta1=0.8, theta2=0.7), lower=list(theta1=0,theta2=0),
upper=list(theta1=1,theta2=1), method="L-BFGS-B", joint=TRUE)
)
cat(sprintf("\nTrue param. theta1 = .3, theta2 = .1\n"))
print(coef(opt4))
## fix theta1 to the true value
system.time(
opt5 <- qmle(yuima, start=list(theta2=0.7), lower=list(theta2=0),
upper=list(theta2=1),fixed=list(theta1=0.3), method="L-BFGS-B")
)
cat(sprintf("\nTrue param. theta1 = .3, theta2 = .1\n"))
print(coef(opt5))
## old code
##system.time(
##opt <- ml.ql(yuima, 0.8, 0.7, h=1/((n)^(2/3)), c(0, 1), c(0, 1), method="Newton")
##)
##cat(sprintf("\nTrue param. theta1 = .3, theta2 = .1\n"))
##print(coef(opt))
## Not run:
###multidimension case
##dXt^e = - drift.matrix * Xt^e * dt + diff.matrix * dWt
diff.matrix <- matrix(c("theta1.1","theta1.2", "1", "1"), 2, 2)
drift.c <- c("-theta2.1*x1", "-theta2.2*x2", "-theta2.2", "-theta2.1")
drift.matrix <- matrix(drift.c, 2, 2)
ymodel <- setModel(drift=drift.matrix, diffusion=diff.matrix, time.variable="t",
state.variable=c("x1", "x2"), solve.variable=c("x1", "x2"))
n <- 100
ysamp <- setSampling(Terminal=(n)^(1/3), n=n)
yuima <- setYuima(model=ymodel, sampling=ysamp)
set.seed(123)
##xinit=c(x1, x2) #true.parameter=c(theta2.1, theta2.2, theta1.1, theta1.2)
yuima <- simulate(yuima, xinit=c(1, 1),
true.parameter=list(theta2.1=0.5, theta2.2=0.3, theta1.1=0.6, theta1.2=0.2))
## theta2 <- c(0.8, 0.2) #c(theta2.1, theta2.2)
##theta1 <- c(0.7, 0.1) #c(theta1.1, theta1.2)
## QL <- ql(yuima, theta2, theta1, h=1/((n)^(2/3)))
## QL
## ## another way of parameter specification
## #param <- list(theta2=theta2, theta1=theta1)
## #QL <- ql(yuima, h=1/((n)^(2/3)), param=param)
## #QL
## theta2.1.lim <- c(0, 1)
## theta2.2.lim <- c(0, 1)
## theta1.1.lim <- c(0, 1)
## theta1.2.lim <- c(0, 1)
## theta2.lim <- t( matrix( c(theta2.1.lim, theta2.2.lim), 2, 2) )
## theta1.lim <- t( matrix( c(theta1.1.lim, theta1.2.lim), 2, 2) )
## system.time(
## opt <- ml.ql(yuima, theta2, theta1, h=1/((n)^(2/3)), theta2.lim, theta1.lim)
## )
## opt@coef
system.time(
opt2 <- qmle(yuima, start=list(theta2.1=0.8, theta2.2=0.2, theta1.1=0.7, theta1.2=0.1),
lower=list(theta1.1=.1,theta1.2=.1,theta2.1=.1,theta2.2=.1),
upper=list(theta1.1=4,theta1.2=4,theta2.1=4,theta2.2=4), method="L-BFGS-B")
)
opt2@coef
summary(opt2)
## unconstrained optimization
system.time(
opt3 <- qmle(yuima, start=list(theta2.1=0.8, theta2.2=0.2, theta1.1=0.7, theta1.2=0.1))
)
opt3@coef
summary(opt3)
quasilogl(yuima, param=list(theta2.1=0.8, theta2.2=0.2, theta1.1=0.7, theta1.2=0.1))
##system.time(
##opt <- ml.ql(yuima, theta2, theta1, h=1/((n)^(2/3)), theta2.lim, theta1.lim, method="Newton")
##)
##opt@coef
##
# carma(p=2,q=0) driven by a brownian motion without location parameter
mod0<-setCarma(p=2,
q=0,
scale.par="sigma")
true.parm0 <-list(a1=1.39631,
a2=0.05029,
b0=1,
sigma=0.23)
samp0<-setSampling(Terminal=100,n=250)
set.seed(123)
sim0<-simulate(mod0,
true.parameter=true.parm0,
sampling=samp0)
system.time(
carmaopt0 <- qmle(sim0, start=list(a1=1.39631,a2=0.05029,
b0=1,
sigma=0.23))
)
summary(carmaopt0)
# carma(p=2,q=1) driven by a brownian motion without location parameter
mod1<-setCarma(p=2,
q=1)
true.parm1 <-list(a1=1.39631,
a2=0.05029,
b0=1,
b1=2)
samp1<-setSampling(Terminal=100,n=250)
set.seed(123)
sim1<-simulate(mod1,
true.parameter=true.parm1,
sampling=samp1)
system.time(
carmaopt1 <- qmle(sim1, start=list(a1=1.39631,a2=0.05029,
b0=1,b1=2),joint=TRUE)
)
summary(carmaopt1)
# carma(p=2,q=1) driven by a compound poisson process where the jump size is normally distributed.
mod2<-setCarma(p=2,
q=1,
measure=list(intensity="1",df=list("dnorm(z, 0, 1)")),
measure.type="CP")
true.parm2 <-list(a1=1.39631,
a2=0.05029,
b0=1,
b1=2)
samp2<-setSampling(Terminal=100,n=250)
set.seed(123)
sim2<-simulate(mod2,
true.parameter=true.parm2,
sampling=samp2)
system.time(
carmaopt2 <- qmle(sim2, start=list(a1=1.39631,a2=0.05029,
b0=1,b1=2),joint=TRUE)
)
summary(carmaopt2)
# carma(p=2,q=1) driven by a normal inverse gaussian process
mod3<-setCarma(p=2,q=1,
measure=list(df=list("rNIG(z, alpha, beta, delta1, mu)")),
measure.type="code")
#
# True param
true.param3<-list(a1=1.39631,
a2=0.05029,
b0=1,
b1=2,
alpha=1,
beta=0,
delta1=1,
mu=0)
samp3<-setSampling(Terminal=100,n=200)
set.seed(123)
sim3<-simulate(mod3,
true.parameter=true.param3,
sampling=samp3)
carmaopt3<-qmle(sim3,start=true.param3)
summary(carmaopt3)
# Simulation and Estimation of COGARCH(1,1) with CP driven noise
# Model parameters
eta<-0.053
b1 <- eta
beta <- 0.04
a0 <- beta/b1
phi<- 0.038
a1 <- phi
# Definition
cog11<-setCogarch(p = 1,q = 1,
measure = list(intensity = "1",
df = list("dnorm(z, 0, 1)")),
measure.type = "CP",
XinExpr=TRUE)
# Parameter
paramCP11 <- list(a1 = a1, b1 = b1,
a0 = a0, y01 = 50.31)
# Sampling scheme
samp11 <- setSampling(0, 3200, n=64000)
# Simulation
set.seed(125)
SimTime11 <- system.time(
sim11 <- simulate(object = cog11,
true.parameter = paramCP11,
sampling = samp11,
method="mixed")
)
plot(sim11)
# Estimation
timeComp11<-system.time(
res11 <- qmle(yuima = sim11,
start = paramCP11,
grideq = TRUE,
method = "Nelder-Mead")
)
timeComp11
unlist(paramCP11)
coef(res11)
# COGARCH(2,2) model driven by CP
cog22 <- setCogarch(p = 2,q = 2,
measure = list(intensity = "1",
df = list("dnorm(z, 0, 1)")),
measure.type = "CP",
XinExpr=TRUE)
# Parameter
paramCP22 <- list(a1 = 0.04, a2 = 0.001,
b1 = 0.705, b2 = 0.1, a0 = 0.1, y01 = (1 + 2 / 3),
y02=0)
# Use diagnostic.cog for checking the stat and positivity
check22 <- Diagnostic.Cogarch(cog22, param = paramCP22)
# Sampling scheme
samp22 <- setSampling(0, 3600, n = 64000)
# Simulation
set.seed(125)
SimTime22 <- system.time(
sim22 <- simulate(object = cog22,
true.parameter = paramCP22,
sampling = samp22,
method = "Mixed")
)
plot(sim22)
timeComp22 <- system.time(
res22 <- qmle(yuima = sim22,
start = paramCP22,
grideq=TRUE,
method = "Nelder-Mead")
)
timeComp22
unlist(paramCP22)
coef(res22)
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.