Non-Parametric Tests QuickStart Sample (VB.NET)
Illustrates non-parametric tests like the Wilcoxon-Mann-Whitney test and the Kruskal-Wallis test
in Visual Basic .NET.
C# code F# code Back
to QuickStart Samples
Imports System.Data
Imports Extreme.Mathematics
Imports Extreme.Statistics
Imports Extreme.Statistics.Tests
Namespace Extreme.Numerics.QuickStart.VB
' Demonstrates how to use non-parametric hypothesis tests
' like the Mann-Whitney (Wilcoxon) rank sum test and the
' Kruskal-Wallis test.
Module MeanTests
Sub Main()
'
' Mann-Whitney test
'
Console.WriteLine("Mann-Whitney Test")
Console.WriteLine()
' The Mann-Whitney test compares to samples to see if they were
' drawn from the same distribution.
' We use an example from McDonald, et.al. (1996), who compared
' the geographic variation in oyster DNA to the variation in
' proteins. A significant difference in the samples would suggest
' that natural selection played a role in the oyster diversification.
' There are two ways to create a test with multiple samples.
' The first is to put all the data in one variable,
' and use a second variable to group the data in the first.
Console.WriteLine("Using grouping variable:")
Dim values As New NumericalVariable(New Double() {
-0.005, 0.116, -0.006, 0.095, 0.053, 0.003,
-0.005, 0.016, 0.041, 0.016, 0.066,
0.163, 0.004, 0.049, 0.006, 0.058,
-0.002, 0.015, 0.044, 0.024 })
Dim groups As New CategoricalVariable(New Group() {
Group.Dna, Group.Dna, Group.Dna, Group.Dna, Group.Dna, Group.Dna,
Group.Protein, Group.Protein, Group.Protein, Group.Protein, Group.Protein,
Group.Protein, Group.Protein, Group.Protein, Group.Protein, Group.Protein,
Group.Protein, Group.Protein, Group.Protein, Group.Protein})
' With this data, we can create the test:
Dim mw As New MannWhitneyTest(values, groups)
' We can obtan the value of the test statistic through the Statistic property,
' and the corresponding P-value through the PValue property:
Console.WriteLine("Test statistic: {0:F4}", mw.Statistic)
Console.WriteLine("P-value: {0:F4}", mw.PValue)
' The significance level is the default value of 0.05:
Console.WriteLine("Significance level: {0:F2}", mw.SignificanceLevel)
' We can now print the test scores:
Console.WriteLine("Reject null hypothesis? {0}", IIf(mw.Reject(), "yes", "no"))
' We can get the same scores for the 0.01 significance level by explicitly
' passing the significance level as a parameter to these methods:
Console.WriteLine("Significance level: {0:F2}", 0.01)
Console.WriteLine("Reject null hypothesis? {0}", IIf(mw.Reject(), "yes", "no"))
Console.WriteLine()
' The second method is to put the data in different variables
Console.WriteLine("Using multiple variables:")
Dim dnaValues As New NumericalVariable(New Double() { _
-0.005, 0.116, -0.006, 0.095, 0.053, 0.003})
Dim proteinValues As New NumericalVariable(New Double() { _
-0.005, 0.016, 0.041, 0.016, 0.066, _
0.163, 0.004, 0.049, 0.006, 0.058, _
-0.002, 0.015, 0.044, 0.024})
' With this data, we can create the test:
mw = New MannWhitneyTest(dnaValues, proteinValues)
' We can obtan the value of the test statistic through the Statistic property,
' and the corresponding P-value through the PValue property:
Console.WriteLine("Test statistic: {0:F4}", mw.Statistic)
Console.WriteLine("P-value: {0:F4}", mw.PValue)
' The significance level is the default value of 0.05:
Console.WriteLine("Significance level: {0:F2}", mw.SignificanceLevel)
' We can now print the test scores:
Console.WriteLine("Reject null hypothesis? {0}", IIf(mw.Reject(), "yes", "no"))
'
' Kruskal-Wallis test
'
Console.WriteLine()
Console.WriteLine("Kruskal-Wallis Test")
Console.WriteLine()
' The Kruskal-Wallis test is a generalization of the Mann-Whitney test
' to more than 2 groups.
' The following example was taken from the NIST Engineering Statistics Handbook
' at http:'www.itl.nist.gov/div898/handbook/prc/section4/prc41.htm
' The data represents percentage quarterly growth
' in 4 investment funds:
Dim aValues As New NumericalVariable(New Double() {4.2, 4.6, 3.9, 4.0})
Dim bValues As New NumericalVariable(New Double() {3.3, 2.4, 2.6, 3.8, 2.8})
Dim cValues As New NumericalVariable(New Double() {1.9, 2.4, 2.1, 2.7, 1.8})
Dim dValues As New NumericalVariable(New Double() {3.5, 3.1, 3.7, 4.1, 4.4})
' We simply pass these variables to the constructor:
Dim kw As New KruskalWallisTest(aValues, bValues, cValues, dValues)
' We can obtan the value of the test statistic through the Statistic property,
' and the corresponding P-value through the PValue property:
Console.WriteLine("Test statistic: {0:F4}", kw.Statistic)
Console.WriteLine("P-value: {0:F4}", kw.PValue)
' The significance level is the default value of 0.05:
Console.WriteLine("Significance level: {0:F2}", kw.SignificanceLevel)
' We can now print the test scores:
Console.WriteLine("Reject null hypothesis? {0}", IIf(kw.Reject(), "yes", "no"))
'
' Runs test
'
Console.WriteLine()
Console.WriteLine("Runs Test")
Console.WriteLine()
' The runs test is a test of randomness.
' It compares the lengths of runs of the same value
' in a sample to what would be expected.
' In numerical data, it uses the runs of successively
' increasing or decreasing values
Dim genders As New CategoricalVariable(New Gender() {
Gender.Male, Gender.Male, Gender.Male, Gender.Female, Gender.Female,
Gender.Female, Gender.Male, Gender.Male, Gender.Male, Gender.Male,
Gender.Female, Gender.Female, Gender.Male, Gender.Male, Gender.Male,
Gender.Female, Gender.Female, Gender.Female, Gender.Female, Gender.Female,
Gender.Female, Gender.Female, Gender.Male, Gender.Male, Gender.Female,
Gender.Male, Gender.Male, Gender.Female, Gender.Female, Gender.Female,
Gender.Female})
Dim rt As New RunsTest(genders)
' We can obtan the value of the test statistic through the Statistic property,
' and the corresponding P-value through the PValue property:
Console.WriteLine("Test statistic: {0:F4}", rt.Statistic)
Console.WriteLine("P-value: {0:F4}", rt.PValue)
' The significance level is the default value of 0.05:
Console.WriteLine("Significance level: {0:F2}", rt.SignificanceLevel)
' We can now print the test scores:
Console.WriteLine("Reject null hypothesis? {0}", IIf(rt.Reject(), "yes", "no"))
Console.WriteLine("Press Enter key to continue.")
Console.ReadLine()
End Sub
Enum Group
Dna
Protein
End Enum
Enum Gender
Male
Female
End Enum
End Module
End Namespace