# Normalising to body weight: organ-to-body-weight ratio or ANCOVA?

> A ratio removes body size only when the organ grows in proportion to the body. Otherwise use body weight as a covariate (ANCOVA on the log scale). Worked example where the ratio finds a false effect, in R and Python.

Canonical: https://www.licklider.ai/guides/normalizing-to-body-weight-ratio-or-ancova/
Section: Guides › Normalised data and fold change
Author: Licklider · Published 2026-11-11 · Last reviewed 2026-11-11 (UTC)

> **Quick answer.** Dividing organ weight by body weight removes the effect of body size only if the organ grows in direct proportion to the body: a straight line through the origin. Organs rarely do, so when the groups differ in body weight, the ratio can show an effect that is only a size difference. The general alternative is **ANCOVA**: compare the groups' organ weights with body weight as a covariate, on the log scale (`log(organ) ~ group + log(body weight)`), and report the adjusted difference with its 95% confidence interval. (Energy expenditure is the exception: analyse it on the raw scale with body mass as the covariate; see below.) Show raw organ weight, body weight and the scatter plot as well. If the treatment itself changes body weight, also say that the comparison is "at the same body weight".

**Terms used below.** *Ratio* (relative organ weight): organ weight ÷ body weight, for example mg per g. *Covariate*: a measured variable, here body weight, that the analysis adjusts for. *ANCOVA* (analysis of covariance): a regression that compares groups while adjusting for a covariate. *Log scale*: natural logarithms; on this scale an adjusted difference back-transforms to a ratio of organ weights (1.04 = 4% heavier). *Slope*: how much log organ weight rises per unit of log body weight; 1 means strict proportionality. *False positive*: a "significant" effect when there is none. *Interaction*: a model term that lets each group have its own slope; testing it checks whether the slopes differ. *Adjusted difference*: the group difference at the same body weight. *95% confidence interval (CI)*: the range of effects compatible with the data. *df* (degrees of freedom): a number printed with the test that reflects the amount of independent data. *Welch's t-test*: compares two means without assuming equal spread. *EE*: energy expenditure, measured by indirect calorimetry (from oxygen use and carbon dioxide output). *p-value*: the chance of a result at least this extreme if there were no effect; *α* is the threshold, usually 0.05. *Back-transform*: undo the log, for example exp(0.036) = 1.037. *Extrapolation*: a comparison outside the range of the data. In the code, `y ~ a + b` means "model y from a and b". Use one value per animal; average repeated readings within an animal first.

## When a ratio works and when it misleads

