How to write a confidence interval conclusion
What a correct confidence interval conclusion says, built from one worked example in R, with common incorrect wordings side by side and how to fix each.
Updated . Written by Matt Gencer.
On this page
A confidence interval conclusion is one sentence, and it is easy to get subtly wrong. A correct one names the quantity and its direction, gives the estimate with both limits in real units, states the confidence level, and says which population and design it speaks for. It describes the range as the values compatible with the data, not a probability, a guarantee about individuals or proof of a cause.
This post builds that sentence from one worked example and sets common incorrect wordings beside their corrections. The example is one Welch’s t-test on R’s built-in mtcars data. The post on p-values and confidence intervals covers the theory; here the focus is wording.
What the conclusion has to contain
A conclusion about an interval for a difference needs five parts.
- The quantity and its direction. “The difference in mean fuel economy, manual minus automatic.” A sign error reverses the finding.
- The point estimate in the outcome’s units. Miles per gallon, days.
- The confidence level and both limits. “95% CI 3.21 to 11.28 mpg.”
- The scope. Which units were measured, under which design. It generalises only as far as the sampling allows.
- What the interval supports. Which values are compatible with the data, and whether values that would matter in your field are among them.
The worked example
The mtcars data come from the 1974 Motor Trend US road tests: 32 car models from the 1973 and 1974 model years, 19 with an automatic transmission and 13 with a manual one. The outcome is fuel economy in miles per gallon (mpg). Each car appears once, so the groups are independent. The comparison is observational: nobody assigned a transmission to a car. Welch’s version of the two-sample t-test does not assume equal variances and is the safe default, especially with unequal group sizes as here. The Welch method reference lists what the engine computes.
The engine run gives:
- Mean fuel economy: 17.15 mpg for the automatic cars and 24.39 mpg for the manual cars.
- Difference in means, automatic minus manual: -7.24 mpg, 95% CI -11.28 to -3.21.
- Welch’s t = -3.77 on 18.33 degrees of freedom, p = 0.0014.
- Cohen’s d, automatic minus manual: -1.48, 95% CI -2.27 to -0.67.
The engine reports the difference in the order the groups are coded, automatic (coded 0) minus manual (coded 1), which is why every number is negative. In the other order, manual minus automatic, the difference is 7.24 mpg, 95% CI 3.21 to 11.28, and t and d change sign. From here on, every number is manual minus automatic unless it says otherwise. Pick the order that makes the difference positive, and state it.
Shapiro-Wilk did not detect departures from normality in either group (p = 0.90 automatic, p = 0.54 manual), which is not evidence of normality. Levene’s test gave p = 0.0496, some evidence that the spreads differ, the case Welch’s test is built for. The engine also flagged one mpg value beyond the 1.5 times IQR fence: a prompt to check the data, not to drop a car.
A correct conclusion, built step by step
Start from the template:
In [population and design], [group A] had a mean [outcome] [estimate] [units] [higher or lower] than [group B] (95% CI [lower] to [upper] [units]).
Filled in from the run:
In the 1974 Motor Trend road tests, manual cars averaged 7.24 mpg more than automatic cars (95% CI 3.21 to 11.28 mpg; Welch’s t = 3.77, df = 18.33, p = 0.0014).
Then add the sentence that makes it a conclusion:
The data are compatible with a difference in mean fuel economy anywhere from about 3.2 to about 11.3 mpg in favour of the manual cars; a zero or negative difference lies outside the 95% interval and is less compatible with them.
It names a difference in means, not a difference between individual cars. It gives both limits in mpg. And “compatible with” claims no probability for this particular interval.
It does not say a manual gearbox causes better fuel economy: these were road tests of existing cars, with no adjustment for other differences between them.
The interval also answers the hypothesis-test question. For the same Welch comparison, a 95% interval for the difference excludes zero exactly when the two-sided p-value is below 0.05, and here p = 0.0014. The interval adds how large the difference could be, and whether even its lower limit (3.2 mpg) would matter in your field.
Writing it up from software output
Software prints the pieces and leaves the sentence to you. In R, t.test prints the two group means, the “95 percent confidence interval” with its two limits, and the t, df and p-value. Check which group the output treats as first, because that sets the sign. In a paper’s results section, the same finding is usually written in a compact reporting style: manual cars M = 24.39 mpg and automatic cars M = 17.15 mpg, mean difference 7.24 mpg, 95% CI [3.21, 11.28].
What sets the width is the sample size, the spread of the outcome and the confidence level. More cars, less variable fuel economy or a lower level (90% instead of 95%) each give a narrower interval, so a wide interval means imprecise data, not a small effect.
Incorrect wordings and how to fix them
“There is a 95% probability that the true difference is between 3.21 and 11.28 mpg.” The 95% belongs to the procedure, not to this interval. Once computed, it either contains the true difference or not; the 95% is how often intervals built this way would contain the true difference over many repetitions, if the assumptions held. Greenland and colleagues list this as a common fallacy. Fix: “The 95% interval for the difference, manual minus automatic, runs from 3.21 to 11.28 mpg” plus the “compatible with” sentence above.
“Manual cars get between 3.21 and 11.28 mpg more than automatic cars.” This describes individual cars. The interval is for the difference in mean fuel economy; individual automatic cars can outperform manual ones while the means differ. Fix: “Mean fuel economy was 7.24 mpg higher in the manual cars (95% CI 3.21 to 11.28 mpg).”
“Switching to a manual transmission raises fuel economy by 3.2 to 11.3 mpg.” A causal claim from an observational comparison. Fix: describe the association and say what the design cannot separate: “Manual cars in these road tests averaged higher fuel economy; the comparison does not adjust for other differences between the cars.”
“The difference was -11.28 to -3.21, so manual cars did worse.” A sign error: the negative interval is automatic minus manual, so it says the opposite, that manual cars averaged higher fuel economy. Fix: state the order in words every time.
“Differences smaller than 3.21 mpg have been ruled out.” A value just outside a 95% interval is somewhat less compatible with the data than one inside it, not refuted. Fix: “Differences (manual minus automatic) below about 3.2 mpg are less compatible with these data at the 95% level.”
“95% of future studies will find a difference between 3.21 and 11.28 mpg.” An interval is not a prediction range; the chance a replication’s estimate falls inside it is usually well below 95% (Greenland and colleagues). Fix: make no replication claim from one interval.
“The automatic and manual intervals overlap, so the difference is not significant.” Judging significance by overlap of two group intervals is more conservative than testing the difference itself, so overlapping intervals can still go with a significant difference (Schenker and Gentleman). Fix: report the interval for the difference itself, as this example does.
“The difference was significant (p = 0.0014).” Incomplete: it hides the size and precision the interval shows. Gardner and Altman argued in 1986 that the estimate and interval belong in the main text and the abstract. Fix: lead with the estimate and interval; put the p-value in parentheses.
When the interval includes zero
An interval for a difference that runs from below zero to above it means the data are compatible with no difference, and also with every other value in the range, including those that would matter.
Write it as: “The data are compatible with no difference, and also with differences from [lower] to [upper] [units] ([group A] minus [group B])”. Never write “there is no difference”, “the groups are equivalent” or “we accept the null hypothesis”. Equivalence needs its own design, with a margin chosen in advance.
Study size matters here. The engine’s sensitivity calculation for this design, 19 and 13 cars, shows that at 80% power and the two-sided 0.05 level it could reliably detect only a large standardised difference, a Cohen’s d of about 1.04 or more. That describes the design, not this result. A wide interval that crosses zero is likely in a study this size, so say “inconclusive” when the interval still includes values that matter.
Intervals for proportions, ratios and other estimates
The same five parts apply to other quantities. For a proportion, name the group and the event and give the proportion with both limits. For a difference in proportions, state the order. For a ratio such as an odds ratio, risk ratio or hazard ratio, the no-effect value is 1, not 0: an interval that spans 1 is compatible with no association, and also with everything else inside it. Ratio intervals are usually symmetric on the log scale, so they look lopsided on the original one. If the interval came from a bootstrap, say so: the method changes the assumptions, not the wording.
Which interval belongs in the sentence
Lead with the interval in the outcome’s own units, here mpg. A standardised effect size such as Cohen’s d belongs alongside it, not in its place. Here d = 1.48 (95% CI 0.67 to 2.27, manual minus automatic) uses the pooled standard deviation of the two groups as its denominator, and its interval comes from the noncentral t distribution with pooled degrees of freedom, which assumes the two variances are equal. Levene’s test (p = 0.0496) gave some evidence that they are not, so treat the d interval as approximate: it rests on an assumption the main analysis deliberately avoided. Keep the mpg interval as the result.
With several comparisons, say whether the intervals were adjusted: an unadjusted interval picked from many is not a 95% interval for the one you highlighted. The guide to multiple comparisons covers the options.
A checklist before you submit
- The quantity is named with its direction (“manual minus automatic”).
- The estimate and both limits are in the outcome’s units, with the confidence level.
- The population and design are stated.
- The interval is described as compatible values, never a 95% probability, and with no causal verb the design cannot support.
- An interval that includes zero is reported as compatible with no difference, not as showing none.
- The interval is for the difference itself, with any p-value in parentheses after it.
Hoekstra and colleagues gave psychology researchers and students six statements about a confidence interval, all of them false; on average both groups endorsed more than three, and researchers barely outperformed students.
Rerunning the example
The engine script and its output are shown below. The script recomputes the Welch test and the sensitivity calculation. It does not recompute Cohen’s d, its interval, the assumption checks or the outlier note; those come from the engine run. In base R, in the manual minus automatic order, the same comparison is:
mtcars$transmission <- factor(mtcars$am, levels = c(1, 0), labels = c("manual", "automatic"))
t.test(mpg ~ transmission, data = mtcars) # Welch's test is the default
For why every analysis should ship with a script that reproduces it, see the guide on reproducible statistical analysis. If you are still choosing between a t-test and a rank test for your own data, the t-test vs Mann-Whitney guide walks through that decision.
Worked example
Data: Henderson HV, Velleman PF (1981). Building multiple regression models interactively. Biometrics 37(2):391-411. https://doi.org/10.2307/2530428. Seed: 20261022.
Run on Celeus engine 0.30.0, seed 20261022, public data.
Output
# Results - Test: Welch's t-test - n: 32 - statistic: -3.767 - p-value: 0.00137 - effect size: Cohen's d = -1.478 (95% CI -2.266 to -0.6706) - 95% CI: [-11.28, -3.21] - seed: 20261022 ## Assumption checks - normality by group (Shapiro-Wilk): passed=TRUE - variance homogeneity (Levene): passed=FALSE (evidence of unequal variances) - sample size: passed=TRUE (adequate n) ## Power (sensitivity, not observed power) - minimum detectable effect at n=32: Cohen's d = 1.042 (severely underpowered) - to detect a conventional medium effect: 64 per group to detect d=0.50 - alpha = 0.05, target power = 0.8
R script
# Celeus - reproduce.R (run from this package folder; bundled data in data/)
# Test: Welch's t-test | engine 0.30.0 | catalog c39-d3cd
# Research context: not provided for this run.
# Reproduces the recorded result deterministically.
set.seed(20261022)
.data_path <- "data/confidence-interval-conclusion.csv"
if (!file.exists(.data_path)) stop("Run reproduce.R from the package folder (the bundled data is in data/).")
data <- readr::read_csv(.data_path, show_col_types = FALSE) # needs the readr package
clean_cells <- function (df)
{
ctrl_collapse <- "[\r\n\t\v\f]+"
zero_width_chars <- intToUtf8(c(8203L, 65279L), multiple = TRUE)
uni_space_chars <- intToUtf8(c(160L, 8239L, 8199L), multiple = TRUE)
clean_text <- function(x) {
out <- x
for (ch in zero_width_chars) out <- gsub(ch, "", out,
fixed = TRUE)
out <- gsub(ctrl_collapse, " ", out)
for (ch in uni_space_chars) out <- gsub(ch, " ", out,
fixed = TRUE)
trimws(gsub(" +", " ", out))
}
changed_cols <- character(0)
cells_cleaned <- 0L
retyped <- character(0)
for (j in seq_along(df)) {
col <- df[[j]]
if (!is.character(col))
next
cleaned <- clean_text(col)
n_changed <- sum(!is.na(col) & !is.na(cleaned) & col !=
cleaned, na.rm = TRUE)
if (n_changed > 0L) {
changed_cols <- c(changed_cols, names(df)[j])
cells_cleaned <- cells_cleaned + n_changed
}
df[[j]] <- cleaned
non_blank <- cleaned[!is.na(cleaned) & nzchar(cleaned)]
if (length(non_blank) && all(grepl("^[+-]?(0|[1-9][0-9]*)([.][0-9]+)?$",
non_blank))) {
parsed <- suppressWarnings(as.numeric(cleaned))
was_blank <- is.na(cleaned) | !nzchar(cleaned)
lost <- (is.na(parsed) | is.infinite(parsed)) & !was_blank
if (!any(lost)) {
finite <- parsed[!is.na(parsed)]
all_whole <- all(finite == floor(finite))
in_range <- all(abs(finite) <= .Machine$integer.max)
df[[j]] <- if (all_whole && in_range)
as.integer(parsed)
else parsed
retyped <- c(retyped, names(df)[j])
}
}
}
names(df) <- clean_text(names(df))
if (length(changed_cols)) {
attr(df, "ingest_clean_columns") <- changed_cols
attr(df, "ingest_clean_cells_cleaned") <- cells_cleaned
}
if (length(retyped))
attr(df, "ingest_clean_retyped") <- retyped
df
}
data <- clean_cells(data)
# Complete-case analysis: drop rows missing any analysis value.
.acols <- c("mpg", "am")
data <- data[stats::complete.cases(data[, .acols, drop = FALSE]), , drop = FALSE]
result <- t.test(`mpg` ~ `am`, data = data, var.equal = FALSE)
print(result)
# Sensitivity: minimum detectable effect at n=32 (power=0.8, alpha=0.05). NOT observed power.
power <- pwr::pwr.t2n.test(n1 = 19, n2 = 13, sig.level = 0.05, power = 0.8)
print(power)Common questions
How do you write a conclusion for a confidence interval?
Name the quantity and its direction, give the point estimate, the confidence level and both limits in the outcome's units, and say which population and design the result applies to. Then say what the range is compatible with, for example only positive differences, without adding probability or causal language.
Is it correct to say we are 95% confident the true value is in the interval?
It is a widely taught shorthand, and it is acceptable only if the reader understands that the 95% describes the method: across many repetitions, about 95% of intervals built this way would contain the true value. It does not mean there is a 95% probability that this particular interval contains it. Because readers so often take it that way, the safer wording names the interval and says which values it is compatible with.
What do you conclude if the confidence interval contains zero?
Say that the data are compatible with no difference, and also with every other value inside the interval. Do not write that there is no difference or that the groups are the same. If the interval also includes differences large enough to matter, the honest conclusion is that the study is inconclusive.
Can I compare two groups by checking whether their confidence intervals overlap?
No. Two separate 95% intervals can overlap while the test of their difference is still significant at the 0.05 level. Compute the interval for the difference itself, as the worked example here does, and base the conclusion on that interval rather than on the two group intervals.
How do you interpret a confidence interval for an odds ratio or hazard ratio?
The no-effect value for a ratio is 1, not 0. If the interval lies entirely above or below 1, the data are less compatible with no association at that confidence level. If it spans 1, the data are compatible with no association and with every other ratio inside the interval. Report the ratio and both limits, and say which group is the reference.
Does a confidence interval that excludes zero mean the p-value is below 0.05?
When the 95% interval and the two-sided test come from the same method, as with a t-test, yes: the interval excludes zero exactly when the p-value is below 0.05. Intervals and tests built by different methods, common for proportions, can occasionally disagree near the boundary. The interval is still more informative, because it shows how large the difference could be and whether its smallest compatible value is big enough to matter in practice.
Sources
- Gardner MJ, Altman DG (1986). Confidence intervals rather than P values: estimation rather than hypothesis testing. BMJ 292(6522):746-750. doi:10.1136/bmj.292.6522.746
- Greenland S, Senn SJ, Rothman KJ, Carlin JB, Poole C, Goodman SN, Altman DG (2016). Statistical tests, P values, confidence intervals, and power: a guide to misinterpretations. European Journal of Epidemiology 31(4):337-350. doi:10.1007/s10654-016-0149-3
- Hoekstra R, Morey RD, Rouder JN, Wagenmakers EJ (2014). Robust misinterpretation of confidence intervals. Psychonomic Bulletin & Review 21(5):1157-1164. doi:10.3758/s13423-013-0572-3
- Schenker N, Gentleman JF (2001). On judging the significance of differences by examining the overlap between confidence intervals. The American Statistician 55(3):182-186. doi:10.1198/000313001317097960
Methods discussed
Try it on your own data
Upload a dataset and Celeus suggests a method, checks its assumptions, runs it in R, and gives you the script to rerun it.
Try it in Celeus