/*
* -------------------------------------------------------------------------
* $Id: CDPanel.java,v 1.3 2004/10/14 16:19:46 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 2004 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.
*--------------------------------------------------------------------------
*/
/*
* CohenDDemo
* Copyright (c), 2003, Gary H. McClelland
* Shows relationship between values of the effect size measure Cohen's d
* and the amount of overlap, depicted both visually and numerically, of the
* normal distributions. Most researchers are surprised by the amount of overlap
* in the normal distributions for commonly observed effect sizes.
*
* User alters the value of Cohen's d by dragging in the graph.
*/
/**
* @author Gary H. McClelland
* @created 5 October 2003
*/
package com.imsl.demo.stats;
import com.imsl.chart.*;
import com.imsl.stat.Cdf;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.DecimalFormat;
public class CDPanel extends JPanel implements MouseMotionListener {
private JFrame parentFrame;
private JPanelChart jPanelChart;
private JPanel jPanel;
private JLabel jLabel;
Chart chart;
AxisXY axis;
Data data, data2, line;
private DecimalFormat df2 = new DecimalFormat("0.00");
private DecimalFormat df1 = new DecimalFormat("0.0");
private double CohenD = 3;
private double[] current = new double[2];
private double[] lineX = {3,3};
private double[] lineY = {0,.04};
public CDPanel(javax.swing.JFrame parent) {
this.parentFrame = parent;
initComponents();
setPreferredSize(new java.awt.Dimension(parent.getSize().width, (int)(0.85*parent.getSize().height)));
jPanelChart.setPreferredSize(new java.awt.Dimension(parent.getSize().width, (int)(0.66*parent.getSize().height)));
jPanelChart.setChart(new Chart());
chart = jPanelChart.getChart();
axis = new AxisXY(chart);
chart.getChartTitle().setFontSize(16);
//prevent display of Y axis
axis.getAxisY().setTextColor(getBackground());
axis.getAxisY().setLineColor(getBackground());
//use integer format for displaying tick values
axis.getAxisX().setTextFormat("0");
axis.getAxisX().setFirstTick(0);
axis.getAxisX().setNumber(7);
axis.getAxisX().setDensity(2);
axis.getAxisX().setTickInterval(1);
axis.getAxisX().setFontSize(16);
axis.getAxisX().getAxisTitle().setTitle("d");
//define standard normal density function
ChartFunction norm = new ChartFunction() {
public double f(double z) {
return (1/Math.sqrt(2*Math.PI))*Math.pow(Math.E,-z*z/2);
}
};
data = new Data(axis, norm, -4, 6);
data.setDataType(Data.DATA_TYPE_FILL);
data.setFillColor(new Color(.25f, .25f, 1.f,.5f));
data.setFillOutlineColor(new Color(0.f, 0.f, 1.f, .5f));
drawGraph();
}
private void initComponents() {
jPanel = new JPanel();
setLayout(new BorderLayout());
jPanel.setLayout(new FlowLayout());
jLabel = new JLabel("Drag the bar to change the value of d");
jPanel.add(jLabel);
add(jPanel, BorderLayout.NORTH);
jPanelChart = new com.imsl.chart.JPanelChart();
add(jPanelChart, BorderLayout.CENTER);
jPanelChart.addMouseMotionListener(this);
}
//mouse drags determine the distance CohenD between the two distributions
public void mouseDragged(MouseEvent me) {
axis.mapDeviceToUser(me.getX(), me.getY(), current);
//don't allow negative values of CohenD
if(current[0] < 0)
CohenD = 0;
else if (current[0] > 5) //don't allow large values of CohenD
CohenD = 5;
else
CohenD = current[0];
drawGraph();
repaint();
}
public void mouseMoved(MouseEvent me) {}
private void drawGraph() {
//overlap formulas from Cohen (1969, p. 21)
double overlapP = Cdf.normal(CohenD/2);
double percentOverlap = 100*(1-(2*overlapP - 1) / overlapP);
chart.getChartTitle().setTitle("Cohen's d = "+ df2.format(CohenD)+" Overlap = "+
df1.format(percentOverlap)+"%");
if(data2 != null) data2.remove();
//define normal density function with standard deviation 1, offset by amount CohenD
ChartFunction norm2 = new ChartFunction() {
public double f(double z) {
return (1/Math.sqrt(2*Math.PI))*Math.pow(Math.E,-(z-CohenD)*(z-CohenD)/2);
}
};
data2 = new Data(axis, norm2, -4, 6);
data2.setDataType(Data.DATA_TYPE_FILL);
data2.setFillColor(new Color(1.f, .25f, .25f, .5f));
data2.setFillOutlineColor(new Color(1.f, 0.f, 0.f, .5f));
//create a marker to move along the axis to denote current value of CohenD
lineX[0] = CohenD;
lineX[1] = CohenD;
lineY[0] = 0;
lineY[1] = .1*(1/Math.sqrt(2*Math.PI));
line = new Data(axis,lineX, lineY);
line.setLineWidth(2.);
}
}