Curran-Everett puts the condition plainly: "only if the relationship between numerator and denominator is a straight line through the origin will the ratio be meaningful. If not, the ratio will misrepresent the true relationship between numerator and denominator" ([Curran-Everett 2013](https://doi.org/10.1152/advan.00053.2013)). Packard and Boardman found that analyses of ratios led "to conclusions that are inconsistent with impressions gained from visual examinations of data displayed in bivariate plots", while ANCOVA agreed with the plots ([Packard & Boardman 1988](https://doi.org/10.1086/physzool.61.1.30163730)).

| Situation | What to do |
| --- | --- |
| Groups have similar body weights | Raw organ weight with Welch's t-test is often enough; ANCOVA adds precision |
| Groups differ in body weight (diet, genotype, a drug that causes weight loss) | ANCOVA on the log scale, described as the difference at equal body weight; report raw organ weight too, because when the treatment itself changes body weight the ANCOVA does not give the treatment's total effect on the organ |
| A regulatory toxicology study with an established convention for the organ | Follow the convention and add ANCOVA where the organ is not proportional to body weight (see the table below) |
| Energy expenditure from indirect calorimetry | ANCOVA on the raw scale with body mass (or lean and fat mass) as covariates; see below |
| You can show on your own data that the organ is proportional to body weight (slope near 1 on the log scale, line through the origin) | The ratio is acceptable only if the slope's 95% CI is narrow and close to 1 (a wide interval that merely includes 1, such as 0.65 to 1.19 in the example below, does not show proportionality); report the slope and its CI. Otherwise use ANCOVA |

## Worked example: a ratio effect that is only a size difference

Constructed data: 10 control and 10 treated mice. The treatment lowers body weight, but by construction it has **no direct effect on the heart**: heart weight follows body weight along a curve (proportional to body weight to the power 0.75). Stored code and data: [hearts.csv](/guides/normalizing-to-body-weight-ratio-or-ancova/hearts.csv), [analysis.py](/guides/normalizing-to-body-weight-ratio-or-ancova/analysis.py), [analysis.R](/guides/normalizing-to-body-weight-ratio-or-ancova/analysis.R) and [their output](/guides/normalizing-to-body-weight-ratio-or-ancova/analysis_output.txt); both languages print the same output.

| Analysis | Control | Treated | Result |
| --- | --- | --- | --- |
| Body weight (g) | 27.23 | 22.48 | Welch's t = −5.80, df = 15.8, p < 0.001 |
| Heart weight (mg) | 61.20 | 53.09 | Welch's t = −3.87, df = 17.6, p = 0.001 |
| Heart-to-body-weight ratio (mg/g) | 2.25 | 2.37 | Welch's t = 2.82, df = 17.3, p = 0.012 |
| **ANCOVA: heart weight at the same body weight** | — | — | treated ÷ control = 1.037 (95% CI 0.972 to 1.107), t = 1.18, df = 17, p = 0.255 |

The ratio says the treated hearts are "relatively larger", a result often written up as hypertrophy. The ANCOVA gives a different picture: at the same body weight, the data are compatible with treated hearts from about 3% lighter to about 11% heavier (estimate 1.04, p = 0.255), so there is no evidence of a heart effect here, though not evidence that there is none. Note the signs: treated hearts are lighter (t = −3.87), yet the ratio is higher (t = +2.82), because the ratio divides heart weight by a smaller body weight. The ratio rose only because small mice have relatively larger hearts when the organ does not scale one-to-one with the body. In 10,000 simulated experiments with this design (10 mice per group, treatment lowering body weight by 4 g with a standard deviation of 2 g, heart weight proportional to body weight^0.75 with 6% noise, no direct heart effect; Welch's t-test on the ratio vs ANCOVA on logs, α = 0.05), the ratio test declared a heart effect in **25.6%** of runs and the ANCOVA in 5.1% ([simulation.py](/guides/normalizing-to-body-weight-ratio-or-ancova/simulation.py), [the simulation output](/guides/normalizing-to-body-weight-ratio-or-ancova/simulation_output.txt)).

```python
import numpy as np, pandas as pd
import statsmodels.formula.api as smf

d = pd.read_csv("hearts.csv")                 # columns: group, mouse, body_weight_g, heart_mg
d["group"] = pd.Categorical(d.group, ["control", "treated"])
m = smf.ols("np.log(heart_mg) ~ group + np.log(body_weight_g)", d).fit()
b, (lo, hi) = m.params["group[T.treated]"], m.conf_int().loc["group[T.treated]"]
print(np.exp(b), np.exp(lo), np.exp(hi), m.pvalues["group[T.treated]"])  # ratio of heart weights at equal body weight
slopes = smf.ols("np.log(heart_mg) ~ group * np.log(body_weight_g)", d).fit()
print(slopes.pvalues["group[T.treated]:np.log(body_weight_g)"])          # do the slopes differ?
print(m.params["np.log(body_weight_g)"], m.conf_int().loc["np.log(body_weight_g)"].values)  # common slope; 1 = proportional
import matplotlib.pyplot as plt                                            # look before you trust one adjusted difference
for g, sub in d.groupby("group", observed=True):
    plt.scatter(np.log(sub.body_weight_g), np.log(sub.heart_mg), label=g)
plt.xlabel("log body weight"); plt.ylabel("log heart weight"); plt.legend(); plt.savefig("hearts.png")
```

```r
d <- read.csv("hearts.csv")
d$group <- factor(d$group, levels = c("control", "treated"))
m <- lm(log(heart_mg) ~ group + log(body_weight_g), data = d)
exp(cbind(estimate = coef(m), confint(m)))["grouptreated", ]   # ratio of heart weights at equal body weight
summary(m)$coefficients["grouptreated", ]
anova(m, lm(log(heart_mg) ~ group * log(body_weight_g), data = d))  # do the slopes differ?
confint(m)["log(body_weight_g)", ]                                  # common slope; 1 = proportional
plot(log(heart_mg) ~ log(body_weight_g), data = d, col = group, pch = 19)  # look before you trust one adjusted difference
```

## Check the ANCOVA's conditions

1. **Plot first.** Organ weight against body weight, one colour per group, on log axes. The ANCOVA compares the vertical distance between the two groups' lines; the plot shows whether that comparison is sensible.
2. **Similar slopes.** ANCOVA assumes "that groups do not differ in the regression of DV on Cov" (DV: the outcome; Cov: the covariate) ([Miller & Chapman 2001](https://doi.org/10.1037/0021-843X.110.1.40)). Fit `group * log(body weight)` and look at the interaction; here p = 0.091 with 10 mice per group; the interaction test is weak at this sample size. The common slope is 0.92 (95% CI 0.65 to 1.19): the interval is too wide to show that the heart is proportional to body weight, which is why the ratio is not safe here. If the plot shows clearly different slopes, report the group difference at named body weights instead of one adjusted difference.
3. **Overlapping body weights.** If the groups barely overlap in body weight, the adjusted difference is an extrapolation along the fitted line. Say so, or compare only the overlapping range.
4. **A treatment that changes body weight.** Porter and Raudenbush, quoted by Miller and Chapman, put it plainly: "It is crucial that the covariable be unaffected by the treatment." When the treatment lowers body weight, the ANCOVA still answers a clear question, "is the organ heavier or lighter than expected for a mouse of that size?", but not "what is the treatment's total effect on the organ?". State which question you answer, and report raw organ weight alongside the adjusted comparison. If your field uses a size measure the treatment does not change, such as tibia length for heart weight, that is a cleaner covariate.
5. **The organ is part of body weight.** For large organs, consider body weight minus organ weight as the covariate, and say which you used.

## Organ weights in toxicology studies

Bailey, Zidell and Perry analysed control rats across many studies and concluded that "analysis of organ-to-body weight ratios is predictive for evaluating liver and thyroid gland weights, and organ-to-brain weight ratios is predictive for evaluating ovary and adrenal gland weights", while "brain, heart, kidney, pituitary gland, and testes weights are not modeled well by any of the choices, and alternative analysis methods such as analysis of covariance should be utilized" ([Bailey et al. 2004](https://doi.org/10.1080/01926230490465874)).

| Organ | Normalisation supported by Bailey et al. (2004, rats) |
| --- | --- |
| Liver, thyroid | Ratio to body weight |
| Ovary, adrenal | Ratio to brain weight |
| Brain, heart, kidney, pituitary, testes | ANCOVA |

These findings come from rats in toxicology studies. For mice or other designs, check proportionality on your own data with the plot above.

## Energy expenditure

The same problem affects energy expenditure divided by body weight or lean mass. Tschöp and colleagues recommend replacing division by body weight or lean body weight with plots of individual data and "analyzing both group and body-composition effects using analysis of covariance (ANCOVA)" ([Tschöp et al. 2012](https://doi.org/10.1038/nmeth.1806)). Mina and colleagues describe ANCOVA as "the consensus method for the analysis of indirect calorimetry EE data when comparing animals of different body composition" and note that it assumes parallel slopes across groups ([Mina et al. 2018](https://doi.org/10.1016/j.cmet.2018.06.019)). Their CalR tool runs this analysis on calorimetry exports. Here the recommended analysis is on the raw scale: Tschöp and colleagues write that "in most circumstances, the analysis of energy balance should be made on the raw data expressed per mouse", with body mass as the covariate. Use logs of both variables only if the plot shows a curve.

## Check what an AI assistant ran

1. **A t-test on the ratio column** as the only analysis, when body weights differ. Add the ANCOVA and the plot.
2. **An ANCOVA on the raw scale** for an organ whose relationship with body weight curves on the plot. Use logs of both organ and body weight (energy expenditure is usually analysed on the raw scale; see above).
3. **No check of the slopes**, or an interaction term left in the model when you report "the adjusted difference". Fit the interaction to check, then report the model without it if the slopes look similar.
4. **Student's t-test** on raw weights (`equal_var=True`, `var.equal = TRUE`). Use Welch's.

## Report it

> Heart weight was compared between groups by analysis of covariance on the natural-log scale, with log body weight as the covariate (`lm(log(heart) ~ group + log(body weight))`, R [4.3.3]); body weight was lower in the treated group, so the group effect is interpreted as the difference at equal body weight. Slopes were checked with a group × log body weight term (p = [0.091]) and a scatter plot (common slope [0.92], 95% CI [0.65 to 1.19]); because the interaction test is weak at this sample size, similarity was judged from the plot as well. Raw heart and body weights are reported in [Table 1].

> At equal body weight, treated hearts weighed an estimated 1.04 times as much as control hearts (95% CI 0.97 to 1.11; p = 0.255), although the heart-to-body-weight ratio was higher in the treated group (2.37 vs 2.25 mg/g).

Replace the bracketed values with your own.

## References

- Curran-Everett D (2013). Explorations in statistics: the analysis of ratios and normalized data. *Advances in Physiology Education* 37:213–219. [doi:10.1152/advan.00053.2013](https://doi.org/10.1152/advan.00053.2013)
- Packard GC, Boardman TJ (1988). The misuse of ratios, indices, and percentages in ecophysiological research. *Physiological Zoology* 61:1–9. [doi:10.1086/physzool.61.1.30163730](https://doi.org/10.1086/physzool.61.1.30163730)
- Miller GA, Chapman JP (2001). Misunderstanding analysis of covariance. *Journal of Abnormal Psychology* 110:40–48. [doi:10.1037/0021-843X.110.1.40](https://doi.org/10.1037/0021-843X.110.1.40)
- Bailey SA, Zidell RH, Perry RW (2004). Relationships between organ weight and body/brain weight in the rat: what is the best analytical endpoint? *Toxicologic Pathology* 32:448–466. [doi:10.1080/01926230490465874](https://doi.org/10.1080/01926230490465874)
- Tschöp MH, Speakman JR, Arch JRS, et al. (2012). A guide to analysis of mouse energy metabolism. *Nature Methods* 9:57–63. [doi:10.1038/nmeth.1806](https://doi.org/10.1038/nmeth.1806)
- Mina AI, LeClair RA, LeClair KB, Cohen DE, Lantier L, Banks AS (2018). CalR: a web-based analysis tool for indirect calorimetry experiments. *Cell Metabolism* 28:656–666.e1. [doi:10.1016/j.cmet.2018.06.019](https://doi.org/10.1016/j.cmet.2018.06.019)

## Related

- [Statistics on fold change and normalised data](https://www.licklider.ai/guides/statistics-on-fold-change/)
- [Pearson vs Spearman correlation](https://www.licklider.ai/guides/pearson-vs-spearman-correlation/)
- [Welch's t-test vs Student's t-test](https://www.licklider.ai/guides/welch-vs-student-t-test/)
- [How to report a t-test](https://www.licklider.ai/guides/how-to-report-a-t-test/)
- [Myelin g-ratio](https://www.licklider.ai/guides/myelin-g-ratio/)

## How this page was made

- Written and published by Licklider. Recommendations cite peer-reviewed methods papers listed under References; cited passages were checked against the source text.
- The worked example uses constructed data. Its numbers were produced by stored code (Python 3.13 with SciPy 1.18.1 and statsmodels 0.15.0; R 4.3.3), and the two languages print identical output; the simulation was run in Python.
- Separate review passes checked the statistics, the citations and readability before publication.
