Summary: this tutorial explains how to perform various statistical tests with FSharp.Stats.
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.
By using a t test a difference of means can be evaluated. There are different kinds of t test designs implemented in FSharp.Stats.
-
One sample t test:
- Is the population mean equal to the value of H0?
- e.g. “Is my grade different from the distribution mean?”
-
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.
-
Two sample t test with unequal variances
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
*)
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'
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.
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.
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 }
|
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
WIP
WIP
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
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"]
)
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
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])
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 }|]
|
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
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).
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"
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\)
\(qvalue_p = \frac{\#(false positives)}{\#positives}\)
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 (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 |> Seq.groupBy (fun n -> 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 |> Seq.map (fun x -> 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 |> 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 |> List.sortBy (fun s -> 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 |> List.map (fun x -> 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 |> 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 |> Array.map (fun x -> 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 |> String.concat " " // evaluates "Stefan says: Hello there!"
let input2 = [0..9] |> List.map string
input2 |> String.concat "" // evaluates "0123456789"
input2 |> String.concat ", " // evaluates "0, 1, 2, 3, 4, 5, 6, 7, 8, 9"
let input3 = ["No comma"]
input3 |> 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 &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 &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 |> 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 |> 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 |> 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 |> 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 |> 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 |> Seq.min
</code>
Evaluates to <c>10</c></example>
<example id="min-2"><code lang="fsharp">
let inputs = []
inputs |> 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 |> Seq.max
</code>
Evaluates to <c>12</c></example>
<example id="max-2"><code lang="fsharp">
let inputs = [ ]
inputs |> 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 -> v + 5)
</code>
Evaluates to <c>[5; 6; 7; 8]</c></example>
<example id="init-2"><code lang="fsharp">
List.init -5 (fun v -> 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