/* * ------------------------------------------------------------------------- * $Id: SampleSize.java,v 1.3 2004/05/26 19:06:49 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.Samples; import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; import java.text.DecimalFormat; import com.imsl.stat.*; import com.imsl.math.JMath; import com.imsl.chart.*; /** * * @author Gregory D. Rodd * @created October 16, 2002 */ public class SampleSize extends JFrameChart implements ActionListener, ChangeListener, MouseListener, MouseMotionListener { private Chart chart; private AxisXY axis; private Data successData, powerData, tolerData; private JLabel confLabel; private JSlider slider0, slider1, slider2; private JTextField alphaField, sigmaField, widthField, displayField; private double[] xrange, x, current; private double y[][]; static final private int numSample = 500; static private String title[] = {"Power/OC Curve", "Success Probability", "Tolerance"}; public SampleSize(boolean exitOnClose) { setTitle("Sample Size"); if (!exitOnClose) { // remove the WindowListener, installed by JFrameChart, that // exits the application when the window is closed. Object l[] = getListeners(java.awt.event.WindowListener.class); for (int k = 0; k < l.length; k++) { removeWindowListener((java.awt.event.WindowListener)l[k]); } } // Set default values. chart = getChart(); axis = new AxisXY(chart); axis.getAxisX().getAxisTitle().setTitle("Sample Size"); axis.getAxisY().getAxisTitle().setTitle("Probability"); axis.getAxisY().setWindow(0.0, 1.00); axis.getAxisX().setAutoscaleInput(AxisXY.AUTOSCALE_OFF); current = new double[2]; double minSampleSize = 4.0; double xrange[] = {minSampleSize,(double)(numSample+minSampleSize-1)}; x = new double[numSample]; for (int i = 0; i < numSample; i++) { x[i] = i + minSampleSize; }; y = new double[3][x.length]; // Add MouseListener and MouseMotionListener to chart panel. chart.getLegend().setPaint(true); chart.getLegend().setViewport(0.78,0.0,0.2,0.2); getPanel().addMouseListener(this); getPanel().addMouseMotionListener(this); // Create components in control panel. JButton reset = new JButton("Reset"); reset.addActionListener(this); confLabel = new JLabel("Confidence = 0.95", JLabel.LEFT); JLabel dummyLabel = new JLabel(" ", JLabel.CENTER); JLabel alphaLabel = new JLabel("Alpha", JLabel.CENTER); alphaField = new JTextField("0.05", 6); alphaField.setEditable(false); slider0 = new JSlider(200, 499, 450); slider0.setPaintTicks(true); slider0.setPaintLabels(false); slider0.setMajorTickSpacing(50); slider0.setMinorTickSpacing(10); slider0.setSnapToTicks(true); slider0.addChangeListener(this); JLabel deltaLabel = new JLabel("Delta|CI Width", JLabel.CENTER); widthField = new JTextField("1.00", 6); widthField.setEditable(false); slider1 = new JSlider(1, 500, 100); slider1.setPaintTicks(true); slider1.setPaintLabels(false); slider1.setMajorTickSpacing(80); slider1.setMinorTickSpacing(20); slider1.addChangeListener(this); JLabel sigmaLabel = new JLabel("Standard Deviation", JLabel.CENTER); sigmaField = new JTextField("1.00", 6); sigmaField.setEditable(false); slider2 = new JSlider(1, 500, 100); slider2.setPaintTicks(true); slider2.setPaintLabels(false); slider2.setMajorTickSpacing(80); slider2.setMinorTickSpacing(20); slider2.addChangeListener(this); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new java.awt.GridLayout(3,3,3,3)); // First Five Buttons buttonPanel.add(alphaLabel); buttonPanel.add(slider0); buttonPanel.add(alphaField); buttonPanel.add(confLabel); // Second Five Buttons buttonPanel.add(deltaLabel); buttonPanel.add(slider1); buttonPanel.add(widthField); buttonPanel.add(dummyLabel); // Third Five buttons buttonPanel.add(sigmaLabel); buttonPanel.add(slider2); buttonPanel.add(sigmaField); buttonPanel.add(reset); // Create the display panel JPanel displayPanel = new JPanel(); displayField = new JTextField("Current position: Sample Size = ?? Probability = ??", 53); displayField.setEditable(false); displayPanel.add(displayField); java.awt.Container cp = getContentPane(); cp.add(buttonPanel, java.awt.BorderLayout.NORTH); cp.add(displayPanel, java.awt.BorderLayout.SOUTH); drawGraph(); com.imsl.demo.gallery.Describe des = new com.imsl.demo.gallery.Describe(this, "/com/imsl/demo/Samples/Samples.html"); des.show(); java.awt.Dimension dess = des.getSize(); java.awt.Dimension ss = getToolkit().getScreenSize(); int h = Math.min(ss.width/2, ss.height-dess.height-32); int w = (int)(h/.8); setSize(w, h); setLocation(ss.width-dess.width, dess.height); setResizable(false); } // Get the description line. private String getDescription() { DecimalFormat nff = new DecimalFormat("0.000"); DecimalFormat nfi = new DecimalFormat("##0"); StringBuffer sb = new StringBuffer(); sb.append("Cursor At: Sample Size = " + nfi.format(Math.ceil(current[0]))+ " Probability = " + nff.format(current[1])); return sb.toString(); } private double CILength(double N, double alph, double gam, double sig) { return (JMath.sqrt(Cdf.inverseChi(gam, (N-1)))* 2.0 * sig * Cdf.inverseStudentsT((1.0 - (0.5 * alph) ),(N-1))) / JMath.sqrt(N * (N-1)); } private double tolerProb(double N, double alph, double Lenth, double sig) { double Tsq; Tsq = Cdf.inverseStudentsT( 1.0 - (0.5 * alph), N - 1); Tsq = Tsq * Tsq; return (Cdf.chi((N*(N-1.0)*Lenth*Lenth*0.25/(sig * sig * Tsq)),N-1)); } /* * Probability of meeting objective */ private double probSuccess(double N, double alph, double delt) { double A1 = 1.0 - (0.5 * alph); double T1 = Cdf.inverseStudentsT(A1,(N-1)); double DN = delt * delt * N * (N - 1.0); return Cdf.chi(DN / (T1 * T1), (N-1)); } private double powerR(double N, double alph, double delt, double sig) { double A1 = 1.0 - (0.5 * alph); double T1 = Cdf.inverseStudentsT(A1,(N-1)); double bigDel = JMath.sqrt(N) * (delt / sig); double pHi = tncCdf.cdf(T1, N-1.0, -bigDel); double pLo = tncCdf.cdf(-T1, N-1.0, -bigDel); // return pLo - pHi + 1.0; // 1 - Beta give the operating characteristic curve return (pHi - pLo); } // Draw the graph. private void drawGraph() { try { int num = slider0.getValue(); double alpha = (500.0 - (double)num) / 1000.0; int num1 = slider1.getValue(); double delta = (double)num1 / 100.0; int num2 = slider2.getValue(); double sigma = (double)num2 / 100.0; int flat = -1; // Compute the probabilities data. for (int k = 0; k < x.length; k++) { y[0][k] = powerR(x[k], alpha, delta, sigma); y[1][k] = probSuccess(x[k], alpha, delta/sigma); y[2][k] = tolerProb(x[k], alpha, delta, sigma); if (flat == -1 && y[0][k] < 0.0005) { flat = k; } } if (flat == -1) { axis.getAxisX().setWindow(0.00, x[x.length-1]); } else { axis.getAxisX().setWindow(0.00, x[flat]); } powerData = new Data(axis, x, y[0]); powerData.setTitle(title[0]); powerData.setDataType(Data.DATA_TYPE_LINE ); powerData.setLineColor("darkGreen"); successData = new Data(axis, x, y[1]); successData.setTitle(title[1]); successData.setDataType(Data.DATA_TYPE_LINE); successData.setLineColor("red"); tolerData = new Data(axis, x, y[2]); tolerData.setTitle(title[2]); tolerData.setDataType(Data.DATA_TYPE_LINE ); tolerData.setLineColor("blue"); } catch (Exception e) { } } // Get the information from the interface and redraw the chart. private void update() { if (successData != null) successData.remove(); if (powerData != null) powerData.remove(); if (tolerData != null) tolerData.remove(); drawGraph(); repaint(); } // Implement ActionListener for Reset Button public void actionPerformed(ActionEvent e) { confLabel.setText("Confidence = 0.95"); alphaField.setText("0.05"); widthField.setText("1.00"); sigmaField.setText("1.00"); slider0.setValue(450); slider1.setValue(100); slider2.setValue(100); } // Implement ChangeListener for Sliders public void stateChanged(ChangeEvent e) { // Derive conf from alpha slider value int num = slider0.getValue(); double alpha = (500.0 - (double)num) / 1000.0; double conf = 100.0 * (1.0 - alpha); int num1 = slider1.getValue(); double delta = (double)num1 / 100.0; int num2 = slider2.getValue(); double sigma = (double)num2 / 100.0; DecimalFormat nf = new DecimalFormat("0.00"); alphaField.setText(nf.format(alpha)); confLabel.setText("Confidence = "+nf.format(conf/100)); widthField.setText(nf.format(delta)); sigmaField.setText(nf.format(sigma)); update(); } // Implement MouseListener public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { setCursor(new java.awt.Cursor(java.awt.Cursor.CROSSHAIR_CURSOR)); } public void mouseExited(MouseEvent e) { setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { // Update display information. axis.mapDeviceToUser(e.getX(), e.getY(), current); displayField.setText(getDescription()); } public static void main(String args[]) { boolean exitOnClose = true; if (args.length > 0 && args[0].equals("-noexit")) { exitOnClose = false; } new SampleSize(exitOnClose).show(); } }