package statistics.simulators;
import distributions.*;
import java.util.*;
import java.text.*;
//import utilities.OutFile;
import weka.core.*;
import weka.filters.timeseries.*;
import fileIO.*;
import weka.filters.*;
public class SimulateAR extends DataSimulator{
public static String path="C:\\Research\\Data\\RunLengthExperiments\\";
public static double MIN_PARA_VALUE=-0.25;
public static double MAX_PARA_VALUE=0.25;
int minParas=1;
int maxParas=5;
public static void setMinMaxPara(double a, double b){MIN_PARA_VALUE=a; MAX_PARA_VALUE=b;}
//OUTPUT: the associated ARMA model
public SimulateAR(double[][] paras){
super(paras);
for(int i=0;i<nosClasses;i++)
models.add(new ArmaModel(paras[i]));
}
public void initialise(){
for(Model a:models)
((ArmaModel)a).randomise();
}
public double[] generate(int length, int modelNos){
double[] d=new double[length];
Model a=models.get(modelNos);
for(int i=0;i<length;i++)
d[i]=a.generate();
return d;
}
/** Static test methods **/
public static void testARMA(){
double[][] paras;
int nosParas=(int)(Math.random()*11.0);
DecimalFormat dc = new DecimalFormat("###.###");
paras=new double[2][nosParas];
for(int j=0;j<nosParas;j++)
paras[0][j]=-.95+1.8*Math.random();
System.out.print("\nInput coefficients");
for(int i=0;i<paras[0].length;i++)
System.out.print(dc.format(paras[0][i])+"\t");
System.out.print("\n");
paras[0]=findCoefficients(paras[0]);
for(int j=0;j<nosParas;j++)
paras[1][j]=paras[0][j]-0.1+0.2*Math.random();
int n=200;
double[] d1 = generate(paras[0],n);
double[] d2 = generate(paras[0],n);
for(int i=0;i<d1.length;i++)
System.out.print(dc.format(d1[i])+"\t");
double[] f1= ARMA.fitAR(d1);
double[] f2= ARMA.fitAR(d2);
System.out.println("\n\nModel length ="+nosParas);
System.out.print("\nACTUAL MODEL 1=");
for(int i=0;i<paras[0].length;i++)
System.out.print(dc.format(paras[0][i])+"\t");
System.out.print("\nFITTED MODEL 1=");
for(int i=0;i<f1.length;i++)
System.out.print(dc.format(f1[i])+"\t");
System.out.println("\n\nModel length ="+nosParas);
System.out.print("\nACTUAL MODEL 2=");
for(int i=0;i<paras[0].length;i++)
System.out.print(dc.format(paras[1][i])+"\t");
System.out.print("\nFITTED MODEL 2=");
for(int i=0;i<f2.length;i++)
System.out.print(dc.format(f2[i])+"\t");
}
public static void testFFT(String fileName){
//Debug code to test.
//Generate a model and series
// double[][] paras={{0.5},{0.7}};
int n=32;
int[] cases={1,1};
FFT ar = new FFT();
double[][] paras={{1.3532,0.4188,-1.2153,0.3091,0.1877,-0.0876,0.0075,0.0004},
{1.0524,0.9042,-1.2193,0.0312,0.263,-0.0567,-0.0019} };
Instances train=SimulateAR.generateARDataSet(paras,n,cases);
//Fit and compare paramaters without AIC
OutFile of = new OutFile(fileName);
try{
DecimalFormat dc=new DecimalFormat("###.####");
Instances arTrain=ar.process(train);
Instance in1=train.instance(0);
System.out.print("\nFitted Data Full >\t");
for(int i=0;i<in1.numAttributes()-1;i++){
of.writeString(in1.value(i)+",");
System.out.print(in1.value(i)+",");
}
of.writeString("\n");
Instance in2=arTrain.instance(0);
System.out.print("\nFitted FFT Full >\t");
for(int i=0;i<in2.numAttributes();i++){
System.out.print(dc.format(in2.value(i))+",");
of.writeString(dc.format(in2.value(i))+",");
}
ar.truncate(arTrain, n/4);
System.out.print("\nFitted FFT Truncated >\t");
of.writeString("\n");
for(int i=0;i<in2.numAttributes();i++){
System.out.print(dc.format(in2.value(i))+",");
of.writeString(dc.format(in2.value(i))+",");
}
}catch(Exception e){
System.out.println("Exception ="+e);
e.printStackTrace();
System.exit(0);
}
}
public static void testAIC(String fileName){
//Debug code to test.
//Generate a model and series
// double[][] paras={{0.5},{0.7}};
int n=100;
int[] cases={1,1};
ARMA ar = new ARMA();
ar.setUseAIC(false);
int maxLag=n/4;
ar.setMaxLag(maxLag);
double[][] paras={{1.3532,0.4188,-1.2153,0.3091,0.1877,-0.0876,0.0075,0.0004},
{1.0524,0.9042,-1.2193,0.0312,0.263,-0.0567,-0.0019} };
Instances train=SimulateAR.generateARDataSet(paras,n,cases);
//Fit and compare paramaters without AIC
try{
DecimalFormat dc=new DecimalFormat("###.####");
Instances arTrain=ar.process(train);
Instance in1=train.instance(0);
Instance in2=arTrain.instance(0);
System.out.print("Actual Model >\t\t");
for(int i=0;i<paras[0].length;i++)
System.out.print(dc.format(paras[0][i])+",");
System.out.print("\nFitted Model No AIC >\t");
for(int i=0;i<in2.numAttributes();i++)
System.out.print(dc.format(in2.value(i))+",");
ar.setUseAIC(true);
arTrain=ar.process(train);
in2=arTrain.instance(0);
System.out.print("\nFitted Model AIC >\t");
for(int i=0;i<in2.numAttributes();i++)
System.out.print(dc.format(in2.value(i))+",");
//Debug the stages
OutFile of = new OutFile(fileName);
for(int i=0;i<in1.numAttributes()-1;i++)
of.writeString(in1.value(i)+",");
double[] d=in1.toDoubleArray();
double[] d2=new double[d.length-1];
for(int i=0;i<d2.length;i++)
d2[i]=d[i];
System.out.println("Auto Corellations >");
double[] autos=ACF.fitAutoCorrelations(d2,maxLag);
of.writeString("\n");
of.writeString("\n");
for(int i=0;i<autos.length;i++){
of.writeString(autos[i]+",");
System.out.println(autos[i]+",");
}
of.writeString("\n");
of.writeString("\n");
double[][] partials=PACF.formPartials(autos);
for(int i=0;i<partials.length;i++){
for(int j=0;j<partials[i].length;j++)
of.writeString(partials[i][j]+",");
of.writeString("\n");
}
int best=ARMA.findBestAIC(autos,partials,maxLag,d2);
System.out.println(" Best Length = "+best);
}catch(Exception e){
System.out.println("Exception ="+e);
System.exit(0);
}
}
/** Static methods to bypass object creation
*
*/
/**
* This generates a set of 2-Class AR 1 data sets with fixed size and varying differences
* between the two class models. Needs calibrating for compelxity.
*
* Noise is always N(0,1).
*
* Range of values initially, model 1: 0.9
* model 2: 0.9 to -0.9 in 0.05 increments
*/
public static void generateAR1(int n, double[][] p, String fileName){
DecimalFormat df = new DecimalFormat("####.####");
int nosCases=200;
double diff=0.05;
String newline=System.getProperty("line.separator");
SimulateAR ar= new SimulateAR(p);
String arffHeader="@relation AR1Models\n";
for(int i=0;i<n;i++)
arffHeader+="@attribute T"+i+" real"+newline;
arffHeader+="@attribute targetClass {0,1}"+newline;
arffHeader+="@data"+newline+newline;
OutFile of =new OutFile(path+"AR1\\train"+fileName);
of.writeString(arffHeader);
for(int i=0;i<nosCases;i++){
ar.initialise();
double[] d=ar.generate(n,0);
for(int j=0;j<d.length;j++)
of.writeString(df.format(d[j])+",");
of.writeString("0"+newline);
d=ar.generate(n,1);
for(int j=0;j<d.length;j++)
of.writeString(df.format(d[j])+",");
of.writeString("1"+newline);
}
of =new OutFile(path+"AR1\\test"+fileName);
of.writeString(arffHeader);
for(int i=0;i<nosCases;i++){
ar.initialise();
double[] d=ar.generate(n,0);
for(int j=0;j<d.length;j++)
of.writeString(df.format(d[j])+",");
of.writeString("0\n");
d=ar.generate(n,1);
for(int j=0;j<d.length;j++)
of.writeString(df.format(d[j])+",");
of.writeString("1\n");
}
}
public static double[] findCoefficients(double[] c){
int n=c.length;
double[] a=new double[1];
double[] aNew=null;
a[0]=1;
// System.out.println(" n = "+n);
for(int j=1;j<=n;j++){
// System.out.println("Finding order "+j);
aNew=new double[j+1];
aNew[0]=1;
for(int i=1;i<j;i++)
aNew[i]=a[i]-a[i-1]*c[j-1];
aNew[j]=a[j-1]*-c[j-1];
a=aNew;
}
//Remove the constant term
double[] f=new double[n];
for(int i=0;i<n;i++)
f[i]=-a[i+1];
return f;
}
public static double[] generate(double[] paras,int n){
double[] d = new double[n];
ArmaModel ar=new ArmaModel(paras);
ar.randomise();
for(int i=0;i<n;i++)
d[i]=ar.generate();
return d;
}
/** generateStationaryParameters
* Generates a random AR model of degree between minParas and maxParas inclusive
*
* 1. Generate a number between minParas and maxParas
* 2. Generate random numbers between -0.9 and 0.9
* 3. find the stationary AR parameters associated with these parameters
*/
public static double[] generateStationaryParameters(int minP, int maxP){
double[] paras;
Random r = new Random();
r.setSeed((int)(1000*Math.random()));
int nosParas=(int)(minP+(int)(1+maxP*r.nextDouble()));
paras=new double[nosParas];
for(int j=0;j<nosParas;j++)
paras[j]=MIN_PARA_VALUE+(MAX_PARA_VALUE-MIN_PARA_VALUE)*r.nextDouble();
paras=SimulateAR.findCoefficients(paras);
return paras;
}
public static void armaTest(){
double[][] paras;
int nosParas=(int)(Math.random()*11.0);
DecimalFormat dc = new DecimalFormat("###.###");
paras=new double[2][nosParas];
for(int j=0;j<nosParas;j++)
paras[0][j]=-.95+1.8*Math.random();
System.out.print("\nInput coefficients");
for(int i=0;i<paras[0].length;i++)
System.out.print(dc.format(paras[0][i])+"\t");
System.out.print("\n");
paras[0]=findCoefficients(paras[0]);
for(int j=0;j<nosParas;j++)
paras[1][j]=paras[0][j]-0.1+0.2*Math.random();
int n=200;
double[] d1 = generate(paras[0],n);
double[] d2 = generate(paras[0],n);
for(int i=0;i<d1.length;i++)
System.out.print(dc.format(d1[i])+"\t");
double[] f1= ARMA.fitAR(d1);
double[] f2= ARMA.fitAR(d2);
System.out.println("\n\nModel length ="+nosParas);
System.out.print("\nACTUAL MODEL 1=");
for(int i=0;i<paras[0].length;i++)
System.out.print(dc.format(paras[0][i])+"\t");
System.out.print("\nFITTED MODEL 1=");
for(int i=0;i<f1.length;i++)
System.out.print(dc.format(f1[i])+"\t");
System.out.println("\n\nModel length ="+nosParas);
System.out.print("\nACTUAL MODEL 2=");
for(int i=0;i<paras[0].length;i++)
System.out.print(dc.format(paras[1][i])+"\t");
System.out.print("\nFITTED MODEL 2=");
for(int i=0;i<f2.length;i++)
System.out.print(dc.format(f2[i])+"\t");
}
public static Instances generateOffByOneARDataSet(int p, int seriesLength, int[] nosCases, boolean normalize){
double[][] paras=new double[nosCases.length][];
paras[0]=generateStationaryParameters(p,p);
for(int i=1;i<paras.length;i++){
paras[i]=generateStationaryParameters(p+i,p+i);
}
Instances d=generateARDataSet(paras,seriesLength,nosCases);
if(normalize){
try{
NormalizeCase norm=new NormalizeCase();
norm.setNormType(NormalizeCase.NormType.STD_NORMAL);
d=norm.process(d);
}catch(Exception e){
System.out.println("Exception e"+e);
e.printStackTrace();
System.exit(0);
}
}
return d;
}
public static Instances generateARDataSet(int minParas, int maxParas, int seriesLength, int[] nosCases, boolean normalize){
double[][] paras=new double[nosCases.length][];
for(int i=0;i<paras.length;i++)
paras[i]=generateStationaryParameters(minParas,maxParas);
Instances d=generateARDataSet(paras,seriesLength,nosCases);
if(normalize){
try{
NormalizeCase norm=new NormalizeCase();
norm.setNormType(NormalizeCase.NormType.STD_NORMAL);
d=norm.process(d);
}catch(Exception e){
System.out.println("Exception e"+e);
e.printStackTrace();
System.exit(0);
}
}
return d;
}
public static Instances generateARDataSet(int minParas, int maxParas, int seriesLength, int[] nosCases){
return generateARDataSet(minParas,maxParas,seriesLength,nosCases,false);
}
public static Instances generateARDataSet(double[][] p, int seriesLength, int[] nosCases){
SimulateAR ar=new SimulateAR(p);
Instances data;
FastVector atts=new FastVector();
int totalCases=nosCases[0];
for(int i=1;i<nosCases.length;i++)
totalCases+=nosCases[i];
for(int i=1;i<=seriesLength;i++){
atts.addElement(new Attribute("t"+i));
}
FastVector fv=new FastVector();
for(int i=0;i<ar.nosClasses;i++)
fv.addElement(""+i);
atts.addElement(new Attribute("Target",fv));
data = new Instances("AR",atts,totalCases);
double[] d;
for(int i=0;i<ar.nosClasses;i++){
for(int j=0;j<nosCases[i];j++){
//Generate the series
ar.initialise();
d=ar.generate(seriesLength,i);
//Add to an instance
Instance in= new DenseInstance(data.numAttributes());
for(int k=0;k<d.length;k++)
in.setValue(k,d[k]);
//Add to all instances
data.add(in);
in=data.lastInstance();
in.setValue(d.length,""+i);
}
}
data.setClassIndex(seriesLength);
return data;
}
public static void main(String[] args){
// Instances all=SimulateAR.generateARDataSet(minParas,maxParas,seriesLength,nosCasesPerClass,true);
System.out.println("Running SimulateAR test harness");
ArmaModel.setGlobalVariance(1);
int[] cases={2,2};
Instances d=generateARDataSet(1,1,200,cases,false);
ArmaModel.setGlobalVariance(10);
Instances d2=generateARDataSet(1,1,200,cases,false);
OutFile of=new OutFile("C:\\\\Research\\Results\\AR1_1.csv");
OutFile of2=new OutFile("C:\\\\Research\\Results\\AR1_10.csv");
of.writeString(d.toString());
of2.writeString(d2.toString());
try{
NormalizeCase norm=new NormalizeCase();
norm.setNormType(NormalizeCase.NormType.STD_NORMAL);
d=norm.process(d);
}catch(Exception e){
System.out.println("Exception e"+e);
e.printStackTrace();
System.exit(0);
}
}
@Override
public String getParameters() {
throw new UnsupportedOperationException("Not supported yet.");
}
}