Statistical testing

Binder Notebook

Summary: this tutorial explains how to perform various statistical tests with FSharp.Stats.

Table of contents

FSharp.Stats provides hypothesis tests for different applications. A hypothesis test is a statistical test that is used to determine whether there is enough evidence in a sample of data to infer that a certain condition is true for the entire population. A hypothesis test examines two opposing hypotheses about a population: the null hypothesis and the alternative hypothesis.

Test Statistics

T-Test

By using a t test a difference of means can be evaluated. There are different kinds of t test designs implemented in FSharp.Stats.

  1. One sample t test:

    • Is the population mean equal to the value of H0?
    • e.g. “Is my grade different from the distribution mean?”
  2. Two sample t test with equal variances:

    • Prerequisite: equal variances
    • Is the mean of Population A equal to the mean of Population B?
    • 2.1 unpaired t test:

      • e.g.: Does the cell size differ between wildtype and mutant?
    • 2.2 paired t test:

      • e.g.: Does the medication influence the blood pressure? Measurement of the same persons before and after medication.
  3. Two sample t test with unequal variances

    • Welch test (unpaired)

Case 1: One sample t test

open FSharp.Stats
open FSharp.Stats.Testing

let sampleA = vector [|4.5; 5.1; 4.8; 4.4; 5.0|]

// calculates a one sample t test with a given sample and the fixed value the sample should be compared with
let oneSampleTTest = TTest.oneSample sampleA 5.

(*
    The test returns no significant p value:
    oneSampleTTest.PValue = 0.1533
*)

Case 2: Two sample t test with equal variances (unpaired)

A standard two sample t test expects the samples to be taken from populations with equal standard deviations. Violations of this requirement result in an inflated false positive rate.

let sample1 = vector [|4.9;5.0;6.7;4.8;5.2|]
let sample2 = vector [|3.9;4.9;3.8;4.5;4.5|]

let twoSampleTTest = TTest.twoSample true sample1 sample2

(*
    The test returns a significant p value:
    twoSampleTTest.PValue = 0.0396
*)

Case 3: Two sample t test with equal variances (paired)

A paired t-test is used to compare two population means where you have two samples in which observations in one sample can be paired with observations in the other sample. Examples of where this might occur are:

  • Before-and-after observations on the same subjects (e.g. students’ diagnostic test results before and after a particular module or course).
  • A comparison of two different methods of measurement or two different treatments where the measurements/treatments are applied to the same subjects (e.g. blood pressure measurements using a stethoscope and a dynamap).
let sampleP1 = vector [18.;21.;16.;22.;19.;24.;17.;21.;23.;18.;14.;16.;16.;19.;18.;20.;12.;22.;15.;17.;]
let sampleP2 = vector [22.;25.;17.;24.;16.;29.;20.;23.;19.;20.;15.;15.;18.;26.;18.;24.;18.;25.;19.;16.;]

let paired = TTest.twoSamplePaired sampleP1 sampleP2

(*
    The test returns a significant p value:
    paired.PValue = 0.00439
*)

Case 4: Two sample t test with unequal variances (Welch test)

If you are unsure about the nature of the underlying population, you may ask if the theoretical population distributions you want to compare do have the same standard deviations.

If not the welch test can serve as an appropriate hypothesis test for mean differences.

let sampleW1 = vector [0.8;0.9;1.0;1.1;1.2]
let sampleW2 = vector [0.8;1.1;1.3;1.5;2.0]

let welch = TTest.twoSample false sampleW1 sampleW2

(*
    The test returns a not significant p value:
    welch.PValue = 0.1725626595
*)

Anova

let dataOneWay =
    [|
    [|0.28551035; 0.338524035; 0.088313218; 0.205930807; 0.363240102;|];
    [|0.52173913; 0.763358779; 0.32546786; 0.425305688; 0.378071834; |];
    [|0.989119683; 1.192718142; 0.788288288; 0.549176236; 0.544588155;|];
    [|1.26705653; 1.625320787; 1.266108976; 1.154187629; 1.268498943; 1.069518717;|];
    |]

let contrastMatrix = 
    [| 
    [|1.0;-1.0;0.0;0.0;|]
    [|1.0;0.0;-1.0;0.0;|]
    [|1.0;0.0;0.0;-1.0;|]
    [|0.0;1.0;-1.0;0.0;|]
    [|0.0;1.0;0.0;-1.0;|]
    [|0.0;0.0;1.0;-1.0;|]
    |]

let oneWayResult = Anova.oneWayAnova dataOneWay
{ Factor = { DegreesOfFreedom = 3.0
             MeanSquares = 1.081456009
             Significance = 9.257958872e-07
             Source = BetweenGroups
             Statistic = 27.59425833
             SumOfSquares = 3.244368027 }
  Error = { DegreesOfFreedom = 17.0
            MeanSquares = 0.03919134177
            Significance = nan
            Source = WithinGroups
            Statistic = nan
            SumOfSquares = 0.6662528101 }
  Total = { DegreesOfFreedom = 20.0
            MeanSquares = 0.1955310419
            Significance = nan
            Source = Total
            Statistic = nan
            SumOfSquares = 3.910620837 } }
(*
anovaResult.Factor.Statistic = 27.594
The factor statistic indicates how much more variability there is between the the samples 
than within the samples.
anovaResult.Factor.PValue = 9.257958872e-07
A strong significant p value in the factor field indicates that one or more means differ from each other
*)
// http://astatsa.com/OneWay_Anova_with_TukeyHSD/
// https://www.wessa.net/rwasp_Two%20Factor%20ANOVA.wasp

