package tests; /* To Test whether population median */ import distributions.*; import java.util.*; import fileIO.*; public class OneSampleTests extends Tests{ public static DataPoint[] absRankedData; public static void signTest(TestResults T, DataPoint[] ranked) /* Defined by J. Arbuthnott in 1710! s1=nos greater than \phi_0 s2=nos less than \phi_0 Ties are shared equally PRE: ASSUMES Data pre sorted Note this does not require sorted data, so its a bit wasteful using the loadData if signTest is being performed. BUT given it is presorted, we can speed up the calculation with a binary search It sets the distribution of the test statistic */ { T.testName="signTest"; double s1=0,s2=0; DataPoint h0 = new DataPoint(T.h0,0,0); int adjN=ranked.length; int pos=Arrays.binarySearch(ranked,h0); /* From API index of the search key, if it is contained in the list; otherwise, (-(insertion point) - 1). The insertion point is defined as the point at which the key would be inserted into the list: the index of the first element greater than the key, or list.size(), if all elements in the list are less than the # specified key. Note that this guarantees that the return value will be >= 0 if and only if the key is found. Tested with file signTestExample.txt */ if(pos>=0) //Value present, need to adjust for duplicates { int dupCount=1; int left=pos-1; int right=pos+1; while(left>=0 && ranked[pos].equals(ranked[left])) { // System.out.println("Left ="+ranked[left].d); left--; dupCount++; } while(right< ranked.length && ranked[pos].equals(ranked[right])) { right++; dupCount++; } if(dupCount%2==1&& adjN<50) //If using a binomial want a whole number! { adjN--; dupCount-=1; } System.out.println("Duplicate count ="+dupCount); s1=left+1+dupCount/2.0; s2=(ranked.length-right)+dupCount/2.0; System.out.println("left = "+left+"\t right = "+right+"\t lower ="+s1+"\thigher = "+s2); } else { //Number smaller s1=-pos-1; //Number larger: THIS MAY BE A BUG IF adjN is adjusted s2=adjN-s2; System.out.println("pos = "+pos+"\tlower ="+s1+"\thigher = "+s2); } if(T.type==-1) T.testStat=s2; else if(T.type==1) T.testStat=s1; else if(T.type==0) T.testStat=(s1<s2)?s1:s2; //Test distribution, use binomial approximation if N>50 if(adjN<50) T.dist = new BinomialDistribution(adjN,0.5); else T.dist = new NormalDistribution(adjN/2.0,Math.sqrt(adjN)/2.0); T.findCriticalValue(); T.findPValue(); } public static void wilcoxonSignRank(TestResults T, DataPoint[] ranked) /* 1. Find the differences from hypothesised median 2. Rank by absolute values 3. Sum ranks for positive Need to rerank the data */ { T.testName="wilcoxonSignRank"; absRankedData=new DataPoint[ranked.length]; double diff; int adjN=0; for(int j=0;j<ranked.length;j++) { // System.out.println(" Data = "+ranked[j].d+"\t in Pos "+ranked[j].position+" data ="+dataByLevel[0][ranked[j].position].d); diff=(ranked[j].d>T.h0)?ranked[j].d-T.h0:T.h0-ranked[j].d; if(diff>0) { absRankedData[adjN]=new DataPoint(diff,0,j); adjN++; } } if(adjN<ranked.length) { DataPoint[] temp = new DataPoint[adjN]; for(int i=0;i<adjN;i++) temp[i]=absRankedData[i]; absRankedData=temp; } Arrays.sort(absRankedData); for(int i=0;i<absRankedData.length;i++) absRankedData[i].rank=(i+1); adjustRanksForDuplicates(absRankedData); double rankSumUnder=0,rankSumOver=0; for(int j=0;j<adjN;j++) { diff=ranked[absRankedData[j].position].d-T.h0; // System.out.println(" Rank = "+ j +" Pos ="+absRankedData[j].position+" Val ="+ranked[absRankedData[j].position].d+" diff ="+diff+" Abs Val ="+absRankedData[j].d); if(diff<0) { // System.out.println(" Rank = "+ absRankedData[j].rank +" Value ="+ranked[absRankedData[j].position].d+"\t diff ="+diff); rankSumUnder+=absRankedData[j].rank; } else rankSumOver+=absRankedData[j].rank; } if(T.type==1) T.testStat=rankSumUnder; else if(T.type==-1) T.testStat=rankSumOver; else T.testStat=(rankSumOver<rankSumUnder)?rankSumUnder:rankSumOver; //Havent used the exact distribution, but it is possible for //small N, see page 74 of Neave T.dist = new NormalDistribution(adjN*(adjN+1)/4.0,Math.sqrt(adjN*(adjN+1)*(2*adjN+1)/24.0)); T.findCriticalValue(); T.findPValue(); } public static void HMMTest(){ TestResults t = new TestResults("SignTest"); OutFile f = new OutFile("hmmRes1.csv"); loadData("hmmTests1.csv"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); // f.writeString(t+"\n"); wilcoxonSignRank(t,rankedData); System.out.println(t); f.writeString(t+"\n"); /* loadData("hmmTests2.csv"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); // f.writeString(t+"\n"); wilcoxonSignRank(t,rankedData); System.out.println(t); f.writeString(t+"\n"); loadData("hmmTests3.csv"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); // f.writeString(t+"\n"); wilcoxonSignRank(t,rankedData); System.out.println(t); f.writeString(t+"\n"); */ } public static void polyTest(){ TestResults t = new TestResults("SignTest"); OutFile f = new OutFile("polyRes1.csv"); loadData("PolynomialsTests1.csv"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); // f.writeString(t+"\n"); wilcoxonSignRank(t,rankedData); System.out.println(t); f.writeString(t+"\n"); loadData("PolynomialsTests2.csv"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); // f.writeString(t+"\n"); wilcoxonSignRank(t,rankedData); System.out.println(t); f.writeString(t+"\n"); loadData("PolynomialsTests3.csv"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); // f.writeString(t+"\n"); wilcoxonSignRank(t,rankedData); System.out.println(t); f.writeString(t+"\n"); } public static void AgentTest(){ TestResults t = new TestResults("SignTest"); OutFile f = new OutFile("ZipAgentsFPSBRes1.csv"); loadData("ZipAgentsFPSB.csv"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); wilcoxonSignRank(t,rankedData); System.out.println(t); f.writeString(t+"\n"); } public static void main(String[] args) { TestResults t = new TestResults("SignTest"); // HMMTest(); AgentTest(); /* loadData("oneSampleTest1.txt"); t.type=1; t.h0=0; System.out.println("N = "+N); signTest(t,rankedData); System.out.println(t); wilcoxonSignRank(t,rankedData); System.out.println(t); //Sign Test */ } }