I am working through "Forecasting with Exponential Smoothing". I am stuck on exercise 16.4 on the part that states:
The data set
partx
contains a history of monthly sales of an automobile part. Apply a local Poisson model. Parameters should be estimated by either maximizing the likelihood or minimizing the sum of squared errors.
The local Poisson model is defined as:
I have the following code, but it seems to be stuck. The optimization always returns something close to the starting values.
Am I fitting the local Poisson model correctly?
library(expsmooth)
data("partx")
S <- function(x) {
a <- x[1]
if(a < 0 | a > 1)
return(Inf)
n <- length(partx)
lambda <- numeric(n+1)
error <- numeric(n)
lambda[1] <- x[2]
for(i in 1:n) {
error[i] <- partx[i]-rpois(1,lambda[i])
lambda[i+1] <- (1-a)*lambda[i] + a*partx[i]
}
return(sum(error^2))
}
# returns a = 0.5153971 and lambda = 5.9282414
op1 <- optim(c(0.5,5L),S, control = list(trace = 1))
# returns a = 0.5999655 and lambda = 2.1000131
op2 <- optim(c(0.5,2L),S, control = list(trace = 1))
rpois(1,lambda[i])
will be doing a random draw from the poisson distribution each time. Every time you rerun the optim you get a different result unless you useset.seed
. The expectation of a poisson islambda
, so my gut feeling is to instead writeerror[i] <- partx[i]-lambda[i]
, but I could be wrong. Also, you can addlower
andupper
values tooptim
for the parameter constraints e.g.op1 <- optim(c(0.5,5L), S, lower=c(0,0), upper=c(1,Inf), method = "L-BFGS-B")
– Lightheaded