Example: Lack Of Fit

Consider the Wölfer Sunspot Data (Anderson 1971, page 660) consisting of the number of sunspots observed each year from 1749 through 1924. The data set for this example consists of the number of sunspots observed from 1770 through 1869. An ARMA(2,1) with nonzero mean is fitted using the ARMA class. The autocorrelations of the residuals are estimated using the AutoCorrelation class. Class LackOfFit is used to compute a portmanteau lack of fit test using 10 lags. The warning message from ARMA in the output can be ignored. (See Example 2 in ARMA for a full explanation of the warning message.)

import com.imsl.stat.*;

public class LackOfFitEx1 {

    public static void main(String args[]) throws Exception {
        int p = 2, q = 1, lagmax = 10, npfree = 4;
        double tolerance = 0.125;

        //  sunspot data for 1770 through 1869
        double[] x = {
            100.8, 81.6, 66.5, 34.8, 30.6, 7, 19.8, 92.5,
            154.4, 125.9, 84.8, 68.1, 38.5, 22.8, 10.2, 24.1, 82.9,
            132, 130.9, 118.1, 89.9, 66.6, 60, 46.9, 41, 21.3, 16,
            6.4, 4.1, 6.8, 14.5, 34, 45, 43.1, 47.5, 42.2, 28.1, 10.1,
            8.1, 2.5, 0, 1.4, 5, 12.2, 13.9, 35.4, 45.8, 41.1, 30.4,
            23.9, 15.7, 6.6, 4, 1.8, 8.5, 16.6, 36.3, 49.7, 62.5,
            67, 71, 47.8, 27.5, 8.5, 13.2, 56.9, 121.5, 138.3, 103.2,
            85.8, 63.2, 36.8, 24.2, 10.7, 15, 40.1, 61.5, 98.5,
            124.3, 95.9, 66.5, 64.5, 54.2, 39, 20.6, 6.7, 4.3, 22.8,
            54.8, 93.8, 95.7, 77.2, 59.1, 44, 47, 30.5, 16.3, 7.3,
            37.3, 73.9
        };

        // Get residuals from ARMA(2,1) for autocorrelation/lack of fit
        ARMA arma = new ARMA(p, q, x);
        arma.setMethod(ARMA.LEAST_SQUARES);
        arma.setConvergenceTolerance(tolerance);
        arma.compute();
        double[] residuals = arma.getResidual();

        // Get autocorrelations from residuals for lack of fit test
        AutoCorrelation ac = new AutoCorrelation(residuals, lagmax);
        double[] correlations = ac.getAutoCorrelations();

        // Get lack of fit test statistic and p-value
        double[] result
                = LackOfFit.compute(x.length, correlations, npfree, lagmax);

        // Print parameter estimates, test statistic, and p-value
        // NOTE: Test Statistic Q follows a Chi-squared dist.
        System.out.println("Lack of Fit Statistic,  Q = " + result[0]);
        System.out.println("P-value of Q = " + result[1]);
    }
}

Output

Lack of Fit Statistic,  Q = 14.60601806330646
P-value of Q = 0.0235525998617882
Link to Java source.