Responding to reviewers · Respond to a reviewer
Reviewer says your n is cells, not animals: how to respond
Decide whether the reviewer is right about your design, re-run the test with the animal or experiment as the unit, and reply with a copy-ready paragraph — including what to write if the result is no longer significant.
On this page
Quick answer. If each animal was in one group, you measured many cells, fields or wells per animal, and the test counted each cell as n, the reviewer is right: re-run the test with one value per animal (Welch’s t-test on per-animal means; always this route with 3 or fewer animals per group) or with a mixed model that has a random intercept per animal and t-based (Satterthwaite) p-values, and report the new estimate, interval and p-value even if p is now above 0.05. If whole cages or litters received the treatment, use one value per cage or litter instead. The cell is the right unit only when the treatment was applied to each cell separately and cells were isolated from each other (for example single-cell injections, or one cell per well with its own medium); then explain the design. When both conditions were tested inside each animal or experiment, compare per-animal means paired, or add a condition-by-animal term to the mixed model. If an assistant wrote your code, check the three questions under “Check what an AI assistant ran” first.
Terms used below. Experimental unit: the thing that could receive a different treatment independently of the others — usually the animal, sometimes the cage, litter or independent culture; your n is the number of these. Pseudoreplication: testing a treatment with data whose replicates depend on each other, such as many cells from one animal (Hurlbert 1984). Per-animal mean: the average of all cells from one animal, giving one value per animal. Mixed model: a regression that adds a separate baseline for each animal (a random intercept), so cells from the same animal are treated as related. Satterthwaite df: a small-sample correction that makes a mixed model’s p-value behave like a t-test with few animals. ICC (intraclass correlation): the share of the total variation that lies between animals; the higher it is, the less an extra cell adds. Welch’s t-test: a two-group test that does not assume equal spreads. 95% CI: the range of differences compatible with the data at that level. df (degrees of freedom): roughly, how many independent pieces of information the test uses. A z-test uses the normal distribution, which suits many animals but gives p-values that are too small with few. A singular fit means the model estimated a variance as zero and cannot be relied on. A sensitivity analysis re-runs the analysis another way to check the conclusion.
Is the reviewer right?
Find the level at which the treatment was given. That level is your unit; everything measured below it is a sub-sample (what counts as n has the full table).
| How the treatment was given | Unit (your n) | Situation |
|---|---|---|
| Each animal was dosed or genotyped, then many cells or fields were measured per animal | Animal | 1 — re-analyse |
| Whole cages got the diet, or the dam was treated and the pups were measured | Cage or litter | 1 — re-analyse at that level |
| Each mouse was treated individually, but several mice per group shared a cage | Animal, with cage as an extra grouping (lmer(y ~ group + (1 | cage/mouse)) in lme4); with only 2–3 cages per group the cage variance cannot be estimated well, so say so and report the per-animal analysis |
1 — re-analyse |
| A cell line was treated in wells on independent days or cultures, many wells or cells measured | Independent experiment (day or culture) | 1 — re-analyse with one value per experiment |
| A cell line was treated in wells on one day only | One experiment is n = 1: there is no replication of the treatment effect | 1 — report as a single experiment and repeat it |
| Each cell received its own treatment (for example single-cell injection), and cells did not share medium or signalling | Cell | 2 — explain |
| Each animal or experiment contributed cells under both vehicle and drug | Animal or experiment, paired | 3 — paired analysis |
With three or more groups, use per-animal means with Welch’s ANOVA (oneway.test(y ~ group, data = per_mouse) in R, scipy.stats.f_oneway(*groups, equal_var=False) in Python) followed by Games–Howell comparisons (Welch’s ANOVA), or the mixed model with an F test (anova(fit) in lmerTest). Lazic et al. (2018) give the criteria behind this table: beyond random assignment, a genuine replicate needs the treatment applied independently to each unit and units that cannot influence each other. If each cell’s animal was left unrecorded, say so in the reply and treat the result as a pilot; the unit has to come from the lab records.
What to do: answer one question — “could two of my cells have received different treatments independently?” If not, you are in Situation 1 or 3.
What the reviewer is checking
A test that counts cells as n treats 150 related measurements as 150 independent ones, so its standard error, and therefore its p-value, is too small. Hurlbert (1984) named this pseudoreplication. The problem is common and its effect is large:
- In a random sample of 200 animal studies that treated parents and measured offspring, 46% pseudoreplicated (95% CI 38–53%), 22% replicated correctly and 32% could not be judged (Lazic et al. 2018).
- 53% of 314 neuroscience papers in five journals had nested data, and in the worst cases the authors examined, ignoring the nesting pushed the false-positive rate as high as 80% instead of 5% (Aarts et al. 2014).
- In Eisner’s (2021) simulation of three animals per group with no true difference, the false-positive rate depended on how much animals differed: 29% with five cells per animal in one setting (nested data page), up to 45% when animals differed more than cells, and above 10% even with two cells per animal.
Journals now ask for the unit explicitly (table under What journals ask for). The reviewer is asking you to make the analysis match the design, which you can usually do with the data you already have.
What to do: re-run the test at the level of your unit, as in the matching situation below.
Situation 1: cells, fields or wells were counted as n
Re-run the test at the level of your unit: the animal, or the independent experiment for a cell line. Choose the route before you re-run: per-animal means by default, and always with 3 or fewer animals per group; a mixed model when cell counts differ a lot between animals and you have more animals (nested data page). The paper reports the chosen animal-level analysis only; the response letter shows the original cell-level numbers beside it so the reviewer can compare.
The same data, before and after
Constructed data: 4 vehicle and 4 treated mice, 149 cells in total (12–25 per mouse). The seed was fixed before the analysis, not chosen for the result (download cells_between.csv).
| Analysis | n used | Treated − vehicle (95% CI) | Test | p |
|---|---|---|---|---|
| Original: every cell as n (Welch) | 149 cells | 1.47 (1.05 to 1.89) | t(145.9) = 6.86 | 1.8 × 10⁻¹⁰ |
| Per-mouse means (Welch) | 8 mice | 1.32 (−0.39 to 3.02) | t(5.40) = 1.94 | 0.105 |
| Mixed model, random intercept per mouse (lmerTest, Satterthwaite) | 8 mice, 149 cells | 1.33 (−0.32 to 2.97) | t(5.89) = 1.98 | 0.096 |
The estimate barely changes; the uncertainty does. Here the ICC is 0.43: 43% of the variation lies between mice, so the 149 cells carry far less information than 149 mice would.
One software trap: Python’s statsmodels MixedLM gives the same estimate but a z-test (z = 1.98, p = 0.048), which is built for many animals. With few animals (8 mice here), take the p-value from the per-mouse means or from R’s lmerTest, which uses Satterthwaite df.
If your sheet has one column per mouse (as in Prism or Excel), reshape it to one row per cell first: tidyr::pivot_longer() in R or pandas.melt() in Python, with columns for mouse, group and value.
library(lmerTest) # loads lme4; adds Satterthwaite df and p-values
d <- read.csv("cells_between.csv") # one row per cell: mouse, group, y
d$group <- factor(d$group, levels = c("vehicle", "treated"))
t.test(y ~ group, data = d) # before: every cell as n (what the reviewer queried)
mice <- aggregate(y ~ mouse + group, data = d, FUN = mean)
t.test(y ~ group, data = mice) # after: one mean per mouse, Welch's t-test
fit <- lmer(y ~ group + (1 | mouse), data = d) # or: mixed model with a random intercept per mouse
summary(fit)
contest(fit, c(0, 1), joint = FALSE, confint = TRUE) # Satterthwaite 95% CI; confint(fit) gives profile limits instead
vc <- as.data.frame(VarCorr(fit))
cat(sprintf("ICC %.2f\n", vc$vcov[1] / sum(vc$vcov))) # share of variance between mice
import pandas as pd
from scipy import stats
d = pd.read_csv("cells_between.csv") # one row per cell: mouse, group, y
mice = d.groupby(["mouse", "group"], as_index=False)["y"].mean() # one value per mouse
before = stats.ttest_ind(d.loc[d.group == "treated", "y"], d.loc[d.group == "vehicle", "y"], equal_var=False)
after = stats.ttest_ind(mice.loc[mice.group == "treated", "y"], mice.loc[mice.group == "vehicle", "y"], equal_var=False)
print("cells as n: ", before)
print("mice as n: ", after, after.confidence_interval())
If your columns are called something else (for example Animal_ID, Treatment), rename them to mouse, group and y, or change the names in the code; keep the group labels consistent with the code (vehicle, treated).
R’s t.test reports vehicle − treated (factor order), so its signs are the reverse of the table; the Python code subtracts vehicle from treated. Report the contest() interval next to the Satterthwaite p: it uses the same df as the p-value. confint(fit) gives a different interval, computed by profile likelihood (another way of deriving confidence limits; 0.04 to 2.61 here), that does not match that p-value.
If the result is no longer significant
Report the animal-level estimate, its 95% CI and p as the result, and change the claim to match: “The treated mice had higher values on average (1.32 units), but with 4 mice per group the interval (−0.39 to 3.02) includes no difference.” Choose per-animal means or the mixed model before re-running (the nested data page says which fits your data), and report that one; the reviewer will compare versions. Use the interval to say what the study can and cannot rule out (p = 0.06 or “not significant”), and plan the follow-up with the animal as the unit (how many biological replicates).
Reply and Methods text
Copy the paragraph that matches your outcome, then replace every bracketed item with your own numbers and names. The example numbers in brackets are from the per-mouse route; if you chose the mixed model, use its estimate, interval and p.
We thank the reviewer for this important point. In the original analysis each [cell] was treated as an independent observation, but [cells] from the same [mouse] are not independent, because the treatment was applied to the [mouse]. We have re-analysed the data with the [mouse] as the experimental unit, using [Welch’s t-test on per-mouse means / a linear mixed model with a random intercept for each mouse, with Satterthwaite degrees of freedom] (n = [4] [mice] per group, [149] [cells] in total). The difference is now [1.32] [units] (95% CI [−0.39] to [3.02]; p = [0.105]). [Outcome A: The effect remains statistically significant, and our conclusions are unchanged.] [Outcome B: The interval includes no difference, and we have revised the Results, Abstract and Discussion to describe the effect as [suggestive / not established] in this sample.] [If you added a SuperPlot (how to make one): Figure [2] now shows every [cell] coloured by [mouse] with the per-[mouse] means overlaid, and the legend states n at both levels.]
Methods sentence:
The experimental unit was the [mouse]; [cells] were sub-samples. We compared groups with [Welch’s t-test on per-mouse means / a linear mixed model (lme4, lmerTest) with group as a fixed effect and a random intercept for each mouse; p-values used Satterthwaite degrees of freedom].
Reply, single experiment (cell line treated on one day only):
We thank the reviewer. The [wells] came from a single experiment, so the treatment effect is replicated only by repeating the experiment. We now present this experiment as [descriptive / a single experiment] and have [repeated it on [3] independent days, analysing one value per experiment / removed the statistical comparison].
Legend sentence:
n = [4] mice per group ([12–25] cells per mouse; [149] cells in total). Points show cells, coloured by mouse; larger symbols show per-mouse means; statistics were calculated from per-mouse values.
Situation 2: the cells really were the units
Some designs do treat cells independently: each oocyte or neuron injected separately, or one cell per well with its own medium and treatment. Independent cultures started from separate stocks are replicates too, but then the culture, not the cell, is the unit: average the cells within each culture. Several cells measured in one treated dish are sub-samples of that dish. If your design meets the two Lazic et al. (2018) conditions — treatment applied to each cell independently, and cells unable to influence each other — keep the cell as the unit and show the evidence. Shared medium, a shared slice or a shared animal break the second condition.
We thank the reviewer. In this experiment the treatment was applied to each [cell] individually: [describe, for example “each oocyte was injected separately with drug or vehicle in random order”], and [cells] were [kept in separate wells with separate medium / not in contact], so one [cell]’s response could not affect another’s. Each [cell] therefore meets the criteria for an experimental unit (Lazic et al. 2018). [The cells came from [5] donor animals; a sensitivity analysis with donor as a random intercept gives [estimate, 95% CI, p], consistent with the main analysis.] We have added this design detail to the Methods.
If the cells came from several animals, run the sensitivity analysis in square brackets anyway: it shows whether animal-to-animal differences change the conclusion. In the paper, report the cell-level analysis and, if you ran it, the donor sensitivity analysis; the response letter explains the design.
Situation 3: both conditions inside each animal or experiment
When every animal or experiment contributed cells under both vehicle and drug, compare the conditions within each animal: average the cells per animal and condition, then run a paired t-test on those means (n = number of animals). A mixed model must then include the condition-by-animal term, (1 | mouse) + (1 | mouse:condition) in lme4; a random intercept alone treats every cell as independent evidence about the drug effect. With few animals this model can report a singular fit (in a SuperPlots simulation with four experiments, 31.2% of fits were singular); use the paired t-test on means in that case.
Constructed data: 5 mice, 15 cells per condition per mouse (download cells_within.csv).
| Analysis | Drug − vehicle | Test | p |
|---|---|---|---|
| Paired t-test on per-mouse means | 0.16 (95% CI −0.47 to 0.79) | t(4) = 0.71 | 0.517 |
Mixed model with (1 | mouse) + (1 | mouse:condition) |
0.16 | t(4.0) = 0.71 | 0.517 |
Mixed model with (1 | mouse) only |
0.16 | t(144) = 0.99 | 0.324 |
In the paper, report the paired (or crossed mixed-model) result only; the response letter shows the original cell-level numbers beside it. The correct model reproduces the paired test exactly; the random-intercept-only model claims 144 df from 5 mice. In this dataset the conclusion stays the same, but in a simulation with the drug effect varying between experiments the same shortcut gave 21.6% false positives (SuperPlots, “When the simple mean is not enough”).
library(lmerTest)
b <- read.csv("cells_within.csv") # one row per cell: mouse, condition, y
b$condition <- factor(b$condition, levels = c("vehicle", "drug"))
summary(lmer(y ~ condition + (1 | mouse) + (1 | mouse:condition), data = b))
m <- aggregate(y ~ mouse + condition, data = b, FUN = mean)
m <- m[order(m$mouse), ]
t.test(m$y[m$condition == "drug"], m$y[m$condition == "vehicle"], paired = TRUE)
import pandas as pd
from scipy import stats
b = pd.read_csv("cells_within.csv") # one row per cell: mouse, condition, y
m = b.groupby(["mouse", "condition"])["y"].mean().unstack() # one row per mouse, one column per condition
res = stats.ttest_rel(m["drug"], m["vehicle"])
print(res, res.confidence_interval())
We thank the reviewer. Each [mouse] contributed [cells] under both conditions, so we now compare conditions within [mice]: [a paired t-test on per-[mouse] means / a linear mixed model with random intercepts for [mouse] and for [mouse]-by-condition], n = [5] [mice]. The drug − vehicle difference is [0.16] [units] (95% CI [−0.47] to [0.79]; p = [0.517]). [Conclusion sentence matching the result.]
Arguments that do not work
None of these arguments answers the comment.
| Argument | Why it falls short | What to do instead |
|---|---|---|
| “The random effect for mouse was not significant, so cells are independent” | A test of the variance component with 4–8 animals has little power; an undetected variance can still be large | Keep the animal in the model or analyse per-animal means |
| “Counting cells is standard practice in our field” | The design decides the unit, and reporting rules now ask for it (see the table under What journals ask for) | Re-analyse and report n at both levels |
| “We analysed thousands of cells, so the result is robust” | More cells from the same animals shrink only the within-animal noise; the between-animal variation stays (high ICC) | Report the ICC and the animal-level interval |
| “The imaging software segments and measures each cell” | The unit is set by where the treatment was applied, whatever tool measured the cells | Aggregate the software output by animal before testing |
What journals ask for
| Journal or publisher | Wording (checked 10 November 2026) |
|---|---|
| Nature Portfolio (reporting summary) | “The exact sample size (n) for each experimental group/condition, given as a discrete number and unit of measurement” and “A statement on whether measurements were taken from distinct samples or whether the same sample was measured repeatedly” |
| Journal of Biological Chemistry (Fosang & Colbran 2015) | “The JBC now requires authors to include explicit information describing N and its value in the figure legends and to distinguish between the biological (independent) and technical replicates for each experiment.” |
| eLife (author guide, figures) | Legends should give “any statistical tests applied, with exact sample number, p values of tests, criteria for data inclusion or exclusion, and details of replicates” |
Lord et al. (2020) state the same principle for cell biology: “P values and standard error of the mean should be calculated using biological replicates”. Put the unit and both counts in every legend that shows a test.
Check what an AI assistant ran
If an assistant wrote the analysis, open the code and check three things before you reply:
- What is one row? If the data frame has one row per cell and the test is
ttest_ind,t.testoraovon that frame, the test counted cells as n. - Is there a grouping term? A mixed model needs
(1 | mouse)in R orgroups=in statsmodels; for within-animal designs it also needs the condition-by-animal term. - Where does the p-value come from? statsmodels
MixedLMreports z-tests, which are built for many animals; with few animals, use per-animal means or R’s lmerTest instead.
Ask the assistant to “aggregate to one value per animal and run Welch’s t-test” and compare the result with its mixed model; if they disagree sharply, trust the per-animal analysis and find out why.
References
- Aarts E, Verhage M, Veenvliet JV, Dolan CV, van der Sluis S (2014). A solution to dependency: using multilevel analysis to accommodate nested data. Nature Neuroscience 17:491–496. doi:10.1038/nn.3648
- Eisner DA (2021). Pseudoreplication in physiology: more means less. Journal of General Physiology 153:e202012826. doi:10.1085/jgp.202012826
- Fosang AJ, Colbran RJ (2015). Transparency is the key to quality. Journal of Biological Chemistry 290:29692–29694. doi:10.1074/jbc.E115.000002
- Hurlbert SH (1984). Pseudoreplication and the design of ecological field experiments. Ecological Monographs 54:187–211. doi:10.2307/1942661
- Lazic SE, Clarke-Williams CJ, Munafò MR (2018). What exactly is ‘N’ in cell culture and animal experiments? PLOS Biology 16:e2005282. doi:10.1371/journal.pbio.2005282
- Lord SJ, Velle KB, Mullins RD, Fritz-Laylin LK (2020). SuperPlots: communicating reproducibility and variability in cell biology. Journal of Cell Biology 219:e202001064. doi:10.1083/jcb.202001064
- Nature Portfolio. Reporting summary. nature.com/documents/nr-reporting-summary-flat.pdf (accessed 10 November 2026).
- eLife. Author guide: preparing a submission. reviewer.elifesciences.org/author-guide/report (accessed 10 November 2026).
How this page was made
- Written and published by Licklider. The definition of pseudoreplication, the replication criteria and the false-positive figures are taken from the peer-reviewed papers under References; journal requirements are quoted from the journals' own documents. Cited text was checked against the source.
- The worked example uses constructed data with a seed fixed before the analysis. Its numbers were produced by stored code (Python 3.13 with SciPy 1.18.1 and statsmodels 0.15.0; R 4.3.3 with lme4 1.1-35.1 and lmerTest 3.1-3), and the two implementations agree wherever they run the same test.
- Separate review passes checked the statistics, the citations and readability before publication.