Choose a method · Choose a method
Statistical test chooser: which test fits your experiment
Answer a few questions about your design and data and get the test to run, why it fits, what to do next, and R and Python code that runs as shown. Each rule is cited.
Test chooser
Answer the questions about your experiment. The recommendation appears as soon as it is determined.
What did you measure on each animal, sample or subject?
What do you want to know?
How many groups or conditions?
Were the same animals or samples measured in every condition?
Is each yes/no recorded once per animal, or for many cells, fields or pups from each animal?
How are the groups defined?
What do the values look like?
Did you take several measurements from each animal or culture (cells, fields, technical replicates)?
Did you record several pairs of values from each animal (time points, cells, wells)?
Are any expected counts small? (Below 5 in more than a fifth of the cells, or any below 1)
Start with the first question.
Next:
Check before you run it:
Read more:
Show the R and Python code
R
Python
Runs in your browser. Your answers are not sent anywhere.
On this page
Quick answer. For three or more independent groups compared on one factor, with one roughly symmetric value per animal, run Welch’s ANOVA, then Games–Howell comparisons; for two such groups, run Welch’s t-test. Count animals, not cells or wells, as n: if you took several values per animal, first reduce them to one value per animal. For any other design, answer the questions above: what you measured, how many groups, whether the same animals appear in more than one group, the shape of the values and how many values each animal gave. The result names one test, why it fits, what to report, one check to run first, a Methods sentence and R and Python code. Without the questions, the decision table applies the same rules. Already have a p-value? Start with check what your code or AI assistant ran.
Terms used below. n is the number of independent units: animals or independent cultures. Welch’s t-test compares two group means, and Welch’s ANOVA (also called Welch’s F-test) three or more, without assuming that the groups vary equally (equal variances). Games–Howell compares every pair of groups, each pair with its own spread, and adjusts for the number of pairs; SciPy runs it as tukey_hsd(..., equal_var=False). Holm’s adjustment raises a set of p-values so that the chance of any false positive across the set stays at or below 5%. Degrees of freedom (df) are the numbers printed with a test statistic; they depend on n, and Welch’s tests print a decimal one. A 95% confidence interval (CI) is the range of differences compatible with the data; simultaneous intervals are widened for the number of comparisons. Roughly symmetric means that in a dot plot of each group the values are balanced around the middle, with no value far out on one side. A mixed model analyses every value and lets the values from one animal share that animal’s level (animal as a random effect; a random intercept gives each animal its own level). When the same animals are in more than one condition, a condition-by-animal term also lets each animal respond to the condition in its own way; without it, every cell counts as independent evidence about the condition. The Greenhouse–Geisser correction adjusts a repeated-measures ANOVA’s p-value when time points are unequally correlated. Pseudoreplication is counting several values from one animal as independent. The expected count of a table cell is row total × column total ÷ grand total. A permutation p-value comes from reshuffling the data many times.
How to use it
- Put your data in long format: one row per animal, a column for the group and a column for the value, as in the worked example’s code. If your values sit in one column per group (a data frame
wide), turn them into long format with R’sd <- setNames(stack(wide), c("weight", "dose"))or pandas’d = wide.melt(var_name="dose", value_name="weight"). For a yes/no recorded per cell (for example % positive cells), keep one row per animal with two counts,positiveandcounted. - If you took several values per animal (cells, wells, technical replicates), answer “yes” to that question. The result then starts with averaging per animal, or per animal and condition when the same animals are in more than one condition; the alternative it offers is a mixed model, which includes a condition-by-animal term whenever the same animals contribute to more than one condition. For a yes/no recorded per cell, choose the option for many cells per animal; the result then works on one percentage per animal. Cell-type composition across several categories is not covered: see comparing percentages between groups.
- Before you answer the shape question, plot every value by group (R, with the worked example’s columns:
stripchart(weight ~ dose, data = d, vertical = TRUE)). Values balanced around the middle: roughly symmetric. Positive measurements with a long tail of high values (concentrations, fold changes): positive and right-skewed. Scores, or a value far from the rest that a log scale does not pull in: the rank-based option. Decide this before you look at p-values, and if your written plan named a test, keep it. - Answer the questions; change an answer to see how the recommendation changes.
- Run the check the result lists, and switch test if the check tells you to.
- Copy the R or Python code, replace the example values with yours (with your own data shows how) and run it. The R code needs the packages it calls (
install.packages(c("rstatix", "car", "lme4", "lmerTest", "survival", "afex"))); the Python code needspip install "scipy>=1.16" statsmodels pandas pingouin scikit-posthocs(SciPy 1.16 added Games–Howell). - Copy the Methods sentence and fill in your software, version and n.
What the recommendation means
The chooser starts from your experiment. It asks what you measured, how many groups you compare, whether the same animals appear in more than one group, and what the values look like. Its answer is the test that fits that design, with three things you can act on:
- Why it fits, in one sentence you can adapt for Methods.
- What to do next: the follow-up comparisons or the effect size to report.
- One check before you run it, written as a decision (“if …, use … instead”).
The R and Python code uses small example data so you can run it, see the output and then swap in your own values. The effect to report is named in each result: for group comparisons, the difference between groups with its 95% confidence interval.
Two choices are made for you on purpose. For measurements from independent groups, the chooser recommends Welch’s versions of the t-test and ANOVA, which allow unequal variances; using them unconditionally protects the error rate better than first running a variance test (Zimmerman 2004; Delacre et al. 2017). And when you took several values from each animal, it first asks you to reduce them to one value per animal or to model the animal, because values from one animal share that animal’s biology and count as one observation (Lazic 2010).
Use the recommendation as your starting point, and run the one check it lists before you analyse.
A worked example
You weighed mice in three dose groups (vehicle, low, high), five mice per group, one weight per mouse (grams):
| Vehicle | Low | High |
|---|---|---|
| 24.1, 25.3, 23.8, 26.0, 24.7 | 22.0, 23.4, 21.5, 24.9, 22.8 | 19.5, 21.9, 18.7, 23.6, 20.2 |
A dot plot shows symmetric weights without extreme outliers, but the high-dose group varies more.
Your answers: a measurement → whether groups differ → three or more → different animals in each group → one factor → symmetric, no extreme outliers → one value per animal.
The chooser recommends Welch’s ANOVA, then Games–Howell comparisons, and lists this check: if you only need each dose against vehicle, decide that before the analysis and use Welch’s t-tests against vehicle with Holm’s adjustment instead of all pairs. Here all pairs were planned, so the recommendation stands. The code it gives:
d <- data.frame(
weight = c(24.1, 25.3, 23.8, 26.0, 24.7, 22.0, 23.4, 21.5, 24.9, 22.8, 19.5, 21.9, 18.7, 23.6, 20.2),
dose = factor(rep(c("vehicle", "low", "high"), each = 5), levels = c("vehicle", "low", "high"))
)
oneway.test(weight ~ dose, data = d) # Welch is the default (var.equal = FALSE)
rstatix::games_howell_test(d, weight ~ dose)
from scipy import stats
from statsmodels.stats.oneway import anova_oneway
import pandas as pd
d = pd.DataFrame({
"weight": [24.1, 25.3, 23.8, 26.0, 24.7, 22.0, 23.4, 21.5, 24.9, 22.8, 19.5, 21.9, 18.7, 23.6, 20.2],
"dose": ["vehicle"] * 5 + ["low"] * 5 + ["high"] * 5,
})
names = ["vehicle", "low", "high"]
groups = [d.loc[d.dose == g, "weight"] for g in names]
w = anova_oneway(groups, use_var="unequal") # Welch's ANOVA
print(f"Welch F = {w.statistic:.3f} on {w.df[0]:.0f} and {w.df[1]:.2f} df, p = {w.pvalue:.3g}")
gh = stats.tukey_hsd(*groups, equal_var=False) # Games–Howell
ci = gh.confidence_interval()
for i in range(3):
for j in range(i):
print(f"{names[i]} - {names[j]}: {gh.statistic[i, j]:.2f}, 95% CI {ci.low[i, j]:.2f} to {ci.high[i, j]:.2f}, p = {gh.pvalue[i, j]:.2g}")
| Step | Result (R 4.3.3 and Python with SciPy 1.18.1 and statsmodels 0.15.0 agree) |
|---|---|
| Welch’s ANOVA | F = 9.16 on 2 and 7.34 degrees of freedom, p = 0.010 |
| Games–Howell, high − vehicle | −4.00 g, 95% CI −7.03 to −0.97, p = 0.017 |
| Games–Howell, low − vehicle | −1.86 g, 95% CI −3.96 to 0.24, p = 0.080 |
| Games–Howell, high − low | −2.14 g, 95% CI −5.27 to 0.99, p = 0.178 |
So the overall test finds a difference, and the pairwise comparisons place it between vehicle and high dose; the intervals are simultaneous (adjusted for the three comparisons). The SciPy function is named tukey_hsd, but with equal_var=False it runs Games–Howell, so report it as Games–Howell. With five mice per group only large differences are detectable, so the low-dose interval, which runs from a 4 g loss to a small gain, does not show that low dose has no effect; the sample size calculator shows what your n can detect. If the overall test had been significant with no significant pair, the guide to that situation explains what to report.
With your own data
Save one row per mouse with columns mouse, dose and weight, then replace the first lines of the code. The order you list the groups in sets the sign of every pairwise difference:
d <- read.csv("weights.csv") # columns mouse, dose, weight: one row per mouse
d$dose <- factor(d$dose, levels = c("vehicle", "low", "high")) # this order sets the sign of each difference
d = pd.read_csv("weights.csv") # columns mouse, dose, weight: one row per mouse
names = ["vehicle", "low", "high"] # this order sets the sign of each difference
Now change one answer: say you weighed each mouse four times. The chooser keeps the same test but adds a first step: average the four weighings per mouse (n = 5 mice per group, rather than 20 weighings), or fit a mixed model with mouse as a random effect (each mouse is in one group here, so a random intercept for mouse is enough). The result shows code for both. With one row per weighing, the averaging is one line, and the rest of the code runs on its output:
reps <- read.csv("weighings.csv") # one row per weighing: mouse, dose, weight
d <- aggregate(weight ~ mouse + dose, data = reps, FUN = mean) # one row per mouse
d$dose <- factor(d$dose, levels = c("vehicle", "low", "high"))
reps = pd.read_csv("weighings.csv") # one row per weighing: mouse, dose, weight
d = reps.groupby(["mouse", "dose"], as_index=False)["weight"].mean() # one row per mouse
Use either route, and report n as the number of mice.
The decision rules and their sources
Each rule below is what the chooser applies. Every rule for measurements assumes one value per animal or independent culture; if you took several, the first row applies before any other.
| Your situation | Recommendation | Why | Source |
|---|---|---|---|
| Several values per animal or culture (apply first) | Reduce to one value per animal (per animal and condition when the same animals are in more than one condition), then the row below that fits; or a mixed model, which needs a condition-by-animal term whenever the same animals contribute to more than one condition | Values from one animal are not independent; counting them as n is pseudoreplication. Without the condition-by-animal term, a mixed model on a within-animal design gave 32.8% false positives against 5.0% for a paired t-test on per-animal means with no true effect (5 mice, 15 cells per mouse and condition, 1,000 runs; our simulation) | Lazic 2010 (unit of analysis); our simulation (false positives) |
| Two independent groups, measurement, roughly symmetric values | Welch’s t-test | Controls false positives when variances differ and loses little when they are equal | Welch 1947; Delacre et al. 2017 |
| Positive, right-skewed measurements (concentrations, fold changes), two independent groups | Welch’s t-test on log values (positive values only, no zeros); report the ratio of geometric means | The log scale evens out the spread and turns the difference into a fold change | Keene 1995; Welch 1947 |
| Scores, or values with extreme outliers that a log scale does not tame, two independent groups | Mann–Whitney U test | Uses ranks, so extreme values do not dominate | Mann & Whitney 1947 |
| Same animals measured twice | Paired t-test (on log values for positive, right-skewed measurements); Wilcoxon signed-rank for scores or outlier-prone differences | Works on within-animal differences | Keene 1995; Wilcoxon 1945 |
| Three or more independent groups, one factor, roughly symmetric values, one value per animal or independent culture | Welch’s ANOVA, then Games–Howell (each group vs one control only, planned before the analysis: Welch’s t-tests with Holm’s adjustment); with several values per animal, reduce first (first row) | Recommended as the default over the classical F-test under realistic variance differences | Welch 1951; Delacre et al. 2019; Games & Howell 1976 |
| Positive, right-skewed measurements, three or more independent groups | Welch’s ANOVA on log values (positive values only, no zeros), then Games–Howell; report ratios of geometric means | Compares geometric means without assuming equal spreads | Keene 1995; Welch 1951; Games & Howell 1976 |
| Scores, or values with extreme outliers that a log scale does not tame, three or more groups | Kruskal–Wallis, then Dunn’s comparisons with Holm’s adjustment | Rank-based one-way analysis; it asks whether some groups tend to have higher values, and does not fix unequal spreads | Kruskal & Wallis 1952; Dunn 1964 |
| Two crossed factors (for example genotype × treatment), independent animals, at least two animals per combination | Two-way ANOVA with the interaction term (when group sizes differ, state the sums-of-squares type; the code uses Type II); if the interaction matters, compare one factor within each level of the other | A claim that an effect differs between groups is a claim about the interaction; separate t-tests cannot test it | Gelman & Stern 2006; Nieuwenhuis et al. 2011 |
| Same animals at three or more time points | Linear mixed model (on log values for positive, right-skewed measurements), which keeps an animal with a missing time point; only with complete data, repeated-measures ANOVA with the Greenhouse–Geisser correction; Friedman test for scores or extreme outliers. The Python code runs only the repeated-measures ANOVA, so with a missing time point use the R code | The mixed model keeps animals with a missing time point; with complete data it gives the same uncorrected F as repeated-measures ANOVA, whose Greenhouse–Geisser correction protects against unequal correlations between time points; Friedman uses within-animal ranks | Greenhouse & Geisser 1959; Friedman 1937 |
| Categories recorded once per animal, independent groups, no expected count below 1 and no more than 20% below 5 | Chi-square test, without Yates’ continuity correction (check the expected counts first) | The approximation holds under this expected-count rule; with Yates’ correction the test was as cautious as Fisher’s exact test or more (chi-square guide, our simulation) | Kim 2017 (rule from Cochran 1954); chi-square guide |
| Categories recorded once per animal, independent groups, any expected count below 1 or more than 20% below 5 | Fisher’s exact test (any table size), or Boschloo’s test for a 2 × 2 table | Exact tests hold the error rate; unconditional tests generally have more power for 2 × 2 tables | Lydersen et al. 2009 |
| Yes/no recorded once per animal, measured twice on the same animals | Exact McNemar test | Uses only the pairs that changed | McNemar 1947 |
| Yes/no recorded once per animal, measured three or more times | Cochran’s Q test | Extends McNemar’s test to several matched measurements | Cochran 1950 |
| Yes/no recorded for many cells, fields or pups per animal (a count out of a total) | One percentage per animal (per litter for pups from treated dams; per dam if a dam contributes more than one litter), then Welch’s t-test (two groups), Welch’s ANOVA with Games–Howell (three or more groups), a paired t-test (both conditions in each animal) or paired t-tests for the planned pairs with Holm’s adjustment (three or more conditions in each animal) | Cells from one animal are not independent. When animals differed, a test on pooled cells gave 29–56% false positives and Welch’s test on per-animal percentages at most 4.8%, with 3–8 animals per group (our simulation, not a figure from Lazic 2010); paired tests per planned pair do not assume equal correlations between conditions | Lazic 2010 (unit of analysis); percentages guide |
| Time to an event, survival curves that do not cross | Kaplan–Meier and log-rank test, and Cox regression, while the curves do not cross (next row if they do) | Uses animals without an event (censored) instead of discarding them | Kaplan & Meier 1958; Bland & Altman 2004; Cox 1972 |
| Time to an event, survival curves that cross | Describe the curves; restricted mean survival time instead of a single hazard ratio | A single hazard ratio summarises crossing curves poorly | Royston & Parmar 2013 |
| Two measurements, several pairs per animal (apply first) | Pick the question: correlate per-animal means (between animals, n = animals) or a repeated-measures correlation (within animals) | Pairs from one animal are not independent; a correlation over all rows mixes the two questions | Bland & Altman 1995a, 1995b; Bakdash & Marusich 2017 |
| Two measurements that measure the same quantity (two assays, two observers) | A Bland–Altman analysis, not a correlation (flagged in every correlation result) | A correlation measures association, not agreement | Bland & Altman 1986 |
| Two measurements that rise and then fall | Neither coefficient: describe the curve with a regression that allows it (flagged in every correlation result) | Both coefficients summarise one direction; plot the data before you summarise it | Anscombe 1973 (plot first) |
| Two measurements, straight-line relationship | Pearson correlation, with its 95% CI | Measures linear association | Schober et al. 2018 |
| Two measurements, curved, skewed or with outliers, or scores | Spearman correlation, with a 95% CI (Fisher z with the Bonett–Wright standard error) and a permutation p-value | Measures monotonic association using ranks. The permutation p-value is our choice for small n: SciPy’s default p-value is approximate at small n, and R has no exact p-value with ties | Schober et al. 2018 (coefficient); Bonett & Wright 2000 (standard error) |
Designs the chooser does not route: one factor between animals combined with one within animals (for example genotype × time; see the repeated-measures guide), cell-type composition across several categories (see comparing percentages between groups), counts per animal such as lesions or colonies (see statistical tests for count data), dose as a continuous predictor (regression), and a single group compared with a fixed value. For these, use the linked guides or ask a statistician before you analyse.
How the chooser was checked
| Check | Result |
|---|---|
| Every combination of answers | 57 answer paths, each ending in exactly one of 24 recommendations; every recommendation is reachable and appears in the decision table above; a link made before the latest questions were added stops at the new question and shows no result until it is answered; answered as the earlier version assumed (once per animal; one pair per animal), it gives the earlier recommendation (automated tests, run on every change) |
| Content of each recommendation | Each has a reason, a next step, a check, a methods sentence and R and Python code (automated test) |
| Links to guides | Every linked guide exists (automated test) |
| Code runs as shown | 27 R snippets (R 4.3.3; afex 1.3-1, car 3.1-2, lme4 1.1-35.1, lmerTest 3.1-3, rstatix 0.7.2, survival 3.5-8) and 27 Python snippets (Python 3.13; SciPy 1.18.1, statsmodels 0.15.0, pingouin 0.7.0, scikit-posthocs 0.17.1) for the 24 recommendations and 3 first steps, plus the 15 combined scripts the chooser copies when a first step is added, ran without errors or warnings; the Spearman code was also run on tied scores and on data with rs = 1 |
| R and Python agree | Same statistics and p-values for every recommendation except the differences listed below, for example Welch’s ANOVA F = 9.160 (both), Kruskal–Wallis H = 11.52 (both), Cochran’s Q = 6.33 (both), two-way ANOVA interaction F = 13.02 (both), Spearman rs = 0.79 with permutation p = 0.028 (both) |
Five differences between the languages are real and worth knowing. First, with zero differences in a signed-rank test, both drop the zeros, but R 4.3.3 then switches to a normal approximation (with a warning) while SciPy’s default stays exact; on seven pairs with one zero difference this gave p = 0.036 in R and p = 0.031 in SciPy (R 4.6.0 changed how zeros are handled, so name your R version). Second, for Boschloo’s test, SciPy’s two-sided p-value is twice the smaller one-sided value, which is also exact2x2’s default (“central”); exact2x2 additionally offers the traditional “minlike” statistic. On our example table, passed to SciPy with groups as columns, SciPy and exact2x2’s default (“central”) both gave 0.016 (the traditional “minlike” statistic gave 0.025). Third, on the chi-square guide’s table, exact2x2 1.7.0 reports 0.033 instead of SciPy’s 0.041 because it compares floating-point p-values with exact equality and drops a tied table; the guide gives a workaround. Fourth, for Spearman’s permutation p-value, the Python code enumerates every ordering when there are 8 or fewer animals (a choice in our code, not a SciPy default), while the R code draws 200,000 random shuffles, so the two agree to about two significant digits; for p-values near 1 in 200,000, use the Python code or, without ties, R’s exact cor.test. Fifth, for repeated measurements, the R code fits a mixed model (which keeps an animal with a missing measurement) and also runs repeated-measures ANOVA with the Greenhouse–Geisser correction, while the Python code runs only the repeated-measures ANOVA (statsmodels’ mixed model reports z-tests, which are too liberal with few animals); with complete data the uncorrected F is the same in both, and both print the corrected p. Name the software and method in Methods so a reader can reproduce your number.
Questions a reviewer may ask
-
“Why Welch rather than Student’s t-test or the classical ANOVA?” Welch’s versions protect the error rate when variances differ and cost little power when they are equal; testing variances first does not help (Delacre et al. 2017, 2019; Zimmerman 2004).
-
“Did you test normality first?” For the t-test and ANOVA the question is whether the values are close to symmetric without extreme outliers, judged from a plot; positive, right-skewed measurements go to the log scale, and scores or values with extreme outliers go to a rank-based test.
-
“What is n?” The number of independent units (animals or independent cultures); cells and wells from one animal count toward that animal. The chooser asks this explicitly.
-
“Did you correct for multiple comparisons?” Each recommendation for three or more groups names its follow-up procedure; which correction to use explains the choice.
-
“Justify your sample size.” Give the calculation you planned with, or a sensitivity analysis of the smallest effect your n could detect (sample size calculator).
-
“Report effect sizes.” Give each difference between groups with its 95% confidence interval, as in the worked example.
-
“You used the wrong test.” If your written plan named the test you ran, keep it as the main analysis and report the recommended test as a labelled sensitivity analysis. With no written plan, say so, rerun with the recommended test as the main analysis, report the earlier test as a labelled sensitivity analysis, and say in the response letter what changed. If the two disagree, write: “The [planned] analysis gave [result]; the [other] analysis, reported as a sensitivity analysis, gave [result], so the conclusion depends on the choice of test.”
Copy the answer that matches your reviewer’s question into your response letter, with its source.
Check what your code or AI assistant ran
Three checks on a result you were given:
- Count n. Count the rows of data and the n printed per group: they should be animals, not cells or wells. With 15 mice in 3 groups, a classical ANOVA prints df 2 and 12 (n − groups); Welch’s ANOVA prints 2 and a smaller decimal (7.34 above). A second df far above n − groups means the code counted cells or wells.
- Find the variance setting. SciPy’s
ttest_indandf_onewayassume equal variances unless you passequal_var=False; R’st.testandoneway.testuse Welch’s versions by default. Non-integer degrees of freedom (7.34 above) show that Welch’s version ran. - Find the follow-up. Check that the post hoc procedure is the one you planned (all pairs or only versus control) and that the p-values printed are adjusted.
If any check fails, rerun with the chooser’s code.
Report it
Copy the methods sentence from the result and add your software and version. Example for the worked example:
Body weight was compared across the three dose groups with Welch’s one-way ANOVA, followed by Games–Howell pairwise comparisons (α = 0.05), using R 4.3.3 (rstatix 0.7.2). Each mouse contributed one value (n = 5 per group).
And a Results sentence:
Body weight differed across dose groups (Welch’s ANOVA, F(2, 7.34) = 9.16, p = 0.010); high-dose mice weighed 4.00 g less than vehicle mice (Games–Howell, simultaneous 95% CI 0.97 to 7.03 g less; adjusted p = 0.017).
Template to fill in:
[Outcome] was compared across [groups] with [test][, followed by [follow-up procedure] — delete if there is none] (α = 0.05), using [software and version]. [Each [animal/culture] contributed one value / Each animal contributed several values, averaged per animal / Each animal contributed several values, modelled with animal as a random effect] (n = [number] per group).
Cite this tool
Licklider. Statistical test chooser. https://www.licklider.ai/tools/statistical-test-chooser/ (version 1.1, accessed [date]).
Corrected (10 November 2026): the Python code for Boschloo’s test passed the table with groups as rows; SciPy treats each column as one group, so the code now transposes the table, and the SciPy value quoted above changed from 0.021 to 0.016. The same note no longer presents exact2x2’s differing value as an equally valid definition: exact2x2 1.7.0 can drop a tied table.
Corrected (11 November 2026): a yes/no recorded for many cells per animal was sent to a chi-square, Fisher, McNemar or Cochran’s Q test on the pooled cells, which treats cells as independent animals, and a correlation with several measurements per animal was computed over all rows without a warning; the chooser now asks first and works on one percentage per animal, or on per-animal means or a repeated-measures correlation. The Spearman result now reports rs with a confidence interval and a permutation p-value: the earlier Python code printed SciPy’s large-sample p-value, which can be too small with few animals, and the earlier example data gave rs = 1. The Python code for Welch’s ANOVA (also on log values) now prints the Games–Howell confidence intervals the result asks for, and the Python code for repeated measurements and for several values per animal no longer reports statsmodels’ z-test p-value alone. For paired and repeated designs with several values per animal, the first step offered a mixed model with only a random intercept per animal, which treats every cell as evidence about the within-animal effect (32.8% false positives in our simulation with no effect, against 5.0% after averaging); it now averages per animal and condition, and any mixed model includes the condition-by-animal term. The repeated-measures results now say when to report the Greenhouse–Geisser-corrected p. The outcome option no longer lists “cell type”: a cell classified into several types (composition data) is not routed by the chooser; see comparing percentages between groups. If you used version 1.0, run the chooser again when your answers involve a yes/no per cell (for example % positive cells), several pairs of values per animal for a correlation, Spearman’s correlation, repeated measurements or several values per animal in a paired or repeated design. The false-positive rates come from our simulation for the within-animal design (output) and the percentages guide’s simulation.
Changelog: version 1.1 (11 November 2026) — asks what each yes/no describes and adds four per-animal percentage routes; asks about several pairs of values per animal for correlations; Spearman with interval and permutation p-value; Bland–Altman and rise-then-fall checks on both correlation results; Python code for Games–Howell intervals, Pearson’s interval and small-sample mixed-model p-values; guide links on the correlation, categorical, repeated-measures and survival results; first step per animal and condition for paired designs; Greenhouse–Geisser rule, R code and Methods alternatives on the repeated-measures results; Welch degrees of freedom printed in Python; the signed-rank result names the R version that changed how zeros are handled; results for the same animals in more than one condition say that designs with separate groups as well (genotype × time) are not covered; only the result headline is announced to screen readers; the link in the address bar follows the answers. Version 1.0 (10 November 2026) — measurements, scores, categories and time-to-event outcomes; two and three or more groups; independent, paired and repeated designs; two crossed factors; several values per animal; correlation.
References
- Anscombe FJ (1973). Graphs in statistical analysis. The American Statistician 27:17–21. doi:10.1080/00031305.1973.10478966
- Bakdash JZ, Marusich LR (2017). Repeated measures correlation. Frontiers in Psychology 8:456. doi:10.3389/fpsyg.2017.00456 (corrigendum 2019, notation in two equations: doi:10.3389/fpsyg.2019.01201)
- Bland JM, Altman DG (1995a). Calculating correlation coefficients with repeated observations: part 1 — correlation within subjects. BMJ 310:446. doi:10.1136/bmj.310.6977.446
- Bland JM, Altman DG (1995b). Calculating correlation coefficients with repeated observations: part 2 — correlation between subjects. BMJ 310:633. doi:10.1136/bmj.310.6980.633
- Bland JM, Altman DG (2004). The logrank test. BMJ 328:1073. doi:10.1136/bmj.328.7447.1073
- Bland JM, Altman DG (1986). Statistical methods for assessing agreement between two methods of clinical measurement. The Lancet 327(8476):307–310. doi:10.1016/S0140-6736(86)90837-8
- Bonett DG, Wright TA (2000). Sample size requirements for estimating Pearson, Kendall and Spearman correlations. Psychometrika 65:23–28. doi:10.1007/BF02294183
- Cochran WG (1950). The comparison of percentages in matched samples. Biometrika 37(3–4):256–266. doi:10.1093/biomet/37.3-4.256
- Cochran WG (1954). Some methods for strengthening the common χ² tests. Biometrics 10(4):417–451. doi:10.2307/3001616
- Cox DR (1972). Regression models and life-tables. Journal of the Royal Statistical Society, Series B 34(2):187–202. doi:10.1111/j.2517-6161.1972.tb00899.x
- Delacre M, Lakens D, Leys C (2017). Why psychologists should by default use Welch’s t-test instead of Student’s t-test. International Review of Social Psychology 30(1):92–101. doi:10.5334/irsp.82 (correction: doi:10.5334/irsp.661)
- Delacre M, Leys C, Mora YL, Lakens D (2019). Taking parametric assumptions seriously: arguments for the use of Welch’s F-test instead of the classical F-test in one-way ANOVA. International Review of Social Psychology 32(1):13. doi:10.5334/irsp.198
- Dunn OJ (1964). Multiple comparisons using rank sums. Technometrics 6(3):241–252. doi:10.1080/00401706.1964.10490181
- Friedman M (1937). The use of ranks to avoid the assumption of normality implicit in the analysis of variance. Journal of the American Statistical Association 32(200):675–701. doi:10.1080/01621459.1937.10503522
- Games PA, Howell JF (1976). Pairwise multiple comparison procedures with unequal N’s and/or variances: a Monte Carlo study. Journal of Educational Statistics 1(2):113–125. doi:10.3102/10769986001002113
- Gelman A, Stern H (2006). The difference between “significant” and “not significant” is not itself statistically significant. The American Statistician 60(4):328–331. doi:10.1198/000313006X152649
- Greenhouse SW, Geisser S (1959). On methods in the analysis of profile data. Psychometrika 24(2):95–112. doi:10.1007/BF02289823
- Kaplan EL, Meier P (1958). Nonparametric estimation from incomplete observations. Journal of the American Statistical Association 53(282):457–481. doi:10.1080/01621459.1958.10501452
- Keene ON (1995). The log transformation is special. Statistics in Medicine 14(8):811–819. doi:10.1002/sim.4780140810
- Kim H-Y (2017). Statistical notes for clinical researchers: chi-squared test and Fisher’s exact test. Restorative Dentistry & Endodontics 42(2):152–155. doi:10.5395/rde.2017.42.2.152
- Kruskal WH, Wallis WA (1952). Use of ranks in one-criterion variance analysis. Journal of the American Statistical Association 47(260):583–621. doi:10.1080/01621459.1952.10483441
- Lazic SE (2010). The problem of pseudoreplication in neuroscientific studies: is it affecting your analysis? BMC Neuroscience 11:5. doi:10.1186/1471-2202-11-5
- Lydersen S, Fagerland MW, Laake P (2009). Recommended tests for association in 2 × 2 tables. Statistics in Medicine 28(7):1159–1175. doi:10.1002/sim.3531
- Mann HB, Whitney DR (1947). On a test of whether one of two random variables is stochastically larger than the other. Annals of Mathematical Statistics 18(1):50–60. doi:10.1214/aoms/1177730491
- McNemar Q (1947). Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika 12(2):153–157. doi:10.1007/BF02295996
- Nieuwenhuis S, Forstmann BU, Wagenmakers EJ (2011). Erroneous analyses of interactions in neuroscience: a problem of significance. Nature Neuroscience 14(9):1105–1107. doi:10.1038/nn.2886
- Royston P, Parmar MKB (2013). Restricted mean survival time: an alternative to the hazard ratio for the design and analysis of randomized trials with a time-to-event outcome. BMC Medical Research Methodology 13:152. doi:10.1186/1471-2288-13-152
- Schober P, Boer C, Schwarte LA (2018). Correlation coefficients: appropriate use and interpretation. Anesthesia & Analgesia 126(5):1763–1768. doi:10.1213/ANE.0000000000002864
- Welch BL (1947). The generalization of ‘Student’s’ problem when several different population variances are involved. Biometrika 34(1–2):28–35. doi:10.1093/biomet/34.1-2.28
- Welch BL (1951). On the comparison of several mean values: an alternative approach. Biometrika 38(3–4):330–336. doi:10.1093/biomet/38.3-4.330
- Wilcoxon F (1945). Individual comparisons by ranking methods. Biometrics Bulletin 1(6):80–83. doi:10.2307/3001968
- Zimmerman DW (2004). A note on preliminary tests of equality of variances. British Journal of Mathematical and Statistical Psychology 57(1):173–181. doi:10.1348/000711004849222
How this page was made
- Built and published by Licklider. Each decision rule is cited to a peer-reviewed methods paper or tutorial listed under References; cited claims were checked against the source text or abstract.
- Every reachable combination of answers is checked automatically (57 answer paths, 24 recommendations), and every R and Python snippet was run as shown in R 4.3.3 and Python 3.13 with SciPy 1.18.1 and statsmodels 0.15.0; the two languages give the same results except for the differences listed under 'How the chooser was checked'.
- Separate review passes checked the statistics, the citations and readability before publication.