let data =
    [
        (0.28, 'A', 'M');
        (0.95, 'A', 'M');
        (0.96, 'A', 'M');
        (0.97, 'A', 'M');
        (0.40, 'A', 'M');
        (0.18, 'A', 'M');
        (0.12, 'A', 'M');
        (0.62, 'A', 'M');
        (1.81, 'A', 'F');
        (1.51, 'A', 'F');
        (1.41, 'A', 'F');
        (1.39, 'A', 'F');
        (1.20, 'A', 'F');
        (1.55, 'A', 'F');
        (1.48, 'A', 'F');
        (1.25, 'A', 'F');
        (0.95, 'B', 'M');
        (1.33, 'B', 'M');
        (0.92, 'B', 'M');
        (0.85, 'B', 'M');
        (1.06, 'B', 'M');
        (0.69, 'B', 'M');
        (0.70, 'B', 'M');
        (0.79, 'B', 'M');
        (2.93, 'B', 'F');
        (3.24, 'B', 'F');
        (3.42, 'B', 'F');
        (2.79, 'B', 'F');
        (2.54, 'B', 'F');
        (3.28, 'B', 'F');
        (2.80, 'B', 'F');
        (3.40, 'B', 'F');
    ]
    //f1
    |> Seq.groupBy (fun (v,f1,f2) -> f1)
    //f2
    |> Seq.map (fun (k,vls) -> 
        vls 
        |> Seq.groupBy (fun (v,f1,f2) -> f2)
        |> Seq.map (fun (k,vls') -> vls' |> Seq.map (fun (v,f1,f2) -> v) |> Seq.toArray)
        |> Seq.toArray
        ) 
    |> Seq.toArray
    

Anova.twoWayANOVA Anova.TwoWayAnovaModel.Mixed data

// http://statweb.stanford.edu/~susan/courses/s141/exanova.pdf
// http://scistatcalc.blogspot.de/2013/11/two-factor-anova-test-calculator.html#

let data' =
    [|
      // super
        // cold super
      [|[|4.;5.;6.;5.;|];
        // warm super
        [|7.;9.;8.;12.;|];
        // hot super
        [|10.;12.;11.;9.; |]|];
      // best 
        // cold best
      [|[|6.;6.;4.;4.;|];
        // warm best
        [|13.;15.;12.;12.;|];
        // hot best
        [|12.;13.;10.;13.;|]|]
    |]

Anova.twoWayANOVA Anova.TwoWayAnovaModel.Mixed data'

F-Test

The F-test is a method to determine if the variances of two samples are homogeneous. Also, ANOVA (analysis of variance) is based on the F-test and is used for the comparison of more than two samples. Knowing if your variances are equal (H0 is true) helps to decide which test should be performed next. To determine if your variances are in fact equal you can perform a F-test.

Prerequisites:

  • population distributions are normally distributed
  • samples are independent

Possible further tests:

  • two sample t-test with equal variances
  • two sample t-test with unequal variances (Welch-test)
  • ...

Note that there is no information about the direction of variance difference (e.g. Zimmermann 2004). In this implemented test the larger variance is always the numerator, therefore the comparison to Fdf1,df2,1-(alpha/2) is used for a two sided test.

Important note: The effectiveness of a preliminary test of variances is discussed. The F-test is extremely sensitive to normality-violations, and even if the samples follow a normal distribution, it often does not detect situations where a t-test should be avoided.

References:

  • Jürgen Bortz & Christof Schuster, Statistik für Human- und Sozialwissenschaftler (2010) Chapter 8.6
  • Markowski, Conditions for the Effectiveness of a Preliminary Test of Variance (1990)
  • Shlomo S. Sawilowsky, The Probable Difference Between Two Means When σ12≠σ22 (2002)
  • Ronald Ley, F curves have two tails but the F test is a one-tailed two-tailed test (1979) + Reviewer comments
  • Donald W. Zimmermann, A note on preliminary tests of equality of variances (2004)

F-Test from data:

let sampleFA = vector [|5.0; 6.0; 5.8; 5.7|] 
let sampleFB = vector [|3.5; 3.7; 4.0; 3.3; 3.6|]

// comparison of sample variances 
let fTestFromData = FTest.testVariances sampleFA sampleFB
(* 
    { Statistic = 2.823383085
    DegreesOfFreedom1 = 3.0
    DegreesOfFreedom2 = 4.0
    PValue = 0.1708599931 }
    Using a significance level of 0.05 the sample variances do differ significantly.

*F-Test from given parameters:*
*)

// sample properties are given as (variance,degree of freedom) 
let sampleF1 = (0.1, 15.)
let sampleF2 = (0.05, 7.)

// comparison of sample variances 
let fTestFromParameters = FTest.testVariancesFromVarAndDof sampleF1 sampleF2
{ Statistic = 2.0
  DegreesOfFreedom1 = 15.0
  DegreesOfFreedom2 = 7.0
  PValue = 0.17963663
  PValueTwoTailed = 0.35927326 }

Using a significance level of 0.05 the sample variances do differ significantly.

H-Test

The H-test is also known as Kruskal-Wallis one-way analysis-of-variance-by-ranks and is the non-parametric equivalent of one-way ANOVA. It is a non-parametric test for comparing the means of more than two independent samples (equal or different sample size), and therefore is an extension of Wilcoxon-Mann-Whitney two sample test. Testing with H test gives information whether the samples are from the same distribution.

A benefit of the H-test is that it does not require normal distribution of the samples. The downside is that there is no information which samples are different from each other, or how many differences occur. For further investigation a post hoc test is recommended.

The distribution of the H-test statistic is approximated by chi-square distribution with degrees of freedom = sample count - 1.

The implemented H-test is testing for duplicate values in the data. Duplicates lead to ties in the ranking, and are corrected by using a correction factor.

Prerequisites:

  • random and independent samples
  • observations are from populations with same shape of distribution
  • nominal scale, ordinal scale, ratio scale or interval scale data

References:

  • E. Ostertagová, Methodology and Application of the Kruskal-Wallis Test (2014)
  • Y. Chan, RP Walmsley, Learning and understanding the Kruskal-Wallis one-way analysis-of-variance-by-ranks test for differences among three or more independent groups (1997)
let groupA = [44.;44.;54.;32.;21.;28.]
let groupB = [70.;77.;48.;64.;71.;75.]
let groupC = [80.;76.;34.;80.;73.;80.] 
let samples = [groupA;groupB;groupC]

// calculation of the H-test 
let hResult = HTest.createHTest samples 
{ Statistic = 9.781466113
  DegreesOfFreedom = 2.0
  PValueLeft = 0.9924840891
  PValueRight = 0.007515910866
  PValue = 0.01503182173 }

PValueRight is significant at a alpha level of 0.05

A suitable post hoc test for H-tests is Dunn's test.

Friedman-Test

The Friedman-Test is a nonparametric method to detect differences in more than two related samples. It's used for dependent samples, e.g. with measurements of different treatments or at different timepoints. The test can be performed even on small sample sizes. One benefit of the implemented version in FSharp.Stats is that a correction factor is applied if there are any ties in the measurements.

Requirements:

  • sample sizes must be identical
  • repeated measurements
  • no need for normal distribution of the samples
  • samples must be at least ordinal scaled

The idea of the test is to rank each value in every ID (as seen below). The test statistic approximately follows a chi-squared distribution (dof = k-1). The recommended Post-Hoc-Test is Wilcoxon-signed-rank-test or a Bonferroni-correction. Example taken from Universitaet Zuerich - Methodenberatung Friedman-Test ( https://www.methodenberatung.uzh.ch/de/datenanalyse_spss/unterschiede/zentral/friedman.html ) with a modification for 3 ties in one ID.

References:

  • Viv Bewick, Liz Cheek & Jonathan Ball, Statistics review 10: Further nonparametric methods (2004)
  • Salvador García, Alberto Fernández, Julián Luengo, Francisco Herrera, Advanced nonparametric tests for multiple comparisons in the design of experiments in computational intelligence and data mining: Experimental analysis of power (2010)

ID | pre | month 1| month 2| month 3| month 4 1 275 273 288 273 273
2 292 283 284 285 329
3 281 274 298 270 252
4 284 275 271 272 258
5 285 294 307 278 275 6 283 279 301 276 279 7 290 265 298 291 295 8 294 277 295 290 271 9 300 304 293 279 271 10 284 297 284 292 284

Ranking the results - average if values appear multiple times in one ID

ID   |  pre   | month 1| month 2| month 3| month 4
1       4       2        5        2        2      
2       4       1        2        3        5
3       4       3        5        2        1          
4       5       4        2        3        1          
5       3       4        5        2        1
6       4       2.5      5        1        2.5
7       2       1        5        3        4
8       4       2        5        3        1
9       4       5        3        2        1
10      2       5        2        4        2     
rank-sums
        36      29.5     39       25       20.5
// The data have to be entered in this format: 

let A = [|275.;273.;288.;273.;273.|]
let B = [|292.;283.;284.;285.;329.|]
let C = [|281.;274.;298.;270.;252.|]
let D = [|284.;275.;271.;272.;258.|]
let E = [|285.;294.;307.;278.;275.|]
let F = [|283.;279.;301.;276.;279.|]
let G = [|290.;265.;298.;291.;295.|]
let H = [|294.;277.;295.;290.;271.|]
let I = [|300.;304.;293.;279.;271.|]
let J = [|284.;297.;284.;292.;284.|]

// add everything in one sequence
let samplesMany =  [|A;B;C;D;E;F;G;H;I;J|]

// create the test 
let friedmanResult = FriedmanTest.createFriedmanTest samplesMany 

// results 
{ Statistic = 9.738219895
  DegreesOfFreedom = 4.0
  PValueLeft = 0.9549240734
  PValueRight = 0.04507592663
  PValue = 0.09015185326 }

Wilcoxon-Test

The Wilcoxon signed-rank test is a non-parametric alternative to the paired t-test. The test is used to determine if two samples stem from a similar distributed population. It calculates the differences between sets of pairs and ranks them to analyze if they are statistically significantly different. If at least one of the assumptions for the t-test is not given the Wilcoxon signed-rank test can be used. This implemented test uses a normal distribution approximation (validated against SciPy with mode="approx"). It also includes automatic tie correction as well as optional continuity correction.

Cases where Wilcoxon signed-rank test can be used:

  • Compare 2 dependent samples
  • Repeated measurements on single samples
  • Matched samples

Assumptions for the test:

  • Data are paired and from the same population
  • Each pair is chosen randomly and independently
  • At least interval scaled data
let before = [78.;24.;64.;45.;64.;52.;30.;50.;64.;50.;78.;22.;84.;40.;90.;72.]
let after  = [78.;24.;62.;48.;68.;56.;25.;44.;56.;40.;68.;36.;68.;20.;58.;32.]

// create the test
// Results with continuity correction: 
let wilcoxonResult = WilcoxonTest.createWilcoxonTest before after true 
// results 
{ Statistic = 2.072645167
  PValueLeft = 0.019102592
  PValueRight = 0.980897408
  PValueTwoTailed = 0.038205184 }
// Results without continuity correction: 
let wilcoxonResult2 = WilcoxonTest.createWilcoxonTest before after false 
// results 
{ Statistic = 2.104048882
  PValueLeft = 0.01768702961
  PValueRight = 0.9823129704
  PValueTwoTailed = 0.03537405922 }
//alternatively you can use just the differences 
let differences = [0.;0.;2.;-3.;-4.;-4.;5.;6.;8.;10.;10.;-14.;16.;20.;32.;40.]
// results from differences
let wilcoxonResult3 = WilcoxonTest.createWilcoxonTestFromDifferences differences true 
// results 
{ Statistic = 2.072645167
  PValueLeft = 0.019102592
  PValueRight = 0.980897408
  PValueTwoTailed = 0.038205184 }

References:

  • Concepts & Applications of Inferential Statistics - VassarStats
  • Wilcoxon Test, Adam Hayes, 13 April 2020, accessed 20.09.2021

Chi-Squared Test

WIP

Bartlett

WIP

PostHoc

ANOVA provides the user with a global statement if samples differ from each other. It does not provide detailed information regarding differences of the single samples.

If the H0 hypothesis is neglected (so significant differences are assumed), a post hoc test (multiple comparison test) allows the pairwise comparison of the individual groups.

Reference: What is the proper way to apply the multiple comparison test?, Sangseok Lee and Dong Kyu Lee, 2018

Fisher's LSD

The simplest method is Fisher's least significant difference (Fisher's LSD). It calculates Student's t tests for all pairwise comparisons. But instead of estimating the variance for each sample separately it takes all groups into account. Violations of the homogeneity of variances reduce the test power. Since no correction for multiple comparisons is performed, the resulting p values must be corrected (for example with Benjamini-Hochberg method).

Important: Fishers LSD is dependent to a significant ANOVA (ANOVA-protected post-hoc test).

open PostHoc

let lsd = Testing.PostHoc.fishersLSD contrastMatrix dataOneWay

// For multi comparison correction, the p values are adjusted by the Benjamini-Hochberg approach
let (index,pValue,pValueAdj) = 
    lsd
    |> Testing.MultipleTesting.benjaminiHochbergFDRBy (fun x -> x,x.Significance)
    |> List.sortBy (fun (x,_) -> x.Index)
    |> List.map (fun (x,pValAdj) -> x.Index, x.Significance, pValAdj)
    |> List.unzip3

let lsdCorrected =
    let header = ["<b>Contrast index</b>";"<b>p Value</b>";"<b>p Value adj</b>"]
    let rows = 
        [
            [sprintf "%i" index.[0];sprintf "%.6f" pValue.[0];sprintf "%.6f" pValueAdj.[0];]    
            [sprintf "%i" index.[1];sprintf "%.6f" pValue.[1];sprintf "%.6f" pValueAdj.[1];]    
            [sprintf "%i" index.[2];sprintf "%.6f" pValue.[2];sprintf "%.6f" pValueAdj.[2];]       
            [sprintf "%i" index.[3];sprintf "%.6f" pValue.[3];sprintf "%.6f" pValueAdj.[3];]       
            [sprintf "%i" index.[4];sprintf "%.6f" pValue.[4];sprintf "%.6f" pValueAdj.[4];]    
            [sprintf "%i" index.[5];sprintf "%.6f" pValue.[5];sprintf "%.6f" pValueAdj.[5];]
        ]
    
    Chart.Table(
        header, 
        rows,
        HeaderFillColor = Color.fromHex "#45546a",
        CellsFillColor = Color.fromColors [Color.fromHex "#deebf7";Color.fromString "lightgrey"]
        )

Hays

Testing.PostHoc.hays contrastMatrix dataOneWay 


//let m1 = Seq.mean dataOneWay.[0]
//let m2 = Seq.mean dataOneWay.[1]

//let s1 = Seq.sum dataOneWay.[0]
//let s2 = Seq.sum dataOneWay.[1]
//let s3 = Seq.sum dataOneWay.[2]


//let d = (m1-m2)**2.0
//d / (3.926003843 * (1./5. + 1./5.))

// http://www.statisticslectures.com/topics/posthoconewayanova/
let dmg = 
    [|
     [|9.;8.;7.;8.;8.;9.;8.;|];
     [|7.;6.;6.;7.;8.;7.;6.;|];
     [|4.;3.;2.;3.;4.;3.;2.;|] ; 
    |]

let contrastMatrixDmg = 
    [| 
     [|1.0;-1.0;0.0;|] ; 
     [|1.0;0.0;-1.0;|] ; 
     [|0.0;1.0;-1.0;|]   
    |]


Testing.PostHoc.hays contrastMatrixDmg dmg 

Anova.oneWayAnova dmg

Tukey HSD

Tukeys honestly significant difference (HSD) can be used to inspect a significant ANOVA result for underlying causes.

Important note: Various discussions question the application of Tukeys HSD only to significant ANOVA results (Anova-protected post-hoc test), since Tukeys HSD already controls for multiple testing. Inform yourself prior to using an post hoc test appropriate to your experimental design. Fishers LSD however is dependent to a significant ANOVA.

Using this post hoc test you can determine which of the means differ significantly from each other. In the classis Tukeys HSD approach, the population variances are pooled for a more robust estimation (especially with small sample sizes). If the population variances differ, Tukeys HSD is not appropriate.

The implemented Tukey-Kramer-Method can be applied on unequal sample sizes and estimates the variance based on the means to compare. The Tukey-Kramer method can be used as stand-alone method for comparing multiple means.

A comparison of ANOVA and Tukey-Kramer-HSD with simulations for the robustness of normality-violations of the data can be found in:

Robustness of the ANOVA and Tukey-Kramer Statistical Tests, Wade C. Driscoll, Computers ind. Engng Vol 31, No. 1/2, pp. 265 - 268, 1996

Multiple-to-one comparisons can alternatively performed with Dunnet's test, which was designed for performing k-1 tests, while Tukeys HSD performs k((k-1)/2) tests.

Task: It should be tested if one or more means of samples taken from different mutants differ from each other.

// Example values from: https://brownmath.com/stat/anova1.htm
let hsdExample = 
    [|
        [|64.; 72.; 68.; 77.; 56.; 95.;|] // sample of mutant/drug/factor 1 
        [|78.; 91.; 97.; 82.; 85.; 77.;|] // sample of mutant/drug/factor 2 
        [|75.; 93.; 78.; 71.; 63.; 76.;|] // sample of mutant/drug/factor 3 
        [|55.; 66.; 49.; 64.; 70.; 68.;|] // sample of mutant/drug/factor 4    
    |]

let anovaResult = Anova.oneWayAnova hsdExample

(*
    anovaResult.Factor.Statistic = 5.41
    The factor statistic indicates how much more variability there is between the the samples 
    than within the samples.
    anovaResult.Factor.PValue = 0.0069
    A significant p value in the factor field indicates that one or more means differ from each other
*)

For tukey HSD calculations you need a contrast matrix, that defines the groups you want to compare for more detailed information.

Every contrast has as many entries as there are groups (samples). The groups, that should be compared are labelled with -1 or 1 respectively.

// In this contrast matrix every possible scenario is covered.
let contrastMatrixHSD = 
    [| 
    [|1.;-1.; 0.; 0.;|] // sample 1 is compared to sample 2
    [|1.; 0.;-1.; 0.;|] // sample 1 is compared to sample 3
    [|1.; 0.; 0.;-1.;|] 
    [|0.; 1.;-1.; 0.;|]
    [|0.; 1.; 0.;-1.;|]
    [|0.; 0.; 1.;-1.;|] // sample 3 is compared to sample 4
    |]

let hsdResult = tukeyHSD contrastMatrixHSD hsdExample 
"index	meanDiff	qStatistic	pValue
    0	13.000000	3.170103	0.146193
    1	4.000000	0.975416	0.899806
    2	10.000000	2.438541	0.337815
    3	9.000000	2.194687	0.427072
    4	23.000000	5.608644	0.003906
    5	14.000000	3.413957	0.106557"
(*
    For every generated contrast an output p value is calculated.
    e.g.
    hsdResult.[0].Significance = 0.0364
    hsdResult.[1].Significance = 0.4983 
    hsdResult.[2].Significance = 0.1001
    hsdResult.[3].Significance = 0.1364
    hsdResult.[4].Significance = 0.0008
    hsdResult.[5].Significance = 0.0255
*)

//TTest.twoSample true (vector hsdExample.[0]) (vector hsdExample.[1])
//TTest.twoSample true (vector hsdExample.[0]) (vector hsdExample.[2])
//TTest.twoSample true (vector hsdExample.[0]) (vector hsdExample.[3])
//TTest.twoSample true (vector hsdExample.[1]) (vector hsdExample.[2])
//TTest.twoSample true (vector hsdExample.[1]) (vector hsdExample.[3])
//TTest.twoSample true (vector hsdExample.[2]) (vector hsdExample.[3])

Dunnett's (t) test

When there is one control group which should be compared with all treatment-groups, Tukeys HSD would lead to an explosion of comparisons if the number of conditions increases. If just the comparison of each treatment to an control is required you can use Dunnett's test. It is a multiple-to-one post hoc test for homoscedastic samples with equal variance that has a higher power than Tukey's HSD since fewer comparisons have to be performed, and therefore the Confidence limits are wider than necessary. "ANOVA is not a necessary part of the multiple comparisons procedure" (Dunnett, 1964).

Note: Dunnett's test is designed for equal group sizes and will only provide approximate values when group sizes differ (Dunnett 1955).

Reference:

  • A Multiple Comparison Procedure for Comparing Several Treatments with a Control; CW Dunnett; Journal of the American Statistical Association; Dec. 1955
  • New Tables for Multiple Comparisons with a Control; CW Dunnett; Biometrics; Sep. 1964
let dunnetExample = 
    [|
        [|1.84;2.49;1.50;2.42;|]
        [|2.43;1.85;2.42;2.73;|]
        [|3.95;3.67;3.23;2.31;|]
        [|3.21;3.20;2.32;3.30;|]
        //only gives aproximate results when group sizes are unequal
        [|3.21;3.13;2.32;3.30;3.20;2.42;|]
    |]

//first sample serves as control
let dunnetContrastMatrix = 
    [|                
        [|-1.;1.;0.;0.;0.|]
        [|-1.;0.;1.;0.;0.|]
        [|-1.;0.;0.;1.;0.|]
        [|-1.;0.;0.;0.;1.|]
    |]

let dunnettResult = 
    PostHoc.dunnetts dunnetContrastMatrix dunnetExample Tables.dunnettsTwoSided095
[|{ Index = 0
    L = 0.295
    DegreesOfFreedom = 4.0
    MeanSquares = 0.2483897059
    Significance = false
    Statistic = 0.8370862672
    SumOfSquares = 4.222625
    CriticalValue = 2.691 }; { Index = 1
                               L = 1.2275
                               DegreesOfFreedom = 4.0
                               MeanSquares = 0.2483897059
                               Significance = true
                               Statistic = 3.483130146
                               SumOfSquares = 4.222625
                               CriticalValue = 2.691 };
  { Index = 2
    L = 0.945
    DegreesOfFreedom = 4.0
    MeanSquares = 0.2483897059
    Significance = false
    Statistic = 2.681513636
    SumOfSquares = 4.222625
    CriticalValue = 2.691 }; { Index = 3
                               L = 0.8675
                               DegreesOfFreedom = 4.0
                               MeanSquares = 0.2483897059
                               Significance = true
                               Statistic = 2.696548946
                               SumOfSquares = 4.222625
                               CriticalValue = 2.691 }|]

Fisher Hotelling

let d1 = [159.;179.;100.;45.;384.;230.;100.;320.;80.;220.;320.;210.;]
let d2 = [14.4;15.2;11.3;2.5;22.7;14.9;1.41;15.81;4.19;15.39;17.25;9.52; ]
    
Testing.FisherHotelling.test d1 d2

Multiple testing

When conducting multiple hypothesis test the α-error accumulates. This is because the p value just describes the probability for a false positive for one single test. If you perform 10 t-test at an α level of 0.05, the probability of getting a significant result by chance is 40.1% [ (1-(1-α)k ].

let aErrorAcc = 
    [1. .. 100.]
    |> List.map (fun x -> x,(1. - 0.95**x))
    |> Chart.Line
    |> Chart.withXAxisStyle ( "number of tests (k)" )
    |> Chart.withYAxisStyle ( "probability of at least one false positive test")

To compensate this inflation, several multiple testing corrections were published. The most conservative method is the Bonferroni correction, where the used α level is divided by the number of performed tests.

A modern correction approach is the Benjamini-Hochberg method also known as FDR (false discovery rate).

Benjamini-Hochberg

let pValues =
    [|
        0.000002;0.000048;0.000096;0.000096;0.000351;0.000368;0.000368;0.000371;0.000383;0.000383;0.000705;0.000705;0.000705;0.000705;0.000739;0.00101;0.001234;0.001509;0.001509;0.001509;0.001509;0.001686;0.001686;0.001964;0.001964;0.001964;0.001964;0.001964;0.001964;0.001964;0.002057;0.002295;0.002662;0.002662;
        0.002662;0.002662;0.002662;0.002662;0.002662;0.002672;0.002714;0.002922;0.00348;0.004066;0.004176;0.004176;0.004562;0.004562;0.005848;0.005848;0.006277;0.007024;0.007614;0.007614;0.007614;0.007614;0.007614;0.00979;0.01049;0.01049;0.012498;0.012498;0.012498;0.017908;0.018822;0.019003;0.019003;0.019003;
        0.020234;0.02038;0.021317;0.023282;0.026069;0.026773;0.027255;0.027255;0.027255;0.027255;0.0274;0.030338;0.03128;0.034516;0.034516;0.037267;0.037267;0.040359;0.042706;0.043506;0.04513;0.04513;0.047135;0.049261;0.049261;0.049261;0.049261;0.049333;0.050457;0.052112;0.052476;0.060504;0.063031;0.063031;
        0.063031;0.063031;0.065316;0.065316;0.066751;0.067688;0.069676;0.073043;0.078139;0.078594;0.078594;0.095867;0.098913;0.102606;0.102606;0.102606;0.107444;0.116213;0.126098;0.135099;0.135099;0.159786;0.179654;0.199372;0.203542;0.203542;0.211249;0.211968;0.226611;0.228287;0.238719;0.247204;0.263942;
        0.263942;0.289175;0.306064;0.330191;0.330191;0.340904;0.343869;0.350009;0.355614;0.355614;0.359354;0.386018;0.386018;0.434486;0.438791;0.464694;0.471015;0.4715;0.479307;0.490157;0.505652;0.539465;0.539465;0.558338;0.558338;0.601991;0.61052;0.634365;0.637835;0.677506;0.678222;0.727881;0.748533;
        0.753718;0.758701;0.810979;0.838771;0.854833;0.872159;0.878727;0.890621;0.916361;0.954779;0.98181;0.985365;0.986261;0.98958;0.99861;0.99861;0.999602;0.999895
    |] |> Array.sort

let pValsAdj =
    MultipleTesting.benjaminiHochbergFDR pValues

let bhValues =
    [
        Chart.Line(pValues,pValues,Name="diagonal")
        Chart.Line(pValues,pValsAdj,Name="adj")
    ]
    |> Chart.combine
    |> Chart.withXAxisStyle "pValue" 
    |> Chart.withYAxisStyle "BH corrected pValue"

Q Value

A q value defines the proportion of false positives there are within all discoveries that were called significant up to the current item. It serves as multiple testing correction procedure if a great proportion of tests are reported to be significant, and therefore Benjamini-Hochberg-correction would underestimate the true positive test results. Qvalues with pi0 = 1 is equivalent to Benjamini-Hochber-Method. For an extensive introduction and application example, see q value blog post at fslabs.

\(m = \#tests\)

qValues

\(qvalue_p = \frac{\#(false positives)}{\#positives}\)

qValues robust

Corrects for small p values especially if the number of tests is low or the population distributions do not follow a normal distribution. The correction takes into account the probability of a false positive being reported in the first place.

\(qvalueRobust_p = \frac{\#(false positives)}{\#positives * (1 - (1 - p)**m)}\)

let pi0 = 
    pValues
    |> MultipleTesting.Qvalues.pi0Bootstrap 

pi0
0.3405017921
let qValues = 
    pValues
    |> MultipleTesting.Qvalues.ofPValues pi0

let qValuesRob =
    pValues
    |> MultipleTesting.Qvalues.ofPValuesRobust pi0 

let qChart =    
    [
        Chart.Line(pValues,qValues,Name="qValue")
        Chart.Line([(0.,pi0);(1.,pi0)],Name="pi<sub>0</sub>",LineDash=StyleParam.DrawingStyle.Dash)
        Chart.Line(pValues,qValuesRob,Name="qValueRobust")
    ]
    |> Chart.combine
    |> Chart.withTemplate ChartTemplates.lightMirrored
    |> Chart.withXAxisStyle ("p value",MinMax=(0.,1.))
    |> Chart.withYAxisStyle ("q Values",MinMax=(0.,1.))


let qHisto =
    [
        Chart.Histogram(pValues,XBins=TraceObjects.Bins.init(0.,1.,0.05),Name="pValues",HistNorm=HistNorm.ProbabilityDensity)
        Chart.Line([(0.,pi0);(1.,pi0)],Name="pi<sub>0</sub>",LineDash=StyleParam.DrawingStyle.Dash)
    ]
    |> Chart.combine
    |> Chart.withTemplate ChartTemplates.lightMirrored
    |> Chart.withXAxisStyle "p value"
    |> Chart.withYAxisStyle "density"

SAM

SAM (Significance Analysis of Microarrays) is a method developed to overcome multiple testing problems. It was proposed, but not restricted for, microarray analysis. It serves as a blue print for a variety of permutation test. Therefore, high throughput experiments can be analysed using a combined permutation-bootstrap-method. For more in depth information see the SAM BlogPost.

Data:

To use SAM, expression or intensity data need to be in the format ('id * float[])[], where 'id is a generic type implementing System.IComparable.

In this example, 'id is the name of the gene, and float array being the replicates.

One way of achieving this is the following data preparation:

Columns are samples, here 1 and 2, representing control and treatment groups. Rows are transcript counts (here indicated with gene identifier). The next step is to read in the data, e.g. via deedle, and to create a dataframe. The rows are indexed by the sample name and the rowkeys are extracted. Here is the location where the dataset can be accessed: tests\FSharp.Stats.Tests\data\TestDataSAM.txt

let df:Frame<string,string> = 
    Frame.ReadCsv(@"data/TestDataSAM.txt",hasHeaders=true,separators = "\t")
    // here, the name of A1 is needed. 
    |> Frame.indexRows "gene"

// get Rowkeys as Array
let rowheader :string[] = df.RowKeys |> Seq.toArray

// to separate control and factor sets (sample1 and sample2, respectively), 
// the datasets are chunked by the number of replicates (here: triplicates -> chunkBySize 3).
let (preData1,preData2) :float[][] * float [][]=  
    df
    |> Frame.getRows
    |> Series.values
    |> Seq.map (Series.values >> Seq.toArray >> Array.chunkBySize 3 >> fun x -> x.[0],x.[1])
    |> Array.ofSeq
    |> Array.unzip

// After chunking, the datasets are separated by factor and the rowkey is added to the data for later identification.
let data1 = Array.zip rowheader preData1 
let data2 = Array.zip  rowheader preData2 

Optional: Data can be normalised by median centering using the following function. Thereby the median of each column is determined and subtracted it from each value in the respective column. Since samples do not influence each other it makes no difference if you center each column individually or center the whole data matrix prior to segragation.

With data1 and data2, or corrected1 and corrected2, SAM can be performed.

open SAM
let corrected1 = 
    let medCorrect = 
        medianCentering data1 
    Array.zip rowheader medCorrect

let corrected2 = 
    let medCorrect = 
        medianCentering data2
    Array.zip rowheader medCorrect
 
let res = FSharp.Stats.Testing.SAM.twoClassUnpaired 100 0.05 data1 data2 (System.Random(1234))

Besides the data itself SAM requires the definition of some parameters:

  • number of permutations: It seems to be sufficient to use ~ 100 permutations (also default in samR).
  • desired FDR: While FDRs are given for each BioItem it is recommended to set a global FDR for the generation of the SAM plot.
  • random seed: The seed is used for randomization of the permutations (System.Random()), or can be fixed to achieve the same results multiple times (e.g. System.Random(1234)).

The SAMResult<_> type summarizes all information required to construct the typical SAM plot:

  • s0: fudge factor as described by Tusher et al. (2001)
  • pi0: {pi0 ∈ R ∣ 0 < x < 1} estimated for the determination of qvalues
  • delta: distance between the bisector and the parallel margins that separate nonsignificant from significant results
  • upper/lower cut: y-axis intercepts that define significance-thresholds for the observed statistics
  • positive/negative/non-significant bioitems
  • False Discovery Rate (FDR)
  • median number of false positives

The following snippet helps to generate the typical SAM plot.

let SAMChart = 

    let observed = [| res.NegSigBioitem; res.NonSigBioitem; res.PosSigBioitem|] |> Array.concat 
    let obs = observed |> Array.map (fun x -> x.Statistics) 
    let expected = res.AveragePermutations |> Array.map (fun x -> x.Statistics)
    let minDi = Seq.min obs
    let maxDi = Seq.max obs


    // positive significant changes 
    let posExpected = expected.[res.NegSigBioitem.Length + res.NonSigBioitem.Length .. res.NegSigBioitem.Length + res.NonSigBioitem.Length + res.PosSigBioitem.Length-1]
    let posChart = 
        Chart.Point(posExpected,res.PosSigBioitem |> Array.map (fun x -> x.Statistics))
        |> Chart.withLineStyle(Color=Color.fromKeyword Green)
        |> Chart.withTraceInfo("positive change",Visible = Visible.True )


    // no significant changes
    let nonex = expected.[res.NegSigBioitem.Length .. res.NegSigBioitem.Length + res.NonSigBioitem.Length-1]
    let nonchart = 
        Chart.Point(nonex,res.NonSigBioitem |> Array.map (fun x -> x.Statistics))
        |> Chart.withLineStyle(Color=Color.fromKeyword Gray)
        |> Chart.withTraceInfo("no change",Visible = Visible.True)

    // negative significant changes 
    let negex = expected.[0 .. res.NegSigBioitem.Length-1]
    let negchart = 
        Chart.Point(negex,res.NegSigBioitem |> Array.map (fun x -> x.Statistics))
        |> Chart.withLineStyle(Color=Color.fromKeyword Red)
        |> Chart.withTraceInfo("negative change",Visible = Visible.True)

    let samValues = 
        [
            negchart
            nonchart
            posChart
        ]
        |> Chart.combine
        
    let chartConfig =
        let svdConfig =
            ConfigObjects.ToImageButtonOptions.init(
                Format = StyleParam.ImageFormat.SVG)
        Config.init (
            ToImageButtonOptions = svdConfig,
            ModeBarButtonsToAdd=[ModeBarButton.HoverCompareCartesian]
            
        )

    let cutLineUp = [(minDi + res.Delta) ; (maxDi + res.Delta)]
    let cutsUp = 
        Chart.Line(cutLineUp,[minDi;maxDi])
        |> Chart.withLineStyle(Color=Color.fromKeyword Purple,Dash = StyleParam.DrawingStyle.Dash, Width = 0.5)
        |> Chart.withTraceInfo("delta",Visible = Visible.True)
    let cutLineLow = [(minDi - res.Delta) ; (maxDi - res.Delta)]
    let cutsLow = 
        Chart.Line(cutLineLow,[minDi;maxDi])
        |> Chart.withLineStyle(Color=Color.fromKeyword Purple,Dash = StyleParam.DrawingStyle.Dash, Width = 0.5)
        |> Chart.withTraceInfo("delta",Visible = Visible.True)
    let linechart = 
        Chart.Line([minDi;maxDi], [minDi;maxDi])
        |> Chart.withTraceInfo("bisecting angle",Visible = Visible.True)
        |> Chart.withLineStyle(Color=Color.fromKeyword Black, Width = 1)

    let uppercut = 
        let xAnchorUppercut = [minDi .. 5. .. maxDi]
        Chart.Line (xAnchorUppercut, List.init xAnchorUppercut.Length (fun x -> res.UpperCut))

        |> Chart.withTraceInfo("upper cut",Visible = Visible.True)
        |> Chart.withLineStyle(Color=Color.fromKeyword Black,Dash = StyleParam.DrawingStyle.Dash, Width = 0.3)

    let lowercut = 
        Chart.Line([minDi;maxDi],[res.LowerCut;res.LowerCut])
        |> Chart.withTraceInfo("lower cut",Visible = Visible.True)
        |> Chart.withLineStyle(Color=Color.fromKeyword Black,Dash = StyleParam.DrawingStyle.Dash,Width = 0.3)
        //|> Chart.withXAxisStyle(MinMax = (-15,20))
        
        |> Chart.withTraceInfo("lower cut",Visible = Visible.True)
    let plot = 
        [linechart;
        samValues;
        cutsUp;
        cutsLow;
        uppercut;
        lowercut]
        |> Chart.combine
        |> Chart.withTitle(title = "SAM results")
        |> Chart.withXAxisStyle("expected Score")
        |> Chart.withYAxisStyle ("observed Score")
        |> Chart.withConfig(chartConfig)
        |> Chart.withTemplate(ChartTemplates.lightMirrored)
    plot 
namespace Plotly
namespace Plotly.NET
module Defaults from Plotly.NET
<summary> Contains mutable global default values. Changing these values will apply the default values to all consecutive Chart generations. </summary>
val mutable DefaultDisplayOptions: DisplayOptions
Multiple items
type DisplayOptions = inherit DynamicObj new: unit -> DisplayOptions static member addAdditionalHeadTags: additionalHeadTags: XmlNode list -> (DisplayOptions -> DisplayOptions) static member addDescription: description: XmlNode list -> (DisplayOptions -> DisplayOptions) static member combine: first: DisplayOptions -> second: DisplayOptions -> DisplayOptions static member getAdditionalHeadTags: displayOpts: DisplayOptions -> XmlNode list static member getDescription: displayOpts: DisplayOptions -> XmlNode list static member getPlotlyReference: displayOpts: DisplayOptions -> PlotlyJSReference static member init: ?AdditionalHeadTags: XmlNode list * ?Description: XmlNode list * ?PlotlyJSReference: PlotlyJSReference -> DisplayOptions static member initCDNOnly: unit -> DisplayOptions ...

--------------------
new: unit -> DisplayOptions
static member DisplayOptions.init: ?AdditionalHeadTags: Giraffe.ViewEngine.HtmlElements.XmlNode list * ?Description: Giraffe.ViewEngine.HtmlElements.XmlNode list * ?PlotlyJSReference: PlotlyJSReference -> DisplayOptions
type PlotlyJSReference = | CDN of string | Full | Require of string | NoReference
<summary> Sets how plotly is referenced in the head of html docs. </summary>
union case PlotlyJSReference.NoReference: PlotlyJSReference
module StyleParam from Plotly.NET
namespace Plotly.NET.LayoutObjects
namespace FSharpAux
namespace Deedle
Multiple items
namespace FSharp

--------------------
namespace Microsoft.FSharp
namespace FSharp.Stats
namespace FSharp.Stats.Testing
val sampleA: Vector<float>
Multiple items
val vector: l: seq<float> -> Vector<float>

--------------------
type vector = Vector<float>
val oneSampleTTest: TestStatistics.TTestStatistics
module TTest from FSharp.Stats.Testing
val oneSample: sample1: Vector<float> -> mu: float -> TestStatistics.TTestStatistics
val sample1: Vector<float>
val sample2: Vector<float>
val twoSampleTTest: TestStatistics.TTestStatistics
val twoSample: assumeEqualVariances: bool -> sample1: Vector<float> -> sample2: Vector<float> -> TestStatistics.TTestStatistics
<summary> Computes a t-test or a Welch test (unequal variances) </summary>
val sampleP1: Vector<float>
val sampleP2: Vector<float>
val paired: TestStatistics.TTestStatistics
val twoSamplePaired: sample1: Vector<float> -> sample2: Vector<float> -> TestStatistics.TTestStatistics
<summary> which observations in one sample can be paired with observations in the other sample. </summary>
val sampleW1: Vector<float>
val sampleW2: Vector<float>
val welch: TestStatistics.TTestStatistics
val dataOneWay: float[][]
val contrastMatrix: float[][]
val oneWayResult: Anova.OneWayAnovaVariationSources
module Anova from FSharp.Stats.Testing
val oneWayAnova: samples: seq<#seq<float>> -> Anova.OneWayAnovaVariationSources
<summary> Calculates one-way analysis of variance (one-way ANOVA) which is a technique used to compare means of two or more samples (using the F distribution) The ANOVA tests the null hypothesis that samples in two or more groups are drawn from populations with the same mean values. </summary>
val data: float[][][]
Multiple items
module Seq from FSharp.Stats
<summary> Module to compute common statistical measure </summary>

--------------------
module Seq from FSharpAux

--------------------
module Seq from Microsoft.FSharp.Collections
<summary>Contains operations for working with values of type <see cref="T:Microsoft.FSharp.Collections.seq`1" />.</summary>

--------------------
type Seq = new: unit -> Seq static member geomspace: start: float * stop: float * num: int * ?IncludeEndpoint: bool -> seq<float> static member linspace: start: float * stop: float * num: int * ?IncludeEndpoint: bool -> seq<float>

--------------------
new: unit -> Seq
val groupBy: projection: ('T -> 'Key) -> source: seq<'T> -> seq<'Key * seq<'T>> (requires equality)
<summary>Applies a key-generating function to each element of a sequence and yields a sequence of unique keys. Each unique key contains a sequence of all elements that match to this key.</summary>
<remarks>This function returns a sequence that digests the whole initial sequence as soon as that sequence is iterated. As a result this function should not be used with large or infinite sequences. The function makes no assumption on the ordering of the original sequence.</remarks>
<param name="projection">A function that transforms an element of the sequence into a comparable key.</param>
<param name="source">The input sequence.</param>
<returns>The result sequence.</returns>
<example id="group-by-1"><code lang="fsharp"> let inputs = [1; 2; 3; 4; 5] inputs |&gt; Seq.groupBy (fun n -&gt; n % 2) </code> Evaluates to a sequence yielding the same results as <c>seq { (1, seq { 1; 3; 5 }); (0, seq { 2; 4 }) }</c></example>
val v: float
val f1: char
val f2: char
val map: mapping: ('T -> 'U) -> source: seq<'T> -> seq<'U>
<summary>Builds a new collection whose elements are the results of applying the given function to each of the elements of the collection. The given function will be applied as elements are demanded using the <c>MoveNext</c> method on enumerators retrieved from the object.</summary>
<remarks>The returned sequence may be passed between threads safely. However, individual IEnumerator values generated from the returned sequence should not be accessed concurrently.</remarks>
<param name="mapping">A function to transform items from the input sequence.</param>
<param name="source">The input sequence.</param>
<returns>The result sequence.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input sequence is null.</exception>
<example id="item-1"><code lang="fsharp"> let inputs = ["a"; "bbb"; "cc"] inputs |&gt; Seq.map (fun x -&gt; x.Length) </code> Evaluates to a sequence yielding the same results as <c>seq { 1; 3; 2 }</c></example>
val k: char
val vls: seq<float * char * char>
val vls': seq<float * char * char>
val toArray: source: seq<'T> -> 'T[]
<summary>Builds an array from the given collection.</summary>
<param name="source">The input sequence.</param>
<returns>The result array.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input sequence is null.</exception>
<example id="toarray-1"><code lang="fsharp"> let inputs = seq { 1; 2; 5 } inputs |&gt; Seq.toArray </code> Evaluates to <c>[| 1; 2; 5 |]</c>. </example>
val twoWayANOVA: anovaType: Anova.TwoWayAnovaModel -> samples: float array array array -> Anova.TwoWayAnovaVariationSources
<summary> Calculates two-way ANOVA as an extension of the one-way ANOVA for two independent variables. </summary>
type TwoWayAnovaModel = | Fixed | Mixed | Random
union case Anova.TwoWayAnovaModel.Mixed: Anova.TwoWayAnovaModel
val data': float[][][]
val sampleFA: Vector<float>
val sampleFB: Vector<float>
val fTestFromData: TestStatistics.FTestStatistics
module FTest from FSharp.Stats.Testing
val testVariances: data1: Vector<float> -> data2: Vector<float> -> TestStatistics.FTestStatistics
<summary> F-test to compare two variances from data. </summary>
val sampleF1: float * float
val sampleF2: float * float
val fTestFromParameters: TestStatistics.FTestStatistics
val testVariancesFromVarAndDof: var1: float * df1: float -> var2: float * df2: float -> TestStatistics.FTestStatistics
<summary> F-test to compare two variances from given parameters. </summary>
val groupA: float list
val groupB: float list
val groupC: float list
val samples: float list list
val hResult: TestStatistics.ChiSquareStatistics
module HTest from FSharp.Stats.Testing
val createHTest: samples: seq<#seq<float>> -> TestStatistics.ChiSquareStatistics
<summary> H-test / one-way ANOVA of ranks </summary>
val A: float[]
val B: float[]
val C: float[]
val D: float[]
val E: float[]
val F: float[]
val G: float[]
val H: float[]
val I: float[]
val J: float[]
val samplesMany: float[][]
val friedmanResult: TestStatistics.ChiSquareStatistics
module FriedmanTest from FSharp.Stats.Testing
val createFriedmanTest: samples: seq<#seq<float>> -> TestStatistics.ChiSquareStatistics
val before: float list
val after: float list
val wilcoxonResult: TestStatistics.WilcoxonTestStatistics
module WilcoxonTest from FSharp.Stats.Testing
val createWilcoxonTest: data1: seq<float> -> data2: seq<float> -> correction: bool -> TestStatistics.WilcoxonTestStatistics
val wilcoxonResult2: TestStatistics.WilcoxonTestStatistics
val differences: float list
val wilcoxonResult3: TestStatistics.WilcoxonTestStatistics
val createWilcoxonTestFromDifferences: difference: seq<float> -> correction: bool -> TestStatistics.WilcoxonTestStatistics
module PostHoc from FSharp.Stats.Testing
val lsd: Contrast[]
val fishersLSD: contrastMatrix: float[][] -> data: float[][] -> Contrast[]
<summary> Fisher's LSD. Sequential t tests with the variance estimated from all samples instead of the individual groups. FishersLSD requires ANOVA protection (apply ANOVA first). Not multiple testing corrected! Apply e.g. Benjamini-Hochberg method afterwards. </summary>
val index: int list
val pValue: float list
val pValueAdj: float list
module MultipleTesting from FSharp.Stats.Testing
<summary> This module contains functions to adjust for multiple testing errors in statistical tests. </summary>
val benjaminiHochbergFDRBy: projection: ('a -> 'b * float) -> rawP: seq<'a> -> ('b * float) list
<summary> Benjamini-Hochberg Correction (BH) 'projection' should return a tuple of any identifier and the pValues as float, when applied to 'rawP' This function applies the Benjamini-Hochberg multiple testing correcture and returns all False Discovery Rates to which the given p-values are still significant. Note: corrected pValues are not sorted in original order! </summary>
val x: Contrast
Contrast.Significance: float
Multiple items
module List from FSharp.Stats
<summary> Module to compute common statistical measure on list </summary>

--------------------
module List from FSharpAux

--------------------
module List from Microsoft.FSharp.Collections
<summary>Contains operations for working with values of type <see cref="T:Microsoft.FSharp.Collections.list`1" />.</summary>
<namespacedoc><summary>Operations for collections such as lists, arrays, sets, maps and sequences. See also <a href="https://docs.microsoft.com/dotnet/fsharp/language-reference/fsharp-collection-types">F# Collection Types</a> in the F# Language Guide. </summary></namespacedoc>


--------------------
type List = new: unit -> List static member geomspace: start: float * stop: float * num: int * ?IncludeEndpoint: bool -> float list static member linspace: start: float * stop: float * num: int * ?IncludeEndpoint: bool -> float list

--------------------
type List<'T> = | op_Nil | op_ColonColon of Head: 'T * Tail: 'T list interface IReadOnlyList<'T> interface IReadOnlyCollection<'T> interface IEnumerable interface IEnumerable<'T> member GetReverseIndex: rank: int * offset: int -> int member GetSlice: startIndex: int option * endIndex: int option -> 'T list static member Cons: head: 'T * tail: 'T list -> 'T list member Head: 'T member IsEmpty: bool member Item: index: int -> 'T with get ...
<summary>The type of immutable singly-linked lists.</summary>
<remarks>Use the constructors <c>[]</c> and <c>::</c> (infix) to create values of this type, or the notation <c>[1;2;3]</c>. Use the values in the <c>List</c> module to manipulate values of this type, or pattern match against the values directly. </remarks>
<exclude />


--------------------
new: unit -> List
val sortBy: projection: ('T -> 'Key) -> list: 'T list -> 'T list (requires comparison)
<summary>Sorts the given list using keys given by the given projection. Keys are compared using <see cref="M:Microsoft.FSharp.Core.Operators.compare" />.</summary>
<remarks>This is a stable sort, i.e. the original order of equal elements is preserved.</remarks>
<param name="projection">The function to transform the list elements into the type to be compared.</param>
<param name="list">The input list.</param>
<returns>The sorted list.</returns>
<example id="sortby-1"><code lang="fsharp"> let input = [ "a"; "bbb"; "cccc"; "dd" ] input |&gt; List.sortBy (fun s -&gt; s.Length) </code> Evaluates to <c>["a"; "dd"; "bbb"; "cccc"]</c>. </example>
Contrast.Index: int
val map: mapping: ('T -> 'U) -> list: 'T list -> 'U list
<summary>Builds a new collection whose elements are the results of applying the given function to each of the elements of the collection.</summary>
<param name="mapping">The function to transform elements from the input list.</param>
<param name="list">The input list.</param>
<returns>The list of transformed elements.</returns>
<example id="map-1"><code lang="fsharp"> let inputs = [ "a"; "bbb"; "cc" ] inputs |&gt; List.map (fun x -&gt; x.Length) </code> Evaluates to <c>[ 1; 3; 2 ]</c></example>
val pValAdj: float
val unzip3: list: ('T1 * 'T2 * 'T3) list -> 'T1 list * 'T2 list * 'T3 list
<summary>Splits a list of triples into three lists.</summary>
<param name="list">The input list.</param>
<returns>Three lists of split elements.</returns>
<example id="unzip3-1"><code lang="fsharp"> let inputs = [(1, "one", "I"); (2, "two", "II")] let numbers, names, roman = inputs |&gt; List.unzip3 </code> Evaluates <c>numbers</c> to <c>[1; 2]</c>, <c>names</c> to <c>["one"; "two"]</c> and <c>roman</c> to <c>["I"; "II"]</c>. </example>
val lsdCorrected: GenericChart.GenericChart
val header: string list
val rows: string list list
val sprintf: format: Printf.StringFormat<'T> -> 'T
<summary>Print to a string using the given format.</summary>
<param name="format">The formatter.</param>
<returns>The formatted result.</returns>
<example>See <c>Printf.sprintf</c> (link: <see cref="M:Microsoft.FSharp.Core.PrintfModule.PrintFormatToStringThen``1" />) for examples.</example>
type Chart = static member AnnotatedHeatmap: zData: seq<#seq<'a1>> * annotationText: seq<#seq<string>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?X: seq<'a3> * ?MultiX: seq<seq<'a3>> * ?XGap: int * ?Y: seq<'a4> * ?MultiY: seq<seq<'a4>> * ?YGap: int * ?Text: 'a5 * ?MultiText: seq<'a5> * ?ColorBar: ColorBar * ?ColorScale: Colorscale * ?ShowScale: bool * ?ReverseScale: bool * ?ZSmooth: SmoothAlg * ?Transpose: bool * ?UseWebGL: bool * ?ReverseYAxis: bool * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a3 :> IConvertible and 'a4 :> IConvertible and 'a5 :> IConvertible) + 1 overload static member Area: x: seq<#IConvertible> * y: seq<#IConvertible> * ?ShowMarkers: bool * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: Marker * ?LineColor: Color * ?LineColorScale: Colorscale * ?LineWidth: float * ?LineDash: DrawingStyle * ?Line: Line * ?AlignmentGroup: string * ?OffsetGroup: string * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?FillColor: Color * ?FillPatternShape: PatternShape * ?FillPattern: Pattern * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible) + 1 overload static member Bar: values: seq<#IConvertible> * ?Keys: seq<'a1> * ?MultiKeys: seq<seq<'a1>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerPatternShape: PatternShape * ?MultiMarkerPatternShape: seq<PatternShape> * ?MarkerPattern: Pattern * ?Marker: Marker * ?Base: #IConvertible * ?Width: 'a4 * ?MultiWidth: seq<'a4> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a2 :> IConvertible and 'a4 :> IConvertible) + 1 overload static member BoxPlot: ?X: seq<'a0> * ?MultiX: seq<seq<'a0>> * ?Y: seq<'a1> * ?MultiY: seq<seq<'a1>> * ?Name: string * ?ShowLegend: bool * ?Text: 'a2 * ?MultiText: seq<'a2> * ?FillColor: Color * ?MarkerColor: Color * ?Marker: Marker * ?Opacity: float * ?WhiskerWidth: float * ?BoxPoints: BoxPoints * ?BoxMean: BoxMean * ?Jitter: float * ?PointPos: float * ?Orientation: Orientation * ?OutlineColor: Color * ?OutlineWidth: float * ?Outline: Line * ?AlignmentGroup: string * ?OffsetGroup: string * ?Notched: bool * ?NotchWidth: float * ?QuartileMethod: QuartileMethod * ?UseDefaults: bool -> GenericChart (requires 'a0 :> IConvertible and 'a1 :> IConvertible and 'a2 :> IConvertible) + 2 overloads static member Bubble: x: seq<#IConvertible> * y: seq<#IConvertible> * sizes: seq<int> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: Marker * ?LineColor: Color * ?LineColorScale: Colorscale * ?LineWidth: float * ?LineDash: DrawingStyle * ?Line: Line * ?AlignmentGroup: string * ?OffsetGroup: string * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible) + 1 overload static member Candlestick: ``open`` : seq<#IConvertible> * high: seq<#IConvertible> * low: seq<#IConvertible> * close: seq<#IConvertible> * ?X: seq<'a4> * ?MultiX: seq<seq<'a4>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?Text: 'a5 * ?MultiText: seq<'a5> * ?Line: Line * ?IncreasingColor: Color * ?Increasing: FinanceMarker * ?DecreasingColor: Color * ?Decreasing: FinanceMarker * ?WhiskerWidth: float * ?ShowXAxisRangeSlider: bool * ?UseDefaults: bool -> GenericChart (requires 'a4 :> IConvertible and 'a5 :> IConvertible) + 2 overloads static member Column: values: seq<#IConvertible> * ?Keys: seq<'a1> * ?MultiKeys: seq<seq<'a1>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerPatternShape: PatternShape * ?MultiMarkerPatternShape: seq<PatternShape> * ?MarkerPattern: Pattern * ?Marker: Marker * ?Base: #IConvertible * ?Width: 'a4 * ?MultiWidth: seq<'a4> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a2 :> IConvertible and 'a4 :> IConvertible) + 1 overload static member Contour: zData: seq<#seq<'a1>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?X: seq<'a2> * ?MultiX: seq<seq<'a2>> * ?Y: seq<'a3> * ?MultiY: seq<seq<'a3>> * ?Text: 'a4 * ?MultiText: seq<'a4> * ?ColorBar: ColorBar * ?ColorScale: Colorscale * ?ShowScale: bool * ?ReverseScale: bool * ?Transpose: bool * ?ContourLineColor: Color * ?ContourLineDash: DrawingStyle * ?ContourLineSmoothing: float * ?ContourLine: Line * ?ContoursColoring: ContourColoring * ?ContoursOperation: ConstraintOperation * ?ContoursType: ContourType * ?ShowContourLabels: bool * ?ContourLabelFont: Font * ?Contours: Contours * ?FillColor: Color * ?NContours: int * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a2 :> IConvertible and 'a3 :> IConvertible and 'a4 :> IConvertible) static member Funnel: x: seq<#IConvertible> * y: seq<#IConvertible> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?Width: float * ?Offset: float * ?Text: 'a2 * ?MultiText: seq<'a2> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?Orientation: Orientation * ?AlignmentGroup: string * ?OffsetGroup: string * ?MarkerColor: Color * ?MarkerOutline: Line * ?Marker: Marker * ?TextInfo: TextInfo * ?ConnectorLineColor: Color * ?ConnectorLineStyle: DrawingStyle * ?ConnectorFillColor: Color * ?ConnectorLine: Line * ?Connector: FunnelConnector * ?InsideTextFont: Font * ?OutsideTextFont: Font * ?UseDefaults: bool -> GenericChart (requires 'a2 :> IConvertible) static member Heatmap: zData: seq<#seq<'a1>> * ?X: seq<'a2> * ?MultiX: seq<seq<'a2>> * ?Y: seq<'a3> * ?MultiY: seq<seq<'a3>> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?XGap: int * ?YGap: int * ?Text: 'a4 * ?MultiText: seq<'a4> * ?ColorBar: ColorBar * ?ColorScale: Colorscale * ?ShowScale: bool * ?ReverseScale: bool * ?ZSmooth: SmoothAlg * ?Transpose: bool * ?UseWebGL: bool * ?ReverseYAxis: bool * ?UseDefaults: bool -> GenericChart (requires 'a1 :> IConvertible and 'a2 :> IConvertible and 'a3 :> IConvertible and 'a4 :> IConvertible) + 1 overload ...
static member Chart.Table: header: TraceObjects.TableHeader * cells: TraceObjects.TableCells * ?Name: string * ?ColumnOrder: seq<int> * ?ColumnWidth: float * ?MultiColumnWidth: seq<float> * ?UseDefaults: bool -> GenericChart.GenericChart
static member Chart.Table: headerValues: seq<#seq<'b>> * cellsValues: seq<#seq<'d>> * ?TransposeCells: bool * ?HeaderAlign: HorizontalAlign * ?HeaderMultiAlign: seq<HorizontalAlign> * ?HeaderFillColor: Color * ?HeaderHeight: int * ?HeaderOutlineColor: Color * ?HeaderOutlineWidth: float * ?HeaderOutlineMultiWidth: seq<float> * ?HeaderOutline: Line * ?CellsAlign: HorizontalAlign * ?CellsMultiAlign: seq<HorizontalAlign> * ?CellsFillColor: Color * ?CellsHeight: int * ?CellsOutlineColor: Color * ?CellsOutlineWidth: float * ?CellsOutlineMultiWidth: seq<float> * ?CellsOutline: Line * ?Name: string * ?ColumnOrder: seq<int> * ?ColumnWidth: float * ?MultiColumnWidth: seq<float> * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'b :> System.IConvertible and 'd :> System.IConvertible)
type Color = override Equals: other: obj -> bool override GetHashCode: unit -> int static member fromARGB: a: int -> r: int -> g: int -> b: int -> Color static member fromColorScaleValues: c: seq<#IConvertible> -> Color static member fromColors: c: seq<Color> -> Color static member fromHex: s: string -> Color static member fromKeyword: c: ColorKeyword -> Color static member fromRGB: r: int -> g: int -> b: int -> Color static member fromString: c: string -> Color member Value: obj
<summary> Plotly color can be a single color, a sequence of colors, or a sequence of numeric values referencing the color of the colorscale obj </summary>
static member Color.fromHex: s: string -> Color
static member Color.fromColors: c: seq<Color> -> Color
static member Color.fromString: c: string -> Color
module GenericChart from Plotly.NET
<summary> Module to represent a GenericChart </summary>
val toChartHTML: gChart: GenericChart.GenericChart -> string
val hays: contrastMatrix: float[][] -> data: float[][] -> Contrast[]
val dmg: float[][]
val contrastMatrixDmg: float[][]
val hsdExample: float[][]
val anovaResult: Anova.OneWayAnovaVariationSources
val contrastMatrixHSD: float[][]
val hsdResult: Contrast[]
val tukeyHSD: contrastMatrix: float[][] -> data: float[][] -> Contrast[]
<summary> Tukey-Kramer approach </summary>
val tukeySignificance: string
Multiple items
module Array from FSharp.Stats
<summary> Module to compute common statistical measure on array </summary>

--------------------
module Array from FSharpAux

--------------------
module Array from Microsoft.FSharp.Collections
<summary>Contains operations for working with arrays.</summary>
<remarks> See also <a href="https://docs.microsoft.com/dotnet/fsharp/language-reference/arrays">F# Language Guide - Arrays</a>. </remarks>


--------------------
type Array = new: unit -> Array static member geomspace: start: float * stop: float * num: int * ?IncludeEndpoint: bool -> float array static member linspace: start: float * stop: float * num: int * ?IncludeEndpoint: bool -> float[]

--------------------
new: unit -> Array
val map: mapping: ('T -> 'U) -> array: 'T[] -> 'U[]
<summary>Builds a new array whose elements are the results of applying the given function to each of the elements of the array.</summary>
<param name="mapping">The function to transform elements of the array.</param>
<param name="array">The input array.</param>
<returns>The array of transformed elements.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input array is null.</exception>
<example id="map-1"><code lang="fsharp"> let inputs = [| "a"; "bbb"; "cc" |] inputs |&gt; Array.map (fun x -&gt; x.Length) </code> Evaluates to <c>[| 1; 3; 2 |]</c></example>
Contrast.L: float
<summary> group mean difference </summary>
Contrast.Statistic: float
val x: string[]
val append: array1: 'T[] -> array2: 'T[] -> 'T[]
<summary>Builds a new array that contains the elements of the first array followed by the elements of the second array.</summary>
<param name="array1">The first input array.</param>
<param name="array2">The second input array.</param>
<returns>The resulting array.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when either of the input arrays is null.</exception>
<example id="append-1"><code lang="fsharp"> Array.append [| 1; 2 |] [| 3; 4 |] </code> Evaluates to <c>[| 1; 2; 3; 4 |]</c>. </example>
Multiple items
module String from FSharpAux

--------------------
module String from Microsoft.FSharp.Core
<summary>Functional programming operators for string processing. Further string operations are available via the member functions on strings and other functionality in <a href="http://msdn2.microsoft.com/en-us/library/system.string.aspx">System.String</a> and <a href="http://msdn2.microsoft.com/library/system.text.regularexpressions.aspx">System.Text.RegularExpressions</a> types. </summary>
<category>Strings and Text</category>
val concat: sep: string -> strings: seq<string> -> string
<summary>Returns a new string made by concatenating the given strings with separator <c>sep</c>, that is <c>a1 + sep + ... + sep + aN</c>.</summary>
<param name="sep">The separator string to be inserted between the strings of the input sequence.</param>
<param name="strings">The sequence of strings to be concatenated.</param>
<returns>A new string consisting of the concatenated strings separated by the separation string.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when <c>strings</c> is null.</exception>
<example id="concat-1"><code lang="fsharp"> let input1 = ["Stefan"; "says:"; "Hello"; "there!"] input1 |&gt; String.concat " " // evaluates "Stefan says: Hello there!" let input2 = [0..9] |&gt; List.map string input2 |&gt; String.concat "" // evaluates "0123456789" input2 |&gt; String.concat ", " // evaluates "0, 1, 2, 3, 4, 5, 6, 7, 8, 9" let input3 = ["No comma"] input3 |&gt; String.concat "," // evaluates "No comma" </code></example>
val dunnetExample: float[][]
val dunnetContrastMatrix: float[][]
val dunnettResult: CriticalValueContrast[]
val dunnetts: contrastMatrix: float[][] -> data: float[][] -> criticalTable: Matrix<float> -> CriticalValueContrast[]
<summary> Dunnetts post hoc test compares groups to one control group (multiple-to-one comparison). Returns if the groups defined in the contrast differ significantly (already multi comparison corrected for FWER &amp;lt; a) Critical value tables can be found in Testing.Tables </summary>
module Tables from FSharp.Stats.Testing
<summary> Some statistical tests lack in distributions for exact p value calculation. In order to enable the usage of these tests </summary>
val dunnettsTwoSided095: Matrix<float>
<summary> Dunnetts table for two tailed, alpha = 0.05 </summary>
val d1: float list
val d2: float list
module FisherHotelling from FSharp.Stats.Testing
<summary> Fisher-Z transformation for Pearson correlation coefficient after Hotelling (1953) for n &amp;lt; 50 </summary>
val test: dataA: seq<float> -> dataB: seq<float> -> FisherHotelling.HotellingStatistics
<summary> Pearson correlation (nan support by JackKnife leave one out) </summary>
val aErrorAcc: GenericChart.GenericChart
val x: float
static member Chart.Line: xy: seq<#System.IConvertible * #System.IConvertible> * ?ShowMarkers: bool * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'c * ?MultiText: seq<'c> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: TraceObjects.Marker * ?LineColor: Color * ?LineColorScale: Colorscale * ?LineWidth: float * ?LineDash: DrawingStyle * ?Line: Line * ?AlignmentGroup: string * ?OffsetGroup: string * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?Fill: Fill * ?FillColor: Color * ?FillPattern: TraceObjects.Pattern * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'c :> System.IConvertible)
static member Chart.Line: x: seq<#System.IConvertible> * y: seq<#System.IConvertible> * ?ShowMarkers: bool * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'c * ?MultiText: seq<'c> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: TraceObjects.Marker * ?LineColor: Color * ?LineColorScale: Colorscale * ?LineWidth: float * ?LineDash: DrawingStyle * ?Line: Line * ?AlignmentGroup: string * ?OffsetGroup: string * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?Fill: Fill * ?FillColor: Color * ?FillPattern: TraceObjects.Pattern * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'c :> System.IConvertible)
static member Chart.withXAxisStyle: ?TitleText: string * ?TitleFont: Font * ?TitleStandoff: int * ?Title: Title * ?Color: Color * ?AxisType: AxisType * ?MinMax: (#System.IConvertible * #System.IConvertible) * ?Mirror: Mirror * ?ShowSpikes: bool * ?SpikeColor: Color * ?SpikeThickness: int * ?ShowLine: bool * ?LineColor: Color * ?ShowGrid: bool * ?GridColor: Color * ?GridDash: DrawingStyle * ?ZeroLine: bool * ?ZeroLineColor: Color * ?Anchor: LinearAxisId * ?Side: Side * ?Overlaying: LinearAxisId * ?Domain: (float * float) * ?Position: float * ?CategoryOrder: CategoryOrder * ?CategoryArray: seq<#System.IConvertible> * ?RangeSlider: RangeSlider * ?RangeSelector: RangeSelector * ?BackgroundColor: Color * ?ShowBackground: bool * ?Id: SubPlotId -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Chart.withYAxisStyle: ?TitleText: string * ?TitleFont: Font * ?TitleStandoff: int * ?Title: Title * ?Color: Color * ?AxisType: AxisType * ?MinMax: (#System.IConvertible * #System.IConvertible) * ?Mirror: Mirror * ?ShowSpikes: bool * ?SpikeColor: Color * ?SpikeThickness: int * ?ShowLine: bool * ?LineColor: Color * ?ShowGrid: bool * ?GridColor: Color * ?GridDash: DrawingStyle * ?ZeroLine: bool * ?ZeroLineColor: Color * ?Anchor: LinearAxisId * ?Side: Side * ?Overlaying: LinearAxisId * ?AutoShift: bool * ?Shift: int * ?Domain: (float * float) * ?Position: float * ?CategoryOrder: CategoryOrder * ?CategoryArray: seq<#System.IConvertible> * ?RangeSlider: RangeSlider * ?RangeSelector: RangeSelector * ?BackgroundColor: Color * ?ShowBackground: bool * ?Id: SubPlotId -> (GenericChart.GenericChart -> GenericChart.GenericChart)
val pValues: float[]
val sort: array: 'T[] -> 'T[] (requires comparison)
<summary>Sorts the elements of an array, returning a new array. Elements are compared using <see cref="M:Microsoft.FSharp.Core.Operators.compare" />. </summary>
<remarks>This is not a stable sort, i.e. the original order of equal elements is not necessarily preserved. For a stable sort, consider using <see cref="M:Microsoft.FSharp.Collections.SeqModule.Sort" />.</remarks>
<param name="array">The input array.</param>
<returns>The sorted array.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input array is null.</exception>
<example id="sort-1"><code lang="fsharp"> let input = [| 8; 4; 3; 1; 6; 1 |] Array.sort input </code> Evaluates to <c>[| 1; 1 3; 4; 6; 8 |]</c>. </example>
val pValsAdj: seq<float>
val benjaminiHochbergFDR: rawPValues: seq<float> -> seq<float>
<summary> Benjamini-Hochberg Correction (BH) This function applies the Benjamini-Hochberg multiple testing correcture and returns all False Discovery Rates to which the given p-values are still significant. </summary>
val bhValues: GenericChart.GenericChart
union case HoverInfo.Name: HoverInfo
static member Chart.combine: gCharts: seq<GenericChart.GenericChart> -> GenericChart.GenericChart
val pi0: float
module Qvalues from FSharp.Stats.Testing.MultipleTesting
<summary> Estimate the q-values for a given set of p-values. The q-value of a test measures the proportion of false positives incurred (called the false discovery rate) when that particular test is called significant. </summary>
val pi0Bootstrap: pValues: float[] -> float
<summary> Estimates pi0 from given p-Values by Storeys bootstrap method using default lambda's pi0 is the value to which, one can find certain values of the distribution at random. If this returns 0. default lambda needs to be smaller. One should use 'pi0BootstrapWithLambda' in this case. </summary>
val qValues: float[]
val ofPValues: pi0: float -> pValues: float[] -> float[]
<summary> Calculates q-values from given p-values and returns an array of qValues in the same order. nan p values are ignored and reported as nan. </summary>
<param name="pi0">can be calculated with 'pi0Bootstrap' or 'pi0BootstrapWithLambda'.</param>
<param name="pValues">sequence of p values to correct</param>
val qValuesRob: float[]
val ofPValuesRobust: pi0: float -> pValues: float[] -> float[]
<summary> Calculates q-values from given p-values and returns an array of robust qValues in the same order. More robust for small p values when testcount is low, see Storey JD (2002) JRSS-B 64: 479-498. nan p values are ignored and reported as nan. </summary>
<param name="pi0">can be calculated with 'pi0Bootstrap' or 'pi0BootstrapWithLambda'.</param>
<param name="pValues">sequence of p values to correct</param>
val qChart: GenericChart.GenericChart
type DrawingStyle = | Solid | Dash | Dot | DashDot | LongDash | LongDashDot | User of seq<int> member Convert: unit -> obj override ToString: unit -> string static member convert: (DrawingStyle -> obj) static member toString: (DrawingStyle -> string)
<summary> Dash: Sets the drawing style of the lines segments in this trace. Sets the style of the lines. Set to a dash string type or a dash length in px. </summary>
union case DrawingStyle.Dash: DrawingStyle
static member Chart.withTemplate: template: Template -> (GenericChart.GenericChart -> GenericChart.GenericChart)
module ChartTemplates from Plotly.NET
val lightMirrored: Template
val qHisto: GenericChart.GenericChart
static member Chart.Histogram: data: seq<#System.IConvertible> * orientation: Orientation * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?Text: 'a1 * ?MultiText: seq<'a1> * ?HistFunc: HistFunc * ?HistNorm: HistNorm * ?AlignmentGroup: string * ?OffsetGroup: string * ?NBinsX: int * ?NBinsY: int * ?BinGroup: string * ?XBins: TraceObjects.Bins * ?YBins: TraceObjects.Bins * ?MarkerColor: Color * ?Marker: TraceObjects.Marker * ?Line: Line * ?XError: TraceObjects.Error * ?YError: TraceObjects.Error * ?Cumulative: TraceObjects.Cumulative * ?HoverLabel: Hoverlabel * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'a1 :> System.IConvertible)
static member Chart.Histogram: ?X: seq<'a> * ?MultiX: seq<seq<'a>> * ?Y: seq<'b> * ?MultiY: seq<seq<'b>> * ?Orientation: Orientation * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?Text: 'c * ?MultiText: seq<'c> * ?TextPosition: TextPosition * ?HistFunc: HistFunc * ?HistNorm: HistNorm * ?AlignmentGroup: string * ?OffsetGroup: string * ?NBinsX: int * ?NBinsY: int * ?BinGroup: string * ?XBins: TraceObjects.Bins * ?YBins: TraceObjects.Bins * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerPatternShape: PatternShape * ?MultiMarkerPatternShape: seq<PatternShape> * ?MarkerPattern: TraceObjects.Pattern * ?Marker: TraceObjects.Marker * ?Line: Line * ?XError: TraceObjects.Error * ?YError: TraceObjects.Error * ?Cumulative: TraceObjects.Cumulative * ?HoverLabel: Hoverlabel * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'a :> System.IConvertible and 'b :> System.IConvertible and 'c :> System.IConvertible)
namespace Plotly.NET.TraceObjects
Multiple items
type Bins = inherit DynamicObj new: unit -> Bins static member init: ?Start: float * ?End: float * ?Size: float -> Bins static member style: ?Start: float * ?End: float * ?Size: float -> (Bins -> Bins)
<summary> Bin type inherits from dynamic object </summary>

--------------------
new: unit -> TraceObjects.Bins
static member TraceObjects.Bins.init: ?Start: float * ?End: float * ?Size: float -> TraceObjects.Bins
type HistNorm = | None | Percent | Probability | Density | ProbabilityDensity member Convert: unit -> obj override ToString: unit -> string static member convert: (HistNorm -> obj) static member toString: (HistNorm -> string)
<summary> Sets the type of normalization for this histogram trace. By default ('histnorm' set to '') the height of each bar displays the frequency of occurrence, i.e., the number of times this value was found in the corresponding bin. If set to 'percent', the height of each bar displays the percentage of total occurrences found within the corresponding bin. If set to 'probability', the height of each bar displays the probability that an event will fall into the corresponding bin. If set to 'density', the height of each bar is equal to the number of occurrences in a bin divided by the size of the bin interval such that summing the area of all bins will yield the total number of occurrences. If set to 'probability density', the height of each bar is equal to the number of probability that an event will fall into the corresponding bin divided by the size of the bin interval such that summing the area of all bins will yield 1. default: None </summary>
union case HistNorm.ProbabilityDensity: HistNorm
val df: Frame<string,string>
Multiple items
module Frame from Deedle

--------------------
type Frame = static member ReadCsv: location: string * hasHeaders: Nullable<bool> * inferTypes: Nullable<bool> * inferRows: Nullable<int> * schema: string * separators: string * culture: string * maxRows: Nullable<int> * missingValues: string[] * preferOptions: bool -> Frame<int,string> + 1 overload static member ReadReader: reader: IDataReader -> Frame<int,string> static member CustomExpanders: Dictionary<Type,Func<obj,seq<string * Type * obj>>> static member NonExpandableInterfaces: ResizeArray<Type> static member NonExpandableTypes: HashSet<Type>

--------------------
type Frame<'TRowKey,'TColumnKey (requires equality and equality)> = interface IDynamicMetaObjectProvider interface INotifyCollectionChanged interface IFrameFormattable interface IFsiFormattable interface IFrame new: rowIndex: IIndex<'TRowKey> * columnIndex: IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: IIndexBuilder * vectorBuilder: IVectorBuilder -> Frame<'TRowKey,'TColumnKey> + 1 overload member AddColumn: column: 'TColumnKey * series: seq<'V> -> unit + 3 overloads member AggregateRowsBy: groupBy: seq<'TColumnKey> * aggBy: seq<'TColumnKey> * aggFunc: Func<Series<'TRowKey,'a>,'b> -> Frame<int,'TColumnKey> member Clone: unit -> Frame<'TRowKey,'TColumnKey> member ColumnApply: f: Func<Series<'TRowKey,'T>,ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey> + 1 overload ...

--------------------
new: names: seq<'TColumnKey> * columns: seq<ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey>
new: rowIndex: Indices.IIndex<'TRowKey> * columnIndex: Indices.IIndex<'TColumnKey> * data: IVector<IVector> * indexBuilder: Indices.IIndexBuilder * vectorBuilder: Vectors.IVectorBuilder -> Frame<'TRowKey,'TColumnKey>
Multiple items
val string: value: 'T -> string
<summary>Converts the argument to a string using <c>ToString</c>.</summary>
<remarks>For standard integer and floating point values the and any type that implements <c>IFormattable</c><c>ToString</c> conversion uses <c>CultureInfo.InvariantCulture</c>. </remarks>
<param name="value">The input value.</param>
<returns>The converted string.</returns>
<example id="string-example"><code lang="fsharp"></code></example>


--------------------
type string = System.String
<summary>An abbreviation for the CLI type <see cref="T:System.String" />.</summary>
<category>Basic Types</category>
static member Frame.ReadCsv: path: string * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string[] * ?preferOptions: bool -> Frame<int,string>
static member Frame.ReadCsv: stream: System.IO.Stream * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string[] * ?preferOptions: bool -> Frame<int,string>
static member Frame.ReadCsv: reader: System.IO.TextReader * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string[] * ?preferOptions: bool -> Frame<int,string>
static member Frame.ReadCsv: stream: System.IO.Stream * hasHeaders: System.Nullable<bool> * inferTypes: System.Nullable<bool> * inferRows: System.Nullable<int> * schema: string * separators: string * culture: string * maxRows: System.Nullable<int> * missingValues: string[] * preferOptions: System.Nullable<bool> -> Frame<int,string>
static member Frame.ReadCsv: location: string * hasHeaders: System.Nullable<bool> * inferTypes: System.Nullable<bool> * inferRows: System.Nullable<int> * schema: string * separators: string * culture: string * maxRows: System.Nullable<int> * missingValues: string[] * preferOptions: bool -> Frame<int,string>
static member Frame.ReadCsv: path: string * indexCol: string * ?hasHeaders: bool * ?inferTypes: bool * ?inferRows: int * ?schema: string * ?separators: string * ?culture: string * ?maxRows: int * ?missingValues: string[] * ?preferOptions: bool -> Frame<'R,string> (requires equality)
val indexRows: column: 'C -> frame: Frame<'R1,'C> -> Frame<'R2,'C> (requires equality and equality and equality)
val rowheader: string[]
property Frame.RowKeys: seq<string> with get
val preData1: float[][]
val preData2: float[][]
Multiple items
val float: value: 'T -> float (requires member op_Explicit)
<summary>Converts the argument to 64-bit float. This is a direct conversion for all primitive numeric types. For strings, the input is converted using <c>Double.Parse()</c> with InvariantCulture settings. Otherwise the operation requires an appropriate static conversion method on the input type.</summary>
<param name="value">The input value.</param>
<returns>The converted float</returns>
<example id="float-example"><code lang="fsharp"></code></example>


--------------------
[<Struct>] type float = System.Double
<summary>An abbreviation for the CLI type <see cref="T:System.Double" />.</summary>
<category>Basic Types</category>


--------------------
type float<'Measure> = float
<summary>The type of double-precision floating point numbers, annotated with a unit of measure. The unit of measure is erased in compiled code and when values of this type are analyzed using reflection. The type is representationally equivalent to <see cref="T:System.Double" />.</summary>
<category index="6">Basic Types with Units of Measure</category>
val getRows: frame: Frame<'R,'C> -> Series<'R,Series<'C,'T>> (requires equality and equality)
Multiple items
module Series from Deedle

--------------------
type Series = static member ofNullables: values: seq<Nullable<'a0>> -> Series<int,'a0> (requires default constructor and value type and 'a0 :> ValueType) static member ofObservations: observations: seq<'c * 'd> -> Series<'c,'d> (requires equality) static member ofOptionalObservations: observations: seq<'K * 'a1 option> -> Series<'K,'a1> (requires equality) static member ofValues: values: seq<'a> -> Series<int,'a>

--------------------
type Series<'K,'V (requires equality)> = interface ISeriesFormattable interface IFsiFormattable interface ISeries<'K> new: index: IIndex<'K> * vector: IVector<'V> * vectorBuilder: IVectorBuilder * indexBuilder: IIndexBuilder -> Series<'K,'V> + 3 overloads member After: lowerExclusive: 'K -> Series<'K,'V> member Aggregate: aggregation: Aggregation<'K> * keySelector: Func<DataSegment<Series<'K,'V>>,'TNewKey> * valueSelector: Func<DataSegment<Series<'K,'V>>,OptionalValue<'R>> -> Series<'TNewKey,'R> (requires equality) + 1 overload member AsyncMaterialize: unit -> Async<Series<'K,'V>> member Before: upperExclusive: 'K -> Series<'K,'V> member Between: lowerInclusive: 'K * upperInclusive: 'K -> Series<'K,'V> member Compare: another: Series<'K,'V> -> Series<'K,Diff<'V>> ...

--------------------
new: pairs: seq<System.Collections.Generic.KeyValuePair<'K,'V>> -> Series<'K,'V>
new: keys: seq<'K> * values: seq<'V> -> Series<'K,'V>
new: keys: 'K[] * values: 'V[] -> Series<'K,'V>
new: index: Indices.IIndex<'K> * vector: IVector<'V> * vectorBuilder: Vectors.IVectorBuilder * indexBuilder: Indices.IIndexBuilder -> Series<'K,'V>
val values: series: Series<'K,'T> -> seq<'T> (requires equality)
val chunkBySize: chunkSize: int -> array: 'T[] -> 'T[][]
<summary>Divides the input array into chunks of size at most <c>chunkSize</c>.</summary>
<param name="chunkSize">The maximum size of each chunk.</param>
<param name="array">The input array.</param>
<returns>The array divided into chunks.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input array is null.</exception>
<exception cref="T:System.ArgumentException">Thrown when <c>chunkSize</c> is not positive.</exception>
<example id="chunk-by-size-1"><code lang="fsharp"> let input = [| 1; 2; 3 |] input |&gt; Array.chunkBySize 2 </code> Evaluates to <c>[| [|1; 2|]; [|3|] |]</c></example>
<example id="chunk-by-size-2"><code lang="fsharp"> let input = [| 1; 2; 3 |] input |&gt; Array.chunkBySize -2 </code> Throws <c>ArgumentException</c></example>
val x: float[][]
val ofSeq: source: seq<'T> -> 'T[]
<summary>Builds a new array from the given enumerable object.</summary>
<param name="source">The input sequence.</param>
<returns>The array of elements from the sequence.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input sequence is null.</exception>
<example id="ofseq-1"><code lang="fsharp"> let inputs = seq { 1; 2; 5 } inputs |&gt; Array.ofSeq </code> Evaluates to <c>[| 1; 2; 5 |]</c>. </example>
val unzip: array: ('T1 * 'T2)[] -> 'T1[] * 'T2[]
<summary>Splits an array of pairs into two arrays.</summary>
<param name="array">The input array.</param>
<returns>The two arrays.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input array is null.</exception>
<example id="unzip-1"><code lang="fsharp"> let inputs = [| (1, "one"); (2, "two") |] let numbers, names = inputs |&gt; Array.unzip </code> Evaluates <c>numbers</c> to <c>[|1; 2|]</c> and <c>names</c> to <c>[|"one"; "two"|]</c>. </example>
val data1: (string * float[])[]
val zip: array1: 'T1[] -> array2: 'T2[] -> ('T1 * 'T2)[]
<summary>Combines the two arrays into an array of pairs. The two arrays must have equal lengths, otherwise an <c>ArgumentException</c> is raised.</summary>
<param name="array1">The first input array.</param>
<param name="array2">The second input array.</param>
<exception cref="T:System.ArgumentNullException">Thrown when either of the input arrays is null.</exception>
<exception cref="T:System.ArgumentException">Thrown when the input arrays differ in length.</exception>
<returns>The array of tupled elements.</returns>
<example id="zip-1"><code lang="fsharp"> let numbers = [|1; 2|] let names = [|"one"; "two"|] Array.zip numbers names </code> Evaluates to <c>[| (1, "one"); (2, "two") |]</c>. </example>
val data2: (string * float[])[]
module SAM from FSharp.Stats.Testing
val corrected1: (string * float[])[]
val medCorrect: float[][]
val medianCentering: data: ('a * float[])[] -> float[][]
<summary> median centering of the data </summary>
val corrected2: (string * float[])[]
val res: SAMResult<string>
val twoClassUnpaired: iterations: int -> fdr: float -> data1: ('a * float[])[] -> data2: ('a * float[])[] -> rnd: System.Random -> SAMResult<'a> (requires 'a :> System.IComparable and equality)
<summary> default version of SAM. Two class unpaired calculation. Rnd can be either System.Random() or System.Random(seed). </summary>
namespace System
Multiple items
type Random = new: unit -> unit + 1 overload member Next: unit -> int + 2 overloads member NextBytes: buffer: byte[] -> unit + 1 overload member NextDouble: unit -> float member NextInt64: unit -> int64 + 2 overloads member NextSingle: unit -> float32 static member Shared: Random
<summary>Represents a pseudo-random number generator, which is an algorithm that produces a sequence of numbers that meet certain statistical requirements for randomness.</summary>

--------------------
System.Random() : System.Random
System.Random(Seed: int) : System.Random
val SAMChart: GenericChart.GenericChart
val observed: SAM<string>[]
SAMResult.NegSigBioitem: SAM<string>[]
<summary> Array of all negatively regulated bioitems at given FDR </summary>
SAMResult.NonSigBioitem: SAM<string>[]
<summary> Array of nonsignificant/unchanged bioitems at given FDR </summary>
SAMResult.PosSigBioitem: SAM<string>[]
<summary> Array of all positively regulated bioitems at given FDR </summary>
val concat: arrays: seq<'T[]> -> 'T[]
<summary>Builds a new array that contains the elements of each of the given sequence of arrays.</summary>
<param name="arrays">The input sequence of arrays.</param>
<returns>The concatenation of the sequence of input arrays.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input sequence is null.</exception>
<example id="concat-1"><code lang="fsharp"> let inputs = [ [| 1; 2 |]; [| 3 |]; [| 4; 5 |] ] inputs |&gt; Array.concat </code> Evaluates to <c>[| 1; 2; 3; 4; 5 |]</c></example>
val obs: float[]
val x: SAM<string>
SAM.Statistics: float
<summary> test statistics </summary>
val expected: float[]
SAMResult.AveragePermutations: SAM<string>[]
<summary> Array of the expected values using the average of permutations </summary>
val minDi: float
val min: source: seq<'T> -> 'T (requires comparison)
<summary>Returns the lowest of all elements of the sequence, compared via <c>Operators.min</c>.</summary>
<param name="source">The input sequence.</param>
<returns>The smallest element of the sequence.</returns>
<exception cref="T:System.ArgumentNullException">Thrown when the input sequence is null.</exception>
<exception cref="T:System.ArgumentException">Thrown when the input sequence is empty.</exception>
<example id="min-1"><code lang="fsharp"> let inputs = [10; 12; 11] inputs |&gt; Seq.min </code> Evaluates to <c>10</c></example>
<example id="min-2"><code lang="fsharp"> let inputs = [] inputs |&gt; Seq.min </code> Throws <c>System.ArgumentException</c>. </example>
val maxDi: float
val max: source: seq<'T> -> 'T (requires comparison)
<summary>Returns the greatest of all elements of the sequence, compared via Operators.max</summary>
<param name="source">The input sequence.</param>
<exception cref="T:System.ArgumentNullException">Thrown when the input sequence is null.</exception>
<exception cref="T:System.ArgumentException">Thrown when the input sequence is empty.</exception>
<returns>The largest element of the sequence.</returns>
<example id="max-1"><code lang="fsharp"> let inputs = [ 10; 12; 11 ] inputs |&gt; Seq.max </code> Evaluates to <c>12</c></example>
<example id="max-2"><code lang="fsharp"> let inputs = [ ] inputs |&gt; Seq.max </code> Throws <c>System.ArgumentException</c>. </example>
val posExpected: float[]
property System.Array.Length: int with get
<summary>Gets the total number of elements in all the dimensions of the <see cref="T:System.Array" />.</summary>
<exception cref="T:System.OverflowException">The array is multidimensional and contains more than <see cref="F:System.Int32.MaxValue" /> elements.</exception>
<returns>The total number of elements in all the dimensions of the <see cref="T:System.Array" />; zero if there are no elements in the array.</returns>
val posChart: GenericChart.GenericChart
static member Chart.Point: xy: seq<#System.IConvertible * #System.IConvertible> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'a2 * ?MultiText: seq<'a2> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: TraceObjects.Marker * ?AlignmentGroup: string * ?OffsetGroup: string * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'a2 :> System.IConvertible)
static member Chart.Point: x: seq<#System.IConvertible> * y: seq<#System.IConvertible> * ?Name: string * ?ShowLegend: bool * ?Opacity: float * ?MultiOpacity: seq<float> * ?Text: 'c * ?MultiText: seq<'c> * ?TextPosition: TextPosition * ?MultiTextPosition: seq<TextPosition> * ?MarkerColor: Color * ?MarkerColorScale: Colorscale * ?MarkerOutline: Line * ?MarkerSymbol: MarkerSymbol * ?MultiMarkerSymbol: seq<MarkerSymbol> * ?Marker: TraceObjects.Marker * ?AlignmentGroup: string * ?OffsetGroup: string * ?StackGroup: string * ?Orientation: Orientation * ?GroupNorm: GroupNorm * ?UseWebGL: bool * ?UseDefaults: bool -> GenericChart.GenericChart (requires 'c :> System.IConvertible)
static member Chart.withLineStyle: ?BackOff: BackOff * ?AutoColorScale: bool * ?CAuto: bool * ?CMax: float * ?CMid: float * ?CMin: float * ?Color: Color * ?ColorAxis: SubPlotId * ?Colorscale: Colorscale * ?ReverseScale: bool * ?ShowScale: bool * ?ColorBar: ColorBar * ?Dash: DrawingStyle * ?Shape: Shape * ?Simplify: bool * ?Smoothing: float * ?Width: float * ?MultiWidth: seq<float> * ?OutlierColor: Color * ?OutlierWidth: float -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Color.fromKeyword: c: ColorKeyword -> Color
union case ColorKeyword.Green: ColorKeyword
static member Chart.withTraceInfo: ?Name: string * ?Visible: Visible * ?ShowLegend: bool * ?LegendRank: int * ?LegendGroup: string * ?LegendGroupTitle: Title -> (GenericChart.GenericChart -> GenericChart.GenericChart)
type Visible = | True | False | LegendOnly member Convert: unit -> obj static member convert: (Visible -> obj)
<summary> Determines whether or not this trace is visible. If "legendonly", the trace is not drawn, but can appear as a legend item (provided that the legend itself is visible). </summary>
union case Visible.True: Visible
val nonex: float[]
val nonchart: GenericChart.GenericChart
union case ColorKeyword.Gray: ColorKeyword
val negex: float[]
val negchart: GenericChart.GenericChart
union case ColorKeyword.Red: ColorKeyword
val samValues: GenericChart.GenericChart
val chartConfig: Config
val svdConfig: ConfigObjects.ToImageButtonOptions
namespace Plotly.NET.ConfigObjects
Multiple items
type ToImageButtonOptions = inherit DynamicObj new: unit -> ToImageButtonOptions static member init: ?Format: ImageFormat * ?Filename: string * ?Width: float * ?Height: float * ?Scale: float -> ToImageButtonOptions static member style: ?Format: ImageFormat * ?Filename: string * ?Width: float * ?Height: float * ?Scale: float -> (ToImageButtonOptions -> ToImageButtonOptions)

--------------------
new: unit -> ConfigObjects.ToImageButtonOptions
static member ConfigObjects.ToImageButtonOptions.init: ?Format: ImageFormat * ?Filename: string * ?Width: float * ?Height: float * ?Scale: float -> ConfigObjects.ToImageButtonOptions
Multiple items
type Format<'Printer,'State,'Residue,'Result> = PrintfFormat<'Printer,'State,'Residue,'Result>
<summary>Type of a formatting expression.</summary>
<typeparam name="Printer">Function type generated by printf.</typeparam>
<typeparam name="State">Type argument passed to %a formatters</typeparam>
<typeparam name="Residue">Value generated by the overall printf action (e.g. sprint generates a string)</typeparam>
<typeparam name="Result">Value generated after post processing (e.g. failwithf generates a string internally then raises an exception)</typeparam>
<category>Language Primitives</category>


--------------------
type Format<'Printer,'State,'Residue,'Result,'Tuple> = PrintfFormat<'Printer,'State,'Residue,'Result,'Tuple>
<summary>Type of a formatting expression.</summary>
<typeparam name="Printer">Function type generated by printf.</typeparam>
<typeparam name="State">Type argument passed to %a formatters</typeparam>
<typeparam name="Residue">Value generated by the overall printf action (e.g. sprint generates a string)</typeparam>
<typeparam name="Result">Value generated after post processing (e.g. failwithf generates a string internally then raises an exception)</typeparam>
<typeparam name="Tuple">Tuple of values generated by scan or match.</typeparam>
<category>Language Primitives</category>
type ImageFormat = | SVG | PNG | JPEG member Convert: unit -> obj override ToString: unit -> string static member convert: (ImageFormat -> obj) static member toString: (ImageFormat -> string)
union case ImageFormat.SVG: ImageFormat
Multiple items
type Config = inherit DynamicObj new: unit -> Config static member combine: first: Config -> second: Config -> Config static member init: ?StaticPlot: bool * ?TypesetMath: bool * ?PlotlyServerUrl: string * ?Editable: bool * ?Edits: Edits * ?EditSelection: bool * ?Autosizable: bool * ?Responsive: bool * ?FillFrame: bool * ?FrameMargins: float * ?ScrollZoom: ScrollZoom * ?DoubleClick: DoubleClick * ?DoubleClickDelay: int * ?ShowAxisDragHandles: bool * ?ShowAxisRangeEntryBoxes: bool * ?ShowTips: bool * ?ShowLink: bool * ?LinkText: string * ?SendData: bool * ?ShowSources: obj * ?DisplayModeBar: bool * ?ShowSendToCloud: bool * ?ShowEditInChartStudio: bool * ?ModeBarButtonsToRemove: seq<ModeBarButton> * ?ModeBarButtonsToAdd: seq<ModeBarButton> * ?ModeBarButtons: seq<seq<ModeBarButton>> * ?ToImageButtonOptions: ToImageButtonOptions * ?Displaylogo: bool * ?Watermark: bool * ?plotGlPixelRatio: float * ?SetBackground: obj * ?TopojsonURL: string * ?MapboxAccessToken: string * ?Logging: int * ?NotifyOnLogging: int * ?QueueLength: int * ?GlobalTransforms: obj * ?Locale: string * ?Locales: obj -> Config static member style: ?StaticPlot: bool * ?TypesetMath: bool * ?PlotlyServerUrl: string * ?Editable: bool * ?Edits: Edits * ?EditSelection: bool * ?Autosizable: bool * ?Responsive: bool * ?FillFrame: bool * ?FrameMargins: float * ?ScrollZoom: ScrollZoom * ?DoubleClick: DoubleClick * ?DoubleClickDelay: int * ?ShowAxisDragHandles: bool * ?ShowAxisRangeEntryBoxes: bool * ?ShowTips: bool * ?ShowLink: bool * ?LinkText: string * ?SendData: bool * ?ShowSources: obj * ?DisplayModeBar: bool * ?ShowSendToCloud: bool * ?ShowEditInChartStudio: bool * ?ModeBarButtonsToRemove: seq<ModeBarButton> * ?ModeBarButtonsToAdd: seq<ModeBarButton> * ?ModeBarButtons: seq<seq<ModeBarButton>> * ?ToImageButtonOptions: ToImageButtonOptions * ?Displaylogo: bool * ?Watermark: bool * ?plotGlPixelRatio: float * ?SetBackground: obj * ?TopojsonURL: string * ?MapboxAccessToken: string * ?Logging: int * ?NotifyOnLogging: int * ?QueueLength: int * ?GlobalTransforms: obj * ?Locale: string * ?Locales: obj -> (Config -> Config)
<summary> The Config object gets passed to the plotly renderer and contains render-specific options. </summary>

--------------------
new: unit -> Config
static member Config.init: ?StaticPlot: bool * ?TypesetMath: bool * ?PlotlyServerUrl: string * ?Editable: bool * ?Edits: ConfigObjects.Edits * ?EditSelection: bool * ?Autosizable: bool * ?Responsive: bool * ?FillFrame: bool * ?FrameMargins: float * ?ScrollZoom: ScrollZoom * ?DoubleClick: DoubleClick * ?DoubleClickDelay: int * ?ShowAxisDragHandles: bool * ?ShowAxisRangeEntryBoxes: bool * ?ShowTips: bool * ?ShowLink: bool * ?LinkText: string * ?SendData: bool * ?ShowSources: obj * ?DisplayModeBar: bool * ?ShowSendToCloud: bool * ?ShowEditInChartStudio: bool * ?ModeBarButtonsToRemove: seq<ModeBarButton> * ?ModeBarButtonsToAdd: seq<ModeBarButton> * ?ModeBarButtons: seq<seq<ModeBarButton>> * ?ToImageButtonOptions: ConfigObjects.ToImageButtonOptions * ?Displaylogo: bool * ?Watermark: bool * ?plotGlPixelRatio: float * ?SetBackground: obj * ?TopojsonURL: string * ?MapboxAccessToken: string * ?Logging: int * ?NotifyOnLogging: int * ?QueueLength: int * ?GlobalTransforms: obj * ?Locale: string * ?Locales: obj -> Config
type ModeBarButton = | ToImage | SendDataToCloud | EditInChartStudio | Zoom2d | Pan2d | Select2d | Lasso2d | DrawClosedPath | DrawOpenPath | DrawLine ... member Convert: unit -> obj override ToString: unit -> string static member convert: (ModeBarButton -> obj) static member ofString: (string -> ModeBarButton) static member toString: (ModeBarButton -> string)
union case ModeBarButton.HoverCompareCartesian: ModeBarButton
val cutLineUp: float list
SAMResult.Delta: float
<summary> treshold, absolute difference between observed and expected statistics </summary>
val cutsUp: GenericChart.GenericChart
union case ColorKeyword.Purple: ColorKeyword
val cutLineLow: float list
val cutsLow: GenericChart.GenericChart
val linechart: GenericChart.GenericChart
union case ColorKeyword.Black: ColorKeyword
val uppercut: GenericChart.GenericChart
val xAnchorUppercut: float list
val init: length: int -> initializer: (int -> 'T) -> 'T list
<summary>Creates a list by calling the given generator on each index.</summary>
<param name="length">The length of the list to generate.</param>
<param name="initializer">The function to generate an element from an index.</param>
<exception cref="T:System.ArgumentException">Thrown when the input length is negative.</exception>
<returns>The list of generated elements.</returns>
<example id="init-1"><code lang="fsharp"> List.init 4 (fun v -&gt; v + 5) </code> Evaluates to <c>[5; 6; 7; 8]</c></example>
<example id="init-2"><code lang="fsharp"> List.init -5 (fun v -&gt; v + 5) </code> Throws <c>ArgumentException</c></example>
property List.Length: int with get
<summary>Gets the number of items contained in the list</summary>
val x: int
SAMResult.UpperCut: float
<summary> first Statistic where the difference of observed and expected is greater than delta </summary>
val lowercut: GenericChart.GenericChart
SAMResult.LowerCut: float
<summary> first Statistic where the difference of observed and expected is greater than delta </summary>
val plot: GenericChart.GenericChart
static member Chart.withTitle: title: Title -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Chart.withTitle: title: string * ?TitleFont: Font -> (GenericChart.GenericChart -> GenericChart.GenericChart)
static member Chart.withConfig: config: Config -> (GenericChart.GenericChart -> GenericChart.GenericChart)
namespace System.IO
type File = static member AppendAllLines: path: string * contents: IEnumerable<string> -> unit + 1 overload static member AppendAllLinesAsync: path: string * contents: IEnumerable<string> * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 1 overload static member AppendAllText: path: string * contents: string -> unit + 1 overload static member AppendAllTextAsync: path: string * contents: string * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 1 overload static member AppendText: path: string -> StreamWriter static member Copy: sourceFileName: string * destFileName: string -> unit + 1 overload static member Create: path: string -> FileStream + 2 overloads static member CreateSymbolicLink: path: string * pathToTarget: string -> FileSystemInfo static member CreateText: path: string -> StreamWriter static member Decrypt: path: string -> unit ...
<summary>Provides static methods for the creation, copying, deletion, moving, and opening of a single file, and aids in the creation of <see cref="T:System.IO.FileStream" /> objects.</summary>
System.IO.File.ReadAllText(path: string) : string
System.IO.File.ReadAllText(path: string, encoding: System.Text.Encoding) : string