[TOC]
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using CenterSpace.NMath.Core;
using CenterSpace.NMath.Stats;
namespace CenterSpace.NMath.Stats.Examples.CSharp
{
/// <summary>
/// A .NET example in C# showing how to use class OneWayRanova to perform a simple one-way
/// ANOVA with repeated measures.
/// </summary>
/// <remarks>This example was constructed with a Visual Studio wizard. The
/// code generated by the wizard is contained in the region labled
/// "Windows Form Designer generated code". The example code is contained
/// in the constructor for the class OneWayRanovaExample.
/// </remarks>
public class OneWayRanovaExample : System.Windows.Forms.Form
{
private System.Windows.Forms.DataGrid dataGrid1;
private System.Windows.Forms.Label label1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
/// <summary>
/// Constructor for the example. All relevent example code is contained
/// in this constructor.
/// </summary>
public OneWayRanovaExample()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
// Construct a DataFrame contianing the data to be analyzed. Each
// column of the DataFrame represents a treatment and each row
// represents a subject.
DataFrame data = new DataFrame();
data.RowKeyHeader = "Dog Number";
data.AddColumn(new DFNumericColumn("Normal"));
data.AddColumn(new DFNumericColumn("Stomach"));
data.AddColumn(new DFNumericColumn("Eating"));
int dog = 1;
data.AddRow(dog++, 104, 91, 22);
data.AddRow(dog++, 106, 94, 14);
data.AddRow(dog++, 111, 105, 14);
data.AddRow(dog++, 114, 106, 15);
data.AddRow(dog++, 117, 120, 18);
data.AddRow(dog++, 139, 111, 8);
// Now, use the DataFrame to construct a OneWayRanova instance.
OneWayRanova ranova = new OneWayRanova(data);
// This example will just display a traditional RANOVA table
// in a System.Windows.Forms.DataGrid object. The next few lines of
// code are formatting the table contents so it will look nice.
// First retrieve the table to display. Note that the class
// OneWayRanovaTable is a subclass of DataFrame.
OneWayRanovaTable ranovaTable = ranova.RanovaTable;
// Next, let's set the precision to three decimal places. Note that this
// does not actually change the numbers in the RANOVA table. It just
// determines how many decimal places will be displayed when the table is
// converted to a string.
for (int i = 1; i < ranovaTable.Cols; ++i)
{
((DFNumericColumn)ranovaTable[i]).NumericFormat = "F3";
}
// Next convert the RANOVA table into a string. This will have the effect of
// formatting all the numbers so that they have three digits after the decimal
// point and all Double.NaN values will be represented as a "." (some rows
// in the RANOVA table that do not have F statistic values or F statistic
// p-values associated with them. The cells that correspond to these rows
// and the F and P columns contain Double.NaN values).
DataFrame displayFrame = new DataFrame(ranovaTable.ToString(), true, true, "\t", false);
// Notice that in the previous line we passed a value of false for the
// parse parameter to the DataFrame constructor (the last parameter).
// This will give us a DataFrame object in which all the column types
// are strings. This lets me format the data easily before I turn it
// over to the DataGrid.
// If the p-value for the F statistic is too small, it will be rounded
// to zero when we set the precision to three decimal places. It doesn't
// look good to have a p-value of 0 in our display, so let's display
// something a bit more sensible like display "< 0.001".
// First, use the FStatisticPValue property on the OneWayRanovaTable
// class to determine if the p-value is too small.
if (ranovaTable.FStatisticPValue < 0.001)
{
// Use the IndexOfKey() and IndexOfColumn() methods of the DataFrame
// to determine the row and column indicies of the p-value in our
// display table (the display table, being a copy of the oringinal
// RANOVA table, has the same rows and columns as the original).
int rowIndex = ranovaTable.IndexOfKey(OneWayRanovaTable.TreatmentRowKey);
int colIndex = ranovaTable.IndexOfColumn(OneWayRanovaTable.PvalueColName);
// Note how we used the static variables OneWayRanovaTable.TreatmentRowKey
// and OneWayRanovaTable.PvalueColName to get the names of the row
// and column that contain the p-value.
// Finally, let's change the string from 0 to something more sensible.
displayFrame[rowIndex, colIndex] = "< 0.001";
}
// We are now ready to display the RANOVA table in the DataGrid. We use
// the DataFrames ToDataTable() method to create an ADO DataTable which
// we use to set the grids data source.
this.dataGrid1.DataSource = displayFrame.ToDataTable();
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.dataGrid1 = new System.Windows.Forms.DataGrid();
this.label1 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();
this.SuspendLayout();
//
// dataGrid1
//
this.dataGrid1.AllowSorting = false;
this.dataGrid1.BackgroundColor = System.Drawing.Color.White;
this.dataGrid1.CaptionVisible = false;
this.dataGrid1.DataMember = "";
this.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid1.Location = new System.Drawing.Point(32, 64);
this.dataGrid1.Name = "dataGrid1";
this.dataGrid1.PreferredColumnWidth = 110;
this.dataGrid1.ReadOnly = true;
this.dataGrid1.RowHeadersVisible = false;
this.dataGrid1.Size = new System.Drawing.Size(664, 96);
this.dataGrid1.TabIndex = 0;
//
// label1
//
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.label1.Location = new System.Drawing.Point(216, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(280, 23);
this.label1.TabIndex = 1;
this.label1.Text = "One Way Ranova Example";
//
// OneWayRanovaExample
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(728, 190);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.label1,
this.dataGrid1});
this.Name = "OneWayRanovaExample";
this.Text = "OneWayRanovaExample";
((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new OneWayRanovaExample());
}
}
}
[TOC]