How To Conduct A Paired T Test

8 min read

You've got two sets of measurements from the same people. That said, before and after. Left eye and right eye. And same patients, two different drugs. The question is always the same: did something actually change?

Most stats courses teach the independent t-test first. Easy to understand. But the paired t-test? That's the one you'll actually use in real research. Two separate groups. And it's the one people mess up constantly.

Let's walk through it properly — no textbook fluff, just what you need to know to run it, interpret it, and not embarrass yourself.

What Is a Paired t-Test

A paired t-test compares two related measurements. In real terms, that's it. The "paired" part isn't optional — it's the whole point. Each data point in group A has a natural partner in group B. Same item. Same subject. Same time point under different conditions Surprisingly effective..

Think of it this way: you're not comparing two groups of people. You're comparing each person to themselves.

The test takes the difference for each pair, then asks: is the average difference significantly different from zero? That's the null hypothesis. Consider this: the alternative? So the mean difference isn't zero. Could be positive, could be negative — depends on your hypothesis Simple as that..

When It's Actually Paired Data

Not everything that looks paired is paired. This trips people up constantly.

True pairing:

  • Same patients measured before and after treatment
  • Matched case-control studies (each case matched to a specific control)
  • Left vs. right eye measurements on the same person
  • Same batch of product tested with two methods
  • Twins assigned to different interventions

Not paired — even if sample sizes match:

  • Two different classrooms taught with different methods
  • Men vs. women (unless you matched them on relevant variables)
  • Randomly assigned treatment vs. control groups
  • Any "convenience" grouping where the pairing is arbitrary

If you can't point to a specific reason why observation 7 in group A belongs with observation 7 in group B, it's not paired. Run an independent t-test instead.

Why It Matters / Why People Care

Here's the thing: pairing gives you power. Real, measurable statistical power.

When you measure the same thing twice on the same subject, you eliminate between-subject variability. You're left with only the within-subject change. All that noise — genetics, baseline health, measurement technique, mood that day — it cancels out. That's a cleaner signal.

An independent t-test on the same data would need a much larger sample to detect the same effect. Sometimes 2-4x larger. In clinical research, that's the difference between a feasible study and an impossible one No workaround needed..

But — and this is crucial — you only get that power if the pairing is real and the correlation between pairs is positive. Negative correlation? You've actually lost power. If your pairing is fake or the correlation is near zero, you've wasted degrees of freedom for nothing. The test becomes less sensitive than the independent version.

That's why "just pair everything to be safe" is terrible advice. In real terms, pair when there's a genuine reason. Don't manufacture it Small thing, real impact..

How to Conduct a Paired t-Test

Let's go step by step. I'll assume you have software — R, Python, SPSS, Jamovi, even Excel. The concepts are identical.

Step 1: Check Your Data Structure

You need two columns. Same length. This leads to row 1 in column A pairs with row 1 in column B. No missing values in either column for a given pair — if one's missing, drop the pair. Listwise deletion is standard here.

Column names matter for readability. Here's the thing — drug_a and drug_b. So left_eye and right_eye. So before and after. Not group1 and group2.

Step 2: Calculate the Differences

This is what the test actually runs on. Create a new variable: difference = after - before (or method2 - method1, etc.In practice, ). Direction matters for interpretation Surprisingly effective..

Look at this difference variable. Plot it. Histogram, boxplot, Q-Q plot.

  1. Outliers — a single extreme difference can swing the whole test. Paired t-tests are not dependable to outliers in the differences. One bad measurement ruins everything.
  2. Normality of differences — not normality of the original variables. The differences. This is the assumption people forget.

Step 3: Check the Normality Assumption

The paired t-test assumes the differences come from a normal distribution. Not the raw scores. The differences Turns out it matters..

With n > 30, the Central Limit Theorem usually saves you. In real terms, the sampling distribution of the mean difference will be approximately normal even if the differences aren't. But with small samples? You need to check.

Shapiro-Wilk test on the differences. Q-Q plot. Histogram. Think about it: it tests whether the median difference is zero, using ranks. If it's clearly non-normal with n < 30, consider the Wilcoxon signed-rank test instead — the non-parametric alternative. Less power if normality holds, but valid when it doesn't Small thing, real impact..

This changes depending on context. Keep that in mind.

Don't just run the test and hope. Look at the data.

Step 4: Run the Test

In R:

t.test(after, before, paired = TRUE)
# or
t.test(difference, mu = 0)

In Python (SciPy):

from scipy.stats import ttest_rel
stat, p = ttest_rel(after, before)

