KalmanFilter is used with the MinUnconMultivar
class to find a maximum likelihood estimate of the paramether
in an MA(1) time series represented by
. The input is 200 observations from an MA(1) time series with
and
. The MA(1) time series is cast as a state-space model of the following form (see Harvey 1981, pages 103-104, 112):
where the two-dimensional
s are independently distributed bivariate normal with mean 0 and variance
and
import com.imsl.stat.*;
import com.imsl.math.*;
public class KalmanFilterEx2 implements MinUnconMultiVar.Function {
public double f(double[] theta) {
int nobs = 200;
int rank = 0;
double ss = 0.0;
double logDeterminant = 0.0;
double res;
double[][] covb = new double[2][2];
double[][] q = new double[2][2];
double[][] r = {{0.0}};
double[] b = {0.0,0.0};
double[][] z = {{1.0, 0.0}};
double[][] t = {{0.0, 1.0},
{0.0, 0.0}};
double[] y = new double[1];
double[] ydata = {0.057466,-0.459067,1.236446,-1.864825,0.951507,
-1.489367,-0.864401,0.302984,-0.376017,0.610208,
-1.701583,2.271734,-0.917110,0.582576,1.018681,
0.107443,-0.557858,0.502818,0.858002,-1.417659,
0.839981,0.047021,0.404448,0.383749,-0.383227,
1.179607,-1.154339,1.927541,0.996344,1.019415,
-0.816815,-0.100467,-0.125334,-0.068065,-1.891685,
0.657241,-1.070823,1.023510,2.672653,-2.141434,
-1.232266,0.925311,-0.201665,-1.325580,-0.086926,
-0.647157,1.314749,-0.085708,1.430485,0.304040,
0.305559,1.669671,1.004800,-1.678350,0.631133,
0.502284,0.247378,-1.345484,0.994982,1.145546,
-1.248822,0.616784,-2.127822,2.264872,-1.590343,
0.365785,-1.056652,0.969750,1.028274,0.332050,
0.430686,0.364553,0.482446,-0.303248,1.581931,
-0.140942,-0.265280,-0.939284,0.464963,-0.778145,
0.583486,-0.113080,-0.009839,1.580189,-1.116377,
1.744513,-0.298106,0.332944,-0.228859,1.101747,
0.772369,-1.608111,2.671822,-0.504800,-1.647797,
-0.596313,0.845472,0.507869,0.833377,-0.460099,
0.416891,-1.139069,0.159028,-0.193971,-0.154656,
1.720997,-0.403189,0.400026,0.285921,-1.914338,
1.296864,1.426898,-0.426181,0.255961,-1.790193,
0.721048,1.150173,-0.980386,0.940958,0.313898,
0.505735,-1.058126,0.111918,0.185493,-0.296146,
-0.104457,1.151733,0.683025,-0.714269,-0.787972,
-1.277062,1.378816,-0.658115,-0.259860,-2.614008,
2.251646,-0.006773,-0.738467,-0.260685,1.896505,
-0.094919,0.089954,-1.627679,-1.675018,0.896835,
0.498690,-0.368775,0.131849,-2.060292,0.272666,
2.115804,-1.323451,0.557106,-0.602031,1.424524,
-0.107996,-1.580671,0.672012,-1.668931,2.474710,
-1.471518,1.780317,-0.419588,2.008474,-1.246855,
0.231161,0.706104,-0.474320,-0.705431,0.599358,
-2.469494,2.024374,0.849572,-2.410618,2.812321,
-1.066520,-0.539768,-0.067784,1.978078,0.592879,
-0.184623,-1.403912,-0.995537,1.727320,-0.313251,
0.472437,-0.241800,-0.875680,-0.159557,0.508238,
-0.116888,-0.981759,-0.472451,0.847273,-1.713030,
2.010192,-0.981891,1.190901,0.453348,-0.743333};
if (Math.abs(theta[0]) > 1.0) {
res = 1.0e10;
} else {
q[0][0] = 1.0;
q[0][1] = -theta[0];
q[1][0] = -theta[0];
q[1][1] = theta[0]*theta[0];
covb[0][0] = 1.0 + theta[0]*theta[0];
covb[0][1] = -theta[0];
covb[1][0] = -theta[0];
covb[1][1] = theta[0]*theta[0];
KalmanFilter kalman = new KalmanFilter(b, covb, rank, ss, logDeterminant);
for (int i = 0; i<nobs; i++) {
y[0] = ydata[i];
kalman.update(y, z, r);
kalman.setTransitionMatrix(t);
kalman.setQ(q);
kalman.filter();
}
ss = kalman.getSumOfSquares();
logDeterminant = kalman.getLogDeterminant();
rank = kalman.getRank();
res = rank*Math.log(ss/rank) + logDeterminant;
}
return(res);
}
public static void main(String args[]) throws com.imsl.IMSLException {
MinUnconMultiVar solver = new MinUnconMultiVar(1);
double[] x = solver.computeMin(new KalmanFilterEx2());
System.out.println("Maximum likelihood estimate, THETA = " + x[0]);
}
}
Maximum likelihood estimate, THETA = 0.4529402135287534Link to Java source.