From 524edac627e73b66cd3788b57e8718064fc76468 Mon Sep 17 00:00:00 2001 From: omaus Date: Wed, 26 Jan 2022 14:19:29 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Add=20X=C2=B2=20test=20contingency=20table?= =?UTF-8?q?=20:sparkles:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/FSharp.Stats/Testing/ChiSquareTest.fs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/FSharp.Stats/Testing/ChiSquareTest.fs b/src/FSharp.Stats/Testing/ChiSquareTest.fs index 8af7e262..187e9fa3 100644 --- a/src/FSharp.Stats/Testing/ChiSquareTest.fs +++ b/src/FSharp.Stats/Testing/ChiSquareTest.fs @@ -36,7 +36,7 @@ module ChiSquareTest = open System open FSharp.Stats - /// Computes the Chi-Square test + /// Computes the Chi-Square test. /// n data points -> degrees of freedom = n - 1 let compute (degreesOfFreedom:int) (expected:seq) (observed:seq) = //let chechParams = @@ -53,4 +53,16 @@ module ChiSquareTest = TestStatistics.createChiSquare chi2 (float degreesOfFreedom) - + // Adapted from https://www.ling.upenn.edu/~clight/chisquared.htm + /// Computes a Chi-Square test for a 2 × 2 contingency table. Aka Cochran-Mantel-Haenszel (CMH) test, ger. Chi-Quadrat-Vierfeldertest. + let contingencyTable2x2Test trait1GroupA trait2GroupA trait1GroupB trait2GroupB = + let columnTrait1 = trait1GroupA + trait1GroupB + let columnTrait2 = trait2GroupA + trait2GroupB + let rowGroupA = trait1GroupA + trait2GroupA + let rowGroupB = trait1GroupB + trait2GroupB + let total = columnTrait1 + columnTrait2 + let expFreqA1 = (rowGroupA * columnTrait1) / total + let expFreqA2 = (rowGroupA * columnTrait2) / total + let expFreqB1 = (rowGroupB * columnTrait1) / total + let expFreqB2 = (rowGroupB * columnTrait2) / total + compute 1 [expFreqA1; expFreqA2; expFreqB1; expFreqB2] [trait1GroupA; trait2GroupA; trait1GroupB; trait2GroupB] From b18b47dcc3c84d74cfe1eb4992872c95044eb0a0 Mon Sep 17 00:00:00 2001 From: omaus Date: Wed, 26 Jan 2022 15:00:23 +0100 Subject: [PATCH 2/2] =?UTF-8?q?Add=20unit=20test=20for=20X=C2=B2=20conting?= =?UTF-8?q?ency=20table=20:white=5Fcheck=5Fmark:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/FSharp.Stats.Tests/Testing.fs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/FSharp.Stats.Tests/Testing.fs b/tests/FSharp.Stats.Tests/Testing.fs index a3d475b9..5106f5f5 100644 --- a/tests/FSharp.Stats.Tests/Testing.fs +++ b/tests/FSharp.Stats.Tests/Testing.fs @@ -256,6 +256,21 @@ let chiSquaredTests = let observed = [315.;101.;80.;32.;50.] let df = expected.Length - 1 ChiSquareTest.compute df expected observed + + // taken from: https://de.wikipedia.org/wiki/Chi-Quadrat-Test#Beispiele_und_Anwendungen + let testCaseContingency1 = + let trait1GroupA = 25. + let trait2GroupA = 25. + let trait1GroupB = 30. + let trait2GroupB = 20. + ChiSquareTest.contingencyTable2x2Test trait1GroupA trait2GroupA trait1GroupB trait2GroupB + + let testCaseContingency2 = + let trait1GroupA = 250. + let trait2GroupA = 250. + let trait1GroupB = 300. + let trait2GroupB = 200. + ChiSquareTest.contingencyTable2x2Test trait1GroupA trait2GroupA trait1GroupB trait2GroupB testList "Testing.ChiSquaredTest" [ testCase "compute" <| fun () -> @@ -263,7 +278,13 @@ let chiSquaredTests = Expect.isTrue (0.4700 = Math.Round(testCase1.Statistic,4)) "statistic should be equal." Expect.isTrue (0.000638 = Math.Round(testCase2.PValueRight,6)) "pValue should be equal." Expect.isTrue (19.461 = Math.Round(testCase2.Statistic,3)) "statistic should be equal." - + + testCase "contingencyTable" <| fun () -> + Expect.floatClose Accuracy.veryHigh (round 4 testCaseContingency1.PValueRight) 0.3149 "pValue is not about equal" + Expect.floatClose Accuracy.veryHigh (round 3 testCaseContingency1.Statistic) 1.01 "teststatistic is not about equal" + + Expect.floatClose Accuracy.veryHigh (round 4 testCaseContingency2.PValueRight) 0.0015 "pValue is not about equal" + Expect.floatClose Accuracy.veryHigh (round 2 testCaseContingency2.Statistic) 10.1 "teststatistic is not about equal" ] []