In Jamovi/SPSS: Analyze → Compare Means → Paired Samples T Test. Move your two variables into the paired variables box.

The output gives you:

  • Mean difference
  • Standard deviation of differences
  • Standard error of the mean difference
  • t-statistic
  • Degrees of freedom (n - 1)
  • p-value (two-tailed by default)
  • Confidence interval for the mean difference

Step 5: Interpret the Confidence Interval, Not Just the p-Value

The p-value tells you whether the difference is statistically distinguishable from zero. The confidence interval tells you how big the difference plausibly is Most people skip this — try not to. That's the whole idea..

A 95% CI of [2.7] means: if you repeated this study infinitely, 95% of the calculated intervals would contain the true mean difference. 1 and 8.1, 8.More practically: the true effect is probably somewhere between 2.7 units.

If that interval includes zero, the result isn't significant at α = 0.05. If it doesn't, it is. The CI and p-value are mathematically equivalent — but the CI gives you effect size context.

Report both. Always.

Step 6: Calculate and Report Effect Size

Statistical significance ≠ practical significance. With large samples, tiny differences become "significant." You need an effect size Worth keeping that in mind..

C

Effect Size for Paired Designs

The most common metric for paired‑sample data is Cohen’s d (sometimes called dz to point out the paired nature). It expresses the mean difference relative to the variability of the differences:

[ d_z = \frac{\bar{D}}{s_D} ]

where (\bar{D}) is the observed mean difference and (s_D) the standard deviation of those differences. Because the denominator uses the same differences that go into the t‑statistic, dz is directly comparable to the t‑value: (t = d_z \sqrt{df}).

In practice you can obtain dz from most statistical packages:

Software Command / Output
R cohen.d <- mean(diff) / sd(diff) <br>or psych::cohen.d(x, y, paired = TRUE)
Python d = np.mean(diff) / np.std(diff, ddof=1)
Jamovi The “Paired Samples T‑Test” module reports “Cohen’s d” automatically when you tick the “Effect size” option.

Interpretation guidelines (Cohen, 1988) are a useful shorthand:

d
Small ≈ 0.2
Medium ≈ 0.5
Large ≈ 0.

These benchmarks are context‑dependent; always tie the magnitude back to the substantive question (e.g., “a dz of 0.6 corresponds to a reduction of about 6 mmHg in systolic blood pressure, which is clinically meaningful”).

Confidence intervals for effect size

Effect‑size estimates are noisy, especially with small samples. Reporting a 95 % confidence interval (CI) around d adds valuable information:

[ \text{CI}{d} = d_z \pm t{0.975,df} \times \text{SE}(d_z) ]

where (\text{SE}(d_z) = \sqrt{\frac{n + d_z^2}{n}}) for paired designs. On the flip side, most modern packages (e. In real terms, g. , psych::ci.On top of that, cohen. d in R, pingouin.compute_effsize with confidence_interval=True in Python) will give you this interval automatically Easy to understand, harder to ignore. Less friction, more output..

Putting It All Together

When you write up results, a concise template looks like:

“A paired‑samples t‑test revealed a statistically significant increase from before (M = 12.4, SD = 3.1) to after (M = 15.8, SD = 3.Still, 6), t(22) = ‑4. On the flip side, 73, p < 0. 001, 95 % CI[‑4.That's why 2,‑1. Which means 8]. That said, the mean difference was 3. 4 units (95 % CI[1.On top of that, 8,5. Which means 0]), corresponding to a medium effect size, d = 0. Because of that, 62 (95 % CI[0. 31,0.93]).

Note how the statement includes:

  1. Descriptive statistics for each condition.
  2. Test statistic, degrees of freedom, and p‑value.
  3. Confidence interval for the mean difference (practical relevance).
  4. Effect size with its own CI (standardized magnitude).

When Assumptions Break Down

If the normality check fails with n < 30, the Wilcoxon signed‑rank test is a reliable alternative. Here's the thing — it tests the null hypothesis that the median difference is zero, using ranks rather than raw values. While it sacrifices a bit of power under normality, it protects you from severe skew or heavy tails.

If outliers dominate the difference scores, consider:

  • reliable alternatives such as the trimmed‑mean t‑test (t.test(..., trim = 0.2) in R).
  • Bootstrap confidence intervals for the mean difference (e.g., boot::boot in R).
This Week's New Stuff

Just Posted

You'll Probably Like These

You May Enjoy These

Thank you for reading about How To Conduct A Paired T Test. We hope the information has been useful. Feel free to contact us if you have any questions. See you next time — don't forget to bookmark!
⌂ Back to Home