/** * PI * Forms prediction intervals */ PFont fontA; int level = 95; int samplesize = 30; boolean oversampleleftarrow = false; boolean oversamplerightarrow = false; boolean overlevelleftarrow = false; boolean overlevelrightarrow = false; boolean getSample = false; String meanstr = ""; String sdstr = ""; String PIstr = ""; String predstr = ""; int[] x1 = new int[1000]; int[] x2 = new int[1000]; int[] xpred = new int[1000]; float[] avvec = new float[1000]; float[] sdvec = new float[1000]; float[] lvec = new float[1000]; float[] rvec = new float[1000]; float[] predvec = new float[1000]; int[] out = new int[1000]; float[][] ttable = { {1.173864, 1.170346, 1.167743, 1.165740, 1.164151, 1.162859, 1.161788, 1.160886, 1.160116, 1.159451, 1.158871, 1.158360, 1.157907, 1.157502}, {1.311434, 1.306952, 1.303639, 1.301090, 1.299069, 1.297426, 1.296066, 1.294920, 1.293942, 1.293097, 1.292360, 1.291711, 1.291136, 1.290623}, {1.478705, 1.472810, 1.468458, 1.465112, 1.462460, 1.460306, 1.458522, 1.457020, 1.455738, 1.454632, 1.453666, 1.452817, 1.452064, 1.451392}, {1.699127, 1.690924, 1.684875, 1.680230, 1.676551, 1.673565, 1.671093, 1.669013, 1.667239, 1.665707, 1.664371, 1.663197, 1.662155, 1.661226}, {2.045230, 2.032245, 2.022691, 2.015368, 2.009575, 2.004879, 2.000995, 1.997730, 1.994945, 1.992543, 1.990450, 1.988610, 1.986979, 1.985523}}; int count = 0; void setup() { size(700,450); smooth(); fontA = loadFont("ArialMT-48.vlw"); textFont(fontA, 30); SampleMe(); } void draw() { float yupper, ylower; background(200); strokeWeight(3); fill(0); text("Confidence Level",23,345); String tempstr = "0."+level; text(tempstr,290,345); triangle(270,333,280,343,280,323); triangle(368,333,358,343,358,323); text("Sample Size",420,345); text(str(samplesize),620,345); triangle(600,333,610,343,610,323); triangle(672,333,662,343,662,323); fill(255); rect(290,375,120,45,10); fill(0); text("Sample",300,408); ellipseMode(CENTER); fill(0,0,0); for (int i = 0; i < 50; i++) { stroke(0); line(x1[i],52+5*i,x2[i],52+5*i); if(out[i] == 0) { stroke(0); } else { stroke(255,0,0); } ellipse(xpred[i],52+5*i,4,4); } stroke(0); textFont(fontA, 24); text("Count: " + count, 575,30); int mx = mouseX; int my = mouseY; meanstr = ""; sdstr = ""; PIstr = ""; predstr = ""; boolean bubble = false; for (int i = 0; i < 50; i++) { yupper = 52+5*i-1; ylower = 52+5*i+1; if (mx >= x1[i] && mx <= x2[i] && my >= yupper && my <= ylower) { meanstr = nf(avvec[i],1,3); sdstr = nf(sdvec[i],1,3); PIstr = "("+nf(lvec[i],1,3)+","+nf(rvec[i],1,3)+")"; predstr = nf(predvec[i],1,3); if (mx <= 495) { fill(255); rect(mx+10,ylower+10,190,90,10); textFont(fontA,18); fill(0); text("Sample Mean: " + meanstr,mx+20, ylower+30); text("SD: " + sdstr,mx+20, ylower+50); text("PI: " + PIstr,mx+20, ylower+70); text("New obs: " + predstr,mx+20,ylower+90); } else { fill(255); rect(mx-10-190,ylower+10,190,90,10); textFont(fontA, 18); fill(0); text("Sample Mean: " + meanstr,mx-190, ylower+30); text("SD: " + sdstr,mx-190, ylower+50); text("PI: " + PIstr,mx-190, ylower+70); text("New obs: " + predstr,mx-190,ylower+90); } bubble = true; break; } } if (bubble == false) { for (int i = 0; i < 50; i++) { yupper = 52+5*i-2; ylower = 52+5*i+2; if (mx >= (xpred[i]-2) && mx <= (xpred[i]+2) && my >= yupper && my <= ylower) { meanstr = nf(avvec[i],1,3); sdstr = nf(sdvec[i],1,3); PIstr = "("+nf(lvec[i],1,3)+","+nf(rvec[i],1,3)+")"; predstr = nf(predvec[i],1,3); if (mx <= 495) { fill(255); rect(mx+10,ylower+10,190,90,10); textFont(fontA,18); fill(0); text("Sample Mean: " + meanstr,mx+20, ylower+30); text("SD: " + sdstr,mx+20, ylower+50); text("PI: " + PIstr,mx+20, ylower+70); text("New obs: " + predstr,mx+20,ylower+90); } else { fill(255); rect(mx-10-190,ylower+10,190,90,10); textFont(fontA, 18); fill(0); text("Sample Mean: " + meanstr,mx-190, ylower+30); text("SD: " + sdstr,mx-190, ylower+50); text("PI: " + PIstr,mx-190, ylower+70); text("New obs: " + predstr,mx-190,ylower+90); } break; } } } textFont(fontA, 30); } void mousePressed() { oversampleleftarrow = false; oversamplerightarrow = false; overlevelleftarrow = false; overlevelrightarrow = false; getSample = false; if (mouseX >= 270 && mouseX <= 280 && mouseY >= 323 && mouseY <= 343) overlevelleftarrow = true; if (mouseX >= 358 && mouseX <= 368 && mouseY >= 323 && mouseY <= 343) overlevelrightarrow = true; if (mouseX >= 600 && mouseX <= 610 && mouseY >= 323 && mouseY <= 343) oversampleleftarrow = true; if (mouseX >= 662 && mouseX <= 672 && mouseY >= 323 && mouseY <= 343) oversamplerightarrow = true; if (mouseX >= 290 && mouseX <= 410 && mouseY >= 375 && mouseY <= 420) getSample=true; if (overlevelleftarrow) level -= 5; if (overlevelrightarrow) level += 5; if (level > 95) level = 95; if (level < 75) level = 75; if (oversampleleftarrow) samplesize -= 5; if (oversamplerightarrow) samplesize += 5; if (samplesize < 30) samplesize = 30; if (samplesize > 95) samplesize = 95; if (getSample) { SampleMe(); } } void SampleMe() { float[] avec= new float[samplesize]; float[] temppred = new float[1]; float sum, sd, var,av,tempx,tempx2; int tx, ty; count = 0; for (int j = 0; j < 1000; j++) { getNormal(samplesize,avec); getNormal(1,temppred); predvec[j] = temppred[0]; sum = 0; for (int i = 0; i < samplesize; i++) sum += avec[i]; av = sum/samplesize; avvec[j] = av; sum = 0; for (int i = 0; i < samplesize; i++) sum += pow(avec[i]-av,2); var = sum/(samplesize - 1); sd = sqrt(var); sdvec[j] = sd; tx = (level-75)/5; ty = (samplesize-30)/5; tempx = av - sd*sqrt(1.0+1.0/float(samplesize))*ttable[tx][ty]; tempx2 = av + sd*sqrt(1.0+1.0/float(samplesize))*ttable[tx][ty]; lvec[j] = tempx; rvec[j] = tempx2; x1[j] = int((tempx-7)*700/7+50); x2[j] = int((tempx2-7)*700/7+50); xpred[j] = int((temppred[0]-7)*700/7+50); if (tempx < temppred[0] && tempx2 > temppred[0]) { count++; out[j] = 0; } else { out[j] = 1; } } } void getNormal(int number, float[] zvec) { float uone ; float utwo ; for (int i = 0; i < number; i++) { uone = random(0,1); utwo = random(0,1); zvec[i] = sqrt(-2*log(uone))*cos(2*PI*utwo)*1+10; } }