#Computes the value of the CMLE for the ACD(1,1) model with log-normal innovations; see Section 2.2 of Meintanis, Milosevic and Obradovic.
acd.Lognormal<-function(durations,order=c(1,1),param=NULL){
p=order[1]
q=order[2]
start=max(p,q)+1

# Assign global variables which are used in loglikelihood function
global.X <<- durations
global.order <<- order

#Minimization of minus likelihood
fit = optim(par = param, fn = loglik) 

#Estimated parameters
par=fit$par 
T=length(durations)

#Initializing conditional duration
mu_t=rep(par[1],(T-start+1)) 

#Calculation of conditional duration
if(p > 0){
for (i in 1:p){
mu_t=mu_t+par[1+i]*durations[(start-i):(T-i)]
}
}
if(q > 0){
mu=filter(mu_t,par[(1+p+1):(1+p+q)],"r",init=rep(mean(durations),q))
}
if(q==0) mu=mu_t

#Estimating residuals
resi=durations[start:T]/mu

acd.Lognormal <- list(mPara=par[1:(p+q+1)],dPara=par[p+q+2],residual=resi)
return(acd.Lognormal)
}


#Loglikelihood function
loglik <- function(par){
  x=global.X
  order=global.order

  T=length(x)
  p=order[1]
  q=order[2]
  start=max(p,q)+1
  mu_t=rep(par[1],(T-start+1))
  if(p > 0){
    for (i in 1:p){
      mu_t=mu_t+par[1+i]*x[(start-i):(T-i)]
    }
  }
  if(q > 0){
    mu=filter(mu_t,par[(1+p+1):(1+p+q)],"r",init=rep(mean(x),q))
  }
  if(q==0) mu=mu_t
  e_t=x[start:T]
  logsd=par[p+q+2]
  logmean=-logsd^2/2
  tmp=1/e_t/logsd/sqrt(2*pi)*exp(-(log(e_t)-logmean)^2/2/logsd^2)
  loglik = -sum(log(tmp))
  return(loglik)
}


