/*
* -------------------------------------------------------------------------
* $Id: ForecastPopulation.java,v 1.2 2003/09/12 20:43:22 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
*
* This software is confidential information which is proprietary to
* and a trade secret of Visual Numerics, Inc. Use, duplication or
* disclosure is subject to the terms of an appropriate license
* agreement.
*
* VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
* NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
* ITS DERIVATIVES.
*--------------------------------------------------------------------------
*/
package com.imsl.demo.Population;
import com.imsl.chart.*;
import com.imsl.stat.ARMA;
//import java.awt.Color;
/**
*
* @author pate
* @created October 23, 2002
*/
public class ForecastPopulation extends javax.swing.JDialog {
private Data data, forecastData, upperLimit, lowerLimit;
private JPanelChart jPanelChart;
public ForecastPopulation(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
java.awt.Dimension parentSize = parent.getSize();
java.awt.Point parentLoc = parent.getLocationOnScreen();
parentLoc.x += parentSize.width/2.5;
parentLoc.y += parentSize.height/2.5;
setLocation(parentLoc.x, parentLoc.y);
jPanelChart = new JPanelChart();
int h = (int)((parentSize.height/2)*1.25);
int w = (int)(h/0.8);
jPanelChart.setPreferredSize(new java.awt.Dimension(w,h));
getContentPane().add(jPanelChart);
pack();
}
void draw(int gender, int category, double y[]) {
// text used for chart labels
String genderText = ((gender == 0) ? "Male" : "Female");
String xlabels[] = {"1950", "1960", "1970", "1980", "1990", "2000", "2010"};
String categories[] = {"0-4", "5-9", "10-14", "15-19", "20-24", "25-29",
"30-34", "35-39", "40-44", "45-49", "50-54", "55-59", "60-64", "65-69",
"70-74", "75-79", "80+"};
// create a new XY chart
Chart chart = jPanelChart.getChart();
AxisXY axis = new AxisXY(chart);
// Setup Chart Title
chart.getChartTitle().setTitle("Projected " + genderText + " Population, " + categories[category]);
chart.getChartTitle().setFontStyle(1);
// Setup Y axis
axis.getAxisY().getAxisTitle().setTitle("Population, Millions");
axis.getAxisY().getAxisTitle().setFontStyle(1);
axis.getAxisY().setWindow(0,15);
// Setup X Axis
axis.getAxisX().setWindow(0,60);
axis.getAxisX().getAxisLabel().setLabels(xlabels);
axis.getAxisX().getAxisTitle().setTitle("Year");
axis.getAxisX().getAxisTitle().setFontStyle(1);
axis.setAutoscaleInput(Axis.AUTOSCALE_OFF);
// make local copy of population data
double[] z = new double[y.length];
for (int i = 0; i < y.length; i++) {
z[i] = y[i];
}
// existing population data, 1950 to 2000
Data data1 = new Data(axis, z);
data1.setDataType(Data.DATA_TYPE_LINE);
data1.setLineColor("blue");
try {
final int numYears = 7; //project out 7 years
// new arma forcast object
ARMA arma = new ARMA(2, 1, z);
arma.setRelativeError(0.5);
arma.setMaxIterations(0);
arma.compute();
arma.setConfidence(0.50);
arma.setBackwardOrigin(3);
double[][] forecast = arma.forecast(numYears);
double[] tmp = new double[numYears];
double[] x1 = new double[numYears];
// get the forecast data.
for (int i = 0; i < numYears; i++) {
tmp[i] = forecast[i][3];
x1[i] = 50 + i;
}
// Draw upper and lower limits.
double[] dev = arma.getDeviations();
double[] ulimit = new double[dev.length];
double[] llimit = new double[dev.length];
double min = 3.0;
// look for a new minumum reference point
for (int i = 0; i < dev.length; i++) {
ulimit[i] = tmp[i] + dev[i];
llimit[i] = tmp[i] - dev[i];
if (min > llimit[i]) min = llimit[i];
}
min = min - 1;
// set the upper limit of the forecast
upperLimit = new Data(axis, x1, ulimit);
upperLimit.setTitle("Upper Limit");
upperLimit.setDataType(Data.DATA_TYPE_LINE | Data.DATA_TYPE_FILL);
upperLimit.setReference(min);
upperLimit.setFillColor("yellow");
upperLimit.setFillOutlineColor("yellow");
// set the lower limit of the forecast
lowerLimit = new Data(axis, x1, llimit);
lowerLimit.setTitle("Lower Limit");
lowerLimit.setDataType(Data.DATA_TYPE_LINE | Data.DATA_TYPE_FILL);
lowerLimit.setReference(min);
lowerLimit.setFillColor("white");
lowerLimit.setFillOutlineColor("white");
} catch (com.imsl.IMSLException e) {
// all the ARMA exceptions extend IMSLException, so catch that
System.out.println(e.getMessage());
e.printStackTrace();
}
}
private void initComponents() {
setTitle("Population Forcast");
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
closeDialog(evt);
}
});
pack();
}
private void closeDialog(java.awt.event.WindowEvent evt) {
setVisible(false);
dispose();
}
}