Markdown Editor

Reporting Statistical Results Template (Statistics, APA Style, R and Python)

Writing statistical results: complete-result anatomy, number formatting, model sentences for t, ANOVA, chi-square, correlation, regression, logistic, nonparametric and mixed models, tables, figures, checklist

Học thuậtĐầy đủAPA Publication Manual 7th ed. (name); APA JARS-Quant (name); ASA Statement on P-Values (Wasserstein and Lazar 2016)statsresultsreporting
Mở trong editorTải .md

Cách dùng: Use when turning software output into results text for a lab report, thesis chapter or client report: follow the six-part anatomy (question, descriptives, raw estimate, CI, test, effect size), copy the matching sentence pattern and tick the checklist. Every example number is traceable to the included R and Python code. The main pitfall is reporting only a p-value, or writing a non-significant result as evidence of no effect.

Xem trước

Reporting Statistical Results: [Your study question or course]

A writing guide and practice sheet for turning statistical output into results text: what a complete result contains, number formatting rules, model reporting sentences for t-tests, ANOVA, chi-square, correlation, linear and logistic regression, nonparametric tests and mixed models, table layouts, figure guidance and a final checklist. It is for students writing lab reports and exam answers, master's and PhD students drafting a results chapter, and analysts writing for clients. It speeds up learning by giving one fully worked paragraph, one half-written paragraph, one exercise, self-test questions and a separate answer key, with every number produced by the R and Python code included here. The worked examples use fictional data; replace them with your own. Source basis: reporting conventions in the spirit of the APA Publication Manual (7th ed.) and APA JARS-Quant, cited by name only; every sentence and table here is original.

Document control

This table records the report the results belong to, the style rules you are following and the software that produced the numbers. Rows marked Example: show how to fill a field.

FieldValue
Course or project[PSYC 310 lab report / thesis chapter 4 / client report]
Learner or analyst[Your name]
Data set[Name, version, date] Example: Lakemoor University and Brightwell Bakery examples (fictional)
Style guide followed[APA 7th ed. / journal name / department guide]
Software and versionsR 4.5.1 (stats), lme4 2.1.0; Python 3.14, numpy 2.5.4, pandas 3.1.0, scipy 1.18.1, statsmodels 0.15.0
DateYYYY-MM-DD
Version[0.1]

What a complete result contains

A result is complete when a reader can tell what was compared, how big the difference or association was, how precise that estimate is, and how the test came out, without opening your output files. Six parts:

  1. The question in words, tied to a named variable: "Students who revised with flashcards scored higher ...".
  2. Descriptive statistics for the groups or variables involved: means and SDs, medians and IQRs, percentages, with the sample size n for each group.
  3. The estimate of the effect in raw units: a mean difference, a slope, an odds ratio, a risk ratio.
  4. Its 95% confidence interval, so the reader sees the precision.
  5. The test: statistic, degrees of freedom df, exact p.
  6. A standardized effect size with its CI where one is conventional (g, ω², r, V, R²), and an interpretation that refers to the raw units.

Statistical significance alone is never the result. A sentence such as "the difference was significant (p < .05)" fails four of the six parts. The ASA Statement on Statistical Significance and P-Values (Wasserstein and Lazar 2016) makes the same point: a p-value does not measure the size or importance of an effect.

The order of the parts inside a paragraph follows the reader's questions, as the diagram shows.

Number formatting rules

The rules below follow common APA-style practice. Many journals and departments use the same conventions; check yours.

RuleCorrectIncorrect
Statistical symbols that are Latin letters are in italicst, F, p, M, SD, n, rt, F, p in plain type
Greek letters are not italicisedχ², η², ω², αχ²
Report p exactly, to three decimalsp = .027p < .05, p = 0.0271
Very small pp < .001p = .000, p = 1.2e-05
No leading zero for values that cannot exceed 1p = .025, r = .75, R² = .58p = 0.025, r = 0.75
Leading zero for values that can exceed 1d = 0.86, SE = 0.67d = .86
Two decimals for most statisticst(16.97) = 2.47t = 2.4661
Keep fractional df from Welch or Satterthwaitet(16.97)t(17)
CIs in square brackets, with the level stated once95% CI [0.78, 10.02](0.78-10.02), CI 0.78 to 10.02
Spaces around operatorst(16.97) = 2.47t(16.97)=2.47
Units with raw estimates5.40 points, 0.77 cm, 9 minutes5.40
Percentages with counts32 of 40 (80%)80%
Round once, from the unrounded valueF = 10.28 (from 10.28497)F = 10.29 (rounding 10.285 again)
Numbers at the start of a sentence are spelled out"Eighty students took part.""80 students took part."

The F rounding row is real: R's printed ANOVA table shows 10.29 because it formats the column for display (and a three-decimal value of 10.285 rounded again would also give 10.29), while the unrounded statistic is 10.28497, which rounds to 10.28. Always take the value you report from the unrounded output.

Reporting sentences for common methods

Every sentence in this section is computed from the fictional data in the next section, so you can check each number against the output.

Two independent groups, Welch t-test.

Students who revised with flashcards (M = 74.9, SD = 5.5, n = 10) scored higher than students who re-read their notes (M = 69.5, SD = 4.2, n = 10), a difference of 5.40 points, 95% CI [0.78, 10.02], Welch t(16.97) = 2.47, p = .025, Hedges' g = 1.06, 95% CI [0.14, 1.95].

Name the Welch test (the default for two independent groups) so readers know why df is not a whole number.

One-way ANOVA with post hoc comparisons.

Loaf height differed between yeast strains, F(2, 15) = 10.28, p = .002, ω² = .51. Strain B produced taller loaves (M = 10.80 cm, SD = 0.26) than strain A (M = 10.03 cm, SD = 0.30), a difference of 0.77 cm, 95% CI [0.33, 1.21], Tukey-adjusted p = .001. Strain C (M = 10.43 cm, SD = 0.31) did not differ clearly from A (0.40 cm, 95% CI [-0.04, 0.84], p = .077) or from B (-0.37 cm, 95% CI [-0.81, 0.07], p = .110). A Welch ANOVA gave the same conclusion, F(2, 9.93) = 10.44, p = .004.

Chi-square test of independence.

Students who attended revision sessions passed more often (32 of 40, 80%) than those who did not (22 of 40, 55%), χ²(1, N = 80) = 5.70, p = .017, φ = .27. Attenders were 1.45 times as likely to pass, risk ratio 95% CI [1.06, 2.00].

Report the counts and percentages; the test alone does not show the direction.

Correlation.

Hours studied and exam score were positively correlated, r(10) = .75, 95% CI [.31, .93], p = .005, n = 12.

The df for r is n - 2. With n = 12, the CI is wide: the data are compatible with a modest or a very strong relationship.

Multiple linear regression.

Hours studied and hours of sleep together explained 58% of the variance in exam score, R² = .58, adjusted R² = .49, F(2, 9) = 6.19, p = .020. Holding sleep constant, each additional hour of study was associated with 2.14 more points, 95% CI [0.62, 3.66], t(9) = 3.19, p = .011. Sleep was not clearly associated with score, b = 0.78, 95% CI [-2.58, 4.14], t(9) = 0.52, p = .613.

Give unstandardized coefficients b with CIs; add standardized β only if the scales are not meaningful. A full regression table (below) is usually clearer than a long sentence when there are more than two predictors.

Binary logistic regression.

The odds of passing increased with hours studied, b = 0.57, SE = 0.26, odds ratio = 1.77 per hour, 95% CI [1.07, 2.92], z = 2.21, p = .027. The model improved on the intercept-only model, likelihood ratio χ²(1) = 7.47, p = .006, n = 20.

Say which CI you report. The interval here is the Wald interval; R's confint() on a glm gives a profile likelihood interval, which is slightly different and often preferred in small samples.

Nonparametric comparison, Wilcoxon rank-sum (Mann-Whitney U) test.

Quiz completion times were shorter with the new interface (median = 19.0 minutes) than with the old one (median = 28.0 minutes), Wilcoxon rank-sum W = 57, exact p = .007, n = 8 per group. The Hodges-Lehmann estimate of the shift was 9 minutes, 95% CI [3, 17], rank-biserial r = .78.

R reports W and Python reports U; for the first sample they are the same number here (57). State which, and whether the p-value is exact or uses a normal approximation.

Linear mixed model.

A linear mixed model with a random intercept for student (6 students, 4 weekly quizzes each, REML estimation) showed that quiz scores rose by 3.10 points per week, SE = 0.15, 95% Wald CI [2.80, 3.40]. Students differed considerably in their baseline score (random intercept SD = 7.52) relative to the residual variation (SD = 0.85).

For mixed models report the model formula, the random effects structure, the estimation method (REML or ML), the software, the fixed effects with CIs, and the variance components. lme4 does not print p-values for fixed effects by design; if you need one, name the method (for example Satterthwaite df via the lmerTest package, or a likelihood ratio test).

The code behind every number

The helper fmt_p() formats p-values by the rules above. Both scripts produce the numbers used in the sentences.

library(lme4)   # install.packages("lme4") once; only needed for the mixed model
fmt_p <- function(p) ifelse(p < 0.001, "p < .001", paste0("p = ", sub("^0", "", sprintf("%.3f", p))))
# 1. Welch t-test: revision method (from stats-effect-sizes)
flash  <- c(72, 75, 81, 66, 79, 70, 74, 84, 77, 71)
reread <- c(65, 70, 74, 68, 72, 63, 77, 71, 66, 69)
tt <- t.test(flash, reread)
cat(sprintf("t(%.2f) = %.2f, %s, diff = %.2f, 95%% CI [%.2f, %.2f]\n", tt$parameter, tt$statistic,
            fmt_p(tt$p.value), diff(rev(tt$estimate)), tt$conf.int[1], tt$conf.int[2]))
# 2. One-way ANOVA: Brightwell loaf height
height <- c(9.8, 10.4, 10.1, 9.6, 10.0, 10.3, 10.6, 11.0, 10.8,
            10.5, 11.2, 10.7, 10.2, 10.9, 10.4, 10.0, 10.6, 10.5)
yeast <- factor(rep(c("A", "B", "C"), each = 6))
fit <- aov(height ~ yeast); print(summary(fit)); print(tapply(height, yeast, function(x) round(c(M = mean(x), SD = sd(x)), 2)))
print(TukeyHSD(fit))
print(oneway.test(height ~ yeast))       # Welch ANOVA
# 3. Chi-square: revision sessions x pass
pass_tab <- matrix(c(32, 8, 22, 18), nrow = 2, byrow = TRUE)
print(chisq.test(pass_tab, correct = FALSE))
# 4. Correlation: hours and score
hours <- c(2, 4, 5, 3, 8, 6, 7, 1, 9, 5, 6, 4)
score <- c(62, 60, 74, 66, 72, 64, 80, 58, 77, 61, 70, 69)
print(cor.test(hours, score))
# 5. Multiple regression
sleep <- c(6, 7, 6, 8, 7, 5, 8, 6, 7, 7, 8, 5)
m <- lm(score ~ hours + sleep); print(summary(m)); print(confint(m))
# 6. Logistic regression: pass by hours studied (20 students)
h20  <- c(1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10)
pass <- c(0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1)
lg <- glm(pass ~ h20, family = binomial)
print(summary(lg)$coefficients)
print(exp(cbind(OR = coef(lg), confint.default(lg))))
cat(sprintf("LR chi2(1) = %.2f, p = %.4f\n", lg$null.deviance - lg$deviance,
            pchisq(lg$null.deviance - lg$deviance, 1, lower.tail = FALSE)))
# 7. Mann-Whitney / Wilcoxon rank-sum: quiz times (minutes)
old <- c(22, 31, 19, 27, 45, 24, 29, 38)
new <- c(17, 21, 15, 23, 18, 26, 14, 20)
w <- wilcox.test(old, new, conf.int = TRUE); print(w)
cat(sprintf("medians %.1f %.1f, rank-biserial r = %.3f\n", median(old), median(new), 2 * w$statistic / (8 * 8) - 1))
# 8. Mixed model: weekly quiz scores, 6 students x 4 weeks
quiz <- data.frame(student = factor(rep(1:6, each = 4)), week = rep(0:3, 6),
                   score = c(60, 64, 66, 70, 52, 55, 60, 61, 70, 72, 75, 79,
                             58, 60, 65, 66, 65, 66, 70, 74, 48, 53, 55, 58))
mm <- lmer(score ~ week + (1 | student), data = quiz, REML = TRUE)
print(summary(mm)$coefficients); print(as.data.frame(VarCorr(mm))[, c("grp", "sdcor")])
print(confint(mm, parm = "week", method = "Wald"))
(output abridged)
t(16.97) = 2.47, p = .025, diff = 5.40, 95% CI [0.78, 10.02]
            Df Sum Sq Mean Sq F value  Pr(>F)
yeast        2  1.764  0.8822   10.29 0.00154 **
Residuals   15  1.287  0.0858
$A
    M    SD
10.03  0.30
$B
    M    SD
10.80  0.26
$C
    M    SD
10.43  0.31
$yeast
          diff         lwr        upr     p adj
B-A  0.7666667  0.32745148 1.20588185 0.0010836
C-A  0.4000000 -0.03921518 0.83921518 0.0769500
C-B -0.3666667 -0.80588185 0.07254852 0.1095564
F = 10.444, num df = 2.0000, denom df = 9.9321, p-value = 0.003612
X-squared = 5.698, df = 1, p-value = 0.01698
t = 3.6138, df = 10, p-value = 0.004738
95 percent confidence interval:
 0.3144736 0.9263664
      cor
0.7525562
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  51.8489     9.6282   5.385 0.000442 ***
hours         2.1414     0.6722   3.186 0.011080 *
sleep         0.7791     1.4871   0.524 0.612992
Residual standard error: 5.072 on 9 degrees of freedom
Multiple R-squared:  0.5792,	Adjusted R-squared:  0.4857
F-statistic: 6.193 on 2 and 9 DF,  p-value: 0.02034
                2.5 %    97.5 %
(Intercept) 30.068423 73.629358
hours        0.620874  3.661936
sleep       -2.584918  4.143143
              Estimate Std. Error   z value   Pr(>|z|)
(Intercept) -2.9310020  1.4819892 -1.977749 0.04795707
h20          0.5682135  0.2570369  2.210630 0.02706150
                    OR       2.5 %    97.5 %
(Intercept) 0.05334356 0.002921531 0.9739877
h20         1.76511081 1.066551244 2.9212063
LR chi2(1) = 7.47, p = 0.0063
	Wilcoxon rank sum exact test
W = 57, p-value = 0.006993
95 percent confidence interval:
  3 17
difference in location
                     9
medians 28.0 19.0, rank-biserial r = 0.781
            Estimate Std. Error  t value
(Intercept) 58.76667   3.084629 19.05145
week         3.10000   0.154666 20.04319
       grp     sdcor
1  student 7.5224502
2 Residual 0.8471405
       2.5 %  97.5 %
week 2.79686 3.40314
import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.formula.api as smf
from statsmodels.stats.anova import anova_lm
from statsmodels.stats.multicomp import pairwise_tukeyhsd

def fmt_p(p):
    return "p < .001" if p < 0.001 else "p = " + f"{p:.3f}".lstrip("0")

# 1. Welch t-test
flash = np.array([72, 75, 81, 66, 79, 70, 74, 84, 77, 71])
reread = np.array([65, 70, 74, 68, 72, 63, 77, 71, 66, 69])
tt = stats.ttest_ind(flash, reread, equal_var=False)
ci = tt.confidence_interval()
print(f"1 t({tt.df:.2f}) = {tt.statistic:.2f}, {fmt_p(tt.pvalue)}, 95% CI [{ci.low:.2f}, {ci.high:.2f}]")
# 2. One-way ANOVA with Tukey HSD
bake = pd.DataFrame({
    "height": [9.8, 10.4, 10.1, 9.6, 10.0, 10.3, 10.6, 11.0, 10.8,
               10.5, 11.2, 10.7, 10.2, 10.9, 10.4, 10.0, 10.6, 10.5],
    "yeast": ["A"] * 6 + ["B"] * 6 + ["C"] * 6})
a = anova_lm(smf.ols("height ~ C(yeast)", data=bake).fit())
print(f"2 F({a.df.iloc[0]:.0f}, {a.df.iloc[1]:.0f}) = {a.F.iloc[0]:.2f}, {fmt_p(a['PR(>F)'].iloc[0])}")
print(pairwise_tukeyhsd(bake.height, bake.yeast).summary())
# 3. Chi-square
chi2, p, dof, _ = stats.chi2_contingency(np.array([[32, 8], [22, 18]]), correction=False)
print(f"3 chi2({dof}, N = 80) = {chi2:.2f}, {fmt_p(p)}")
# 4. Correlation
hours = np.array([2, 4, 5, 3, 8, 6, 7, 1, 9, 5, 6, 4])
score = np.array([62, 60, 74, 66, 72, 64, 80, 58, 77, 61, 70, 69])
r = stats.pearsonr(hours, score); rci = r.confidence_interval()
print(f"4 r({len(hours) - 2}) = {r.statistic:.2f}, 95% CI [{rci.low:.2f}, {rci.high:.2f}], {fmt_p(r.pvalue)}")
# 5. Multiple regression
d = pd.DataFrame({"score": score, "hours": hours, "sleep": [6, 7, 6, 8, 7, 5, 8, 6, 7, 7, 8, 5]})
m = smf.ols("score ~ hours + sleep", data=d).fit()
print(f"5 R2 = {m.rsquared:.3f}, adj = {m.rsquared_adj:.3f}, F({m.df_model:.0f}, {m.df_resid:.0f}) = {m.fvalue:.2f}, {fmt_p(m.f_pvalue)}")
print(pd.concat([m.params, m.bse, m.pvalues, m.conf_int()], axis=1).round(3))
# 6. Logistic regression
lg_d = pd.DataFrame({"hours": [1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10],
                     "passed": [0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1]})
lg = smf.logit("passed ~ hours", data=lg_d).fit(disp=False)
print(f"6 b = {lg.params['hours']:.3f}, SE = {lg.bse['hours']:.3f}, OR = {np.exp(lg.params['hours']):.2f}, "
      f"95% CI [{np.exp(lg.conf_int().loc['hours', 0]):.2f}, {np.exp(lg.conf_int().loc['hours', 1]):.2f}], "
      f"z = {lg.tvalues['hours']:.2f}, {fmt_p(lg.pvalues['hours'])}; LR chi2(1) = {lg.llr:.2f}, {fmt_p(lg.llr_pvalue)}")
# 7. Mann-Whitney U (exact when there are no ties and samples are small)
old = np.array([22, 31, 19, 27, 45, 24, 29, 38])
new = np.array([17, 21, 15, 23, 18, 26, 14, 20])
mw = stats.mannwhitneyu(old, new, method="exact")
hl = np.median(np.subtract.outer(old, new))      # Hodges-Lehmann shift
print(f"7 U = {mw.statistic:.0f}, {fmt_p(mw.pvalue)}, HL shift = {hl:.1f}, "
      f"rank-biserial r = {2 * mw.statistic / (8 * 8) - 1:.3f}")
# 8. Mixed model (REML), random intercept per student
quiz = pd.DataFrame({"student": np.repeat(range(1, 7), 4), "week": np.tile(range(4), 6),
                     "score": [60, 64, 66, 70, 52, 55, 60, 61, 70, 72, 75, 79,
                               58, 60, 65, 66, 65, 66, 70, 74, 48, 53, 55, 58]})
mm = smf.mixedlm("score ~ week", quiz, groups=quiz["student"]).fit(reml=True)
print(f"8 week b = {mm.params['week']:.3f}, SE = {mm.bse['week']:.3f}, 95% CI "
      f"[{mm.conf_int().loc['week', 0]:.2f}, {mm.conf_int().loc['week', 1]:.2f}], "
      f"z = {mm.tvalues['week']:.2f}; SD student = {np.sqrt(mm.cov_re.iloc[0, 0]):.2f}, "
      f"SD residual = {np.sqrt(mm.scale):.2f}")
(output abridged)
1 t(16.97) = 2.47, p = .025, 95% CI [0.78, 10.02]
2 F(2, 15) = 10.28, p = .002
Multiple Comparison of Means - Tukey HSD, FWER=0.05
group1 group2 meandiff p-adj   lower  upper  reject
     A      B   0.7667 0.0011  0.3275 1.2059   True
     A      C      0.4 0.0769 -0.0392 0.8392  False
     B      C  -0.3667 0.1096 -0.8059 0.0725  False
3 chi2(1, N = 80) = 5.70, p = .017
4 r(10) = 0.75, 95% CI [0.31, 0.93], p = .005
5 R2 = 0.579, adj = 0.486, F(2, 9) = 6.19, p = .020
                0      1      2       0       1
Intercept  51.849  9.628  0.000  30.068  73.629
hours       2.141  0.672  0.011   0.621   3.662
sleep       0.779  1.487  0.613  -2.585   4.143
6 b = 0.568, SE = 0.257, OR = 1.77, 95% CI [1.07, 2.92], z = 2.21, p = .027; LR chi2(1) = 7.47, p = .006
7 U = 57, p = .007, HL shift = 9.0, rank-biserial r = 0.781
8 week b = 3.100, SE = 0.155, 95% CI [2.80, 3.40], z = 20.04; SD student = 7.52, SD residual = 0.85

Where R and Python differ, and what to write:

  • Welch by default in R, pooled by default in scipy. The Python script passes equal_var=False to match R's t.test(). Always say which test you used.
  • ANOVA F display. R's table prints 10.29, the Python format gives 10.28; the unrounded value is 10.28497, so report 10.28.
  • Wilcoxon W vs Mann-Whitney U. R labels the statistic W, scipy labels it U; both are the rank-sum count for the first sample (57). scipy does not return a Hodges-Lehmann CI; the code computes the point estimate (9.0) and R's conf.int = TRUE gives the interval [3, 17].
  • Mixed model inference. statsmodels prints a z statistic and p-value for fixed effects; lme4 prints a t value without p. Both give the same estimate, SE and Wald CI here because both use REML.
  • Logistic CIs. statsmodels conf_int() and R confint.default() are Wald intervals; R confint() would give profile intervals.

Table layouts

Descriptive statistics table. One row per group, one column per statistic, the n in each row, units in the header.

Yeast strainnM (cm)SD (cm)95% CI for M (cm)
Example: A610.030.30[9.72, 10.35]
Example: B610.800.26[10.53, 11.07]
Example: C610.430.31[10.10, 10.76]
[Group][ ][ ][ ][ , ]

Regression table. One row per term, unstandardized estimate with CI, test and p, and model fit in a note below.

PredictorbSE95% CIt(9)p
Example: Intercept51.859.63[30.07, 73.63]5.39< .001
Example: Hours studied2.140.67[0.62, 3.66]3.19.011
Example: Hours of sleep0.781.49[-2.58, 4.14]0.52.613
[Predictor][ ][ ][ , ][ ][ ]

Note. n = 12. R² = .58, adjusted R² = .49, F(2, 9) = 6.19, p = .020. Outcome: exam score (0 to 100).

Logistic regression table. Report the coefficient on the log-odds scale and the odds ratio with its CI; name the CI method in the note.

PredictorbSEOR95% CI for ORzp
Example: Hours studied0.570.261.77[1.07, 2.92]2.21.027
[Predictor][ ][ ][ ][ , ][ ][ ]

Note. n = 20. Wald confidence intervals. Likelihood ratio χ²(1) = 7.47, p = .006.

Table rules: number tables in order of mention; give every table a title that says what it shows; put units in column headers; align decimals; use the same number of decimals within a column; define every abbreviation in a note; put p-values as numbers, not stars, unless your field requires stars (and then define them).

Figure guidance

Figures should let the reader see the data behind the summary. Five rules:

  1. Show the raw data points when n is small (under about 50 per group), with the summary on top. Bar charts of means hide the distribution and the sample size.
  2. State what error bars show in the caption: SD (spread of the data), SE (precision of the mean, rarely useful alone) or 95% CI (precision with a known coverage). The three can differ by a factor of three or more.
  3. Start the axis where it makes sense. Bars must start at zero; dot and line charts need not, but say so if a reader could be misled.
  4. Label axes with the variable name and unit, and avoid legends when direct labels fit.
  5. Use colour that survives greyscale printing and colour blindness; do not encode the only information in red versus green.

The chart below follows these rules for the bakery example: every loaf is shown as a point, the black marks are the group means, and the bars are 95% confidence intervals for the mean computed with the t distribution (df = 5).

Figure caption pattern: "Figure [1]. Loaf height (cm) for three yeast strains. Points show individual loaves (n = 6 per strain); black dots show group means and bars show 95% confidence intervals for the mean."

Worked example A (fully solved): from output to a results paragraph

Task. Write the results paragraph for the Brightwell Bakery yeast trial from the R and Python output above.

Decisions.

  1. Primary test: one-way ANOVA on loaf height with three strains; report F(2, 15), exact p and ω² = .51 (from stats-effect-sizes; ω² is preferred to η² with 18 loaves).
  2. Assumption check: the group SDs are similar (0.26 to 0.31), and the Welch ANOVA agrees, so report it in one clause as a robustness check.
  3. Follow-up: Tukey HSD comparisons with differences, CIs and adjusted p-values, in raw units (cm).
  4. Descriptives: means and SDs for each strain, in a table if more groups, inline here because there are three.
  5. Rounding: two decimals for cm and test statistics; p to three decimals; ω² without a leading zero.

Paragraph.

Loaf height differed between the three yeast strains, F(2, 15) = 10.28, p = .002, ω² = .51 (Figure 1). Tukey-adjusted comparisons showed that strain B (M = 10.80 cm, SD = 0.26) produced taller loaves than strain A (M = 10.03 cm, SD = 0.30), a difference of 0.77 cm, 95% CI [0.33, 1.21], p = .001. Strain C (M = 10.43 cm, SD = 0.31) lay between them and did not differ clearly from either A (0.40 cm, 95% CI [-0.04, 0.84], p = .077) or B (-0.37 cm, 95% CI [-0.81, 0.07], p = .110). A Welch ANOVA, which does not assume equal variances, led to the same conclusion, F(2, 9.93) = 10.44, p = .004. With six loaves per strain, the comparisons involving C are imprecise; a gain of up to 0.84 cm over strain A cannot be ruled out.

Why it is complete. Question in words, descriptives with n (in the figure caption), raw estimates with CIs, tests with df and exact p, a standardized effect size, a robustness check, and a sentence on precision rather than a claim that C "has no effect".

Worked example B (half solved): logistic regression paragraph

Task. Write the result for the question "Does the number of hours studied predict passing the Lakemoor statistics exam?" (n = 20).

Of the 20 students, [ ] passed. The odds of passing increased with hours studied: each additional hour multiplied the odds by [ ], 95% CI [[ ], [ ]], b = [ ], SE = [ ], z = [ ], p = [ ]. The model with hours fitted better than the intercept-only model, likelihood ratio χ²([ ]) = [ ], p = [ ].

Then answer: (1) Why would "students who studied one more hour were 1.77 times as likely to pass" be wrong? [ ] (2) Which CI method did you report, and where would you say so? [ ]

Exercise C (unsolved): nonparametric result and a mixed model sentence

(a) Lakemoor compared quiz completion times (minutes) for the old interface (22, 31, 19, 27, 45, 24, 29, 38) and the new one (17, 21, 15, 23, 18, 26, 14, 20), n = 8 per group. The times are skewed (one student took 45 minutes), so a Wilcoxon rank-sum test was run. Using the output above, write a complete result sentence, including the descriptive statistics, the shift estimate with CI, the test and an effect size.

(b) Using the mixed model output, write one sentence reporting the weekly change in quiz score and one sentence reporting the variance components. State the estimation method.

Results checklist

Structure aligned with the reporting elements named in the APA Publication Manual (7th ed.) and the APA Journal Article Reporting Standards for quantitative research (JARS-Quant); the wording and items are original.

  • Each result restates the question in words and names the test or model.
  • Descriptive statistics (with n per group) are given for every variable in the test.
  • The raw-unit estimate and its 95% CI are reported.
  • Test statistic, df and exact p (or p < .001) are reported.
  • A standardized effect size with CI is reported where conventional.
  • Symbols are italicised, decimals are consistent, leading zeros follow the rule.
  • Assumption checks and any sensitivity analyses are reported with their outcome.
  • Missing data and excluded cases are stated, with reasons and numbers.
  • Multiple comparisons are adjusted, and the method is named.
  • Every table and figure is referred to in the text; error bars are defined.
  • Software and versions (and packages) are named in the method section.
  • Non-significant results are reported with estimates and CIs, not as "no effect".
  • No number appears in both a table and the text unless it is the key result.

Common mistakes and misconceptions

MistakeExampleFix
Only the p-value"There was a significant difference (p < .05)."Add descriptives, estimate, CI, test, df, effect size
p = .000Copying software outputWrite p < .001
"Marginally significant" or "trend" for p = .06Softening a result that missed αReport the estimate and CI and describe the uncertainty
Non-significant means no effect"Strain C had no effect (p = .077)""did not differ clearly; the CI ranges from -0.04 to 0.84 cm"
Treating p as the probability H0 is true"There is a 2.5% chance the methods are equal"p is the probability of data this extreme if H0 were true
OR read as RR"1.77 times as likely to pass""multiplied the odds by 1.77"
Unstated error bars"Error bars show variability.""Bars show 95% CIs for the mean"
Inconsistent decimalsM = 74.9 next to M = 69.53Same decimals within a comparison
Rounded df for Welcht(17) = 2.47t(16.97) = 2.47
Causal language for an observational association"Study hours cause 58% of the score"Describe association unless the design is experimental

Self-test questions

  1. List the six parts of a complete result.
  2. Rewrite this sentence correctly: "The groups were significantly different (t = 2.4661, p = 0.0251)."
  3. Which values take a leading zero: p, d, r, SE, R²?
  4. Your figure shows mean bars with "error bars". What three things could the bars be, and which do you prefer for inference?
  5. A colleague reports p = .077 as "no difference between strain A and C". What do you suggest instead?
  6. For a mixed model, name four things the method or results text must state beyond the fixed effect estimates.

My notes and next steps

ItemYour entry
Confidence in writing complete results (1 to 5)[ ]
Style guide differences I must follow[e.g. journal wants two decimals for p]
Results in my report still missing a part[ ]
Open questions for my supervisor[ ]
Errors logged in stats-error-log[Link or IDs]
Next template to study[stats-analysis-report]
Next review dateYYYY-MM-DD

Sources and further reading

Based on the following sources, cited by name; all sentences, tables and examples here are original.

  • American Psychological Association (2020). Publication Manual of the American Psychological Association (7th ed.). Cited by name only.
  • Appelbaum, M., Cooper, H., Kline, R. B., Mayo-Wilson, E., Nezu, A. M., and Rao, S. M. (2018). Journal article reporting standards for quantitative research in psychology: the APA Publications and Communications Board task force report. American Psychologist, 73(1), 3–25. (JARS-Quant, cited by name only.)
  • Wasserstein, R. L., and Lazar, N. A. (2016). The ASA statement on p-values: context, process, and purpose. The American Statistician, 70(2), 129–133.
  • Wilkinson, L., and the Task Force on Statistical Inference (1999). Statistical methods in psychology journals: guidelines and explanations. American Psychologist, 54(8), 594–604.
  • Welch, B. L. (1947). The generalization of "Student's" problem when several different population variances are involved. Biometrika, 34(1–2), 28–35.
  • Mann, H. B., and Whitney, D. R. (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.
  • Bates, D., Mächler, M., Bolker, B., and Walker, S. (2015). Fitting linear mixed-effects models using lme4. Journal of Statistical Software, 67(1), 1–48.
  • Further reading: NIST/SEMATECH e-Handbook of Statistical Methods (public domain); de Smith, M. J., Statistical Analysis Handbook (2024 edition, statsref.com); OpenIntro Statistics.

Answer key

Example B.

Of the 20 students, 11 passed. The odds of passing increased with hours studied: each additional hour multiplied the odds by 1.77, 95% CI [1.07, 2.92], b = 0.57, SE = 0.26, z = 2.21, p = .027. The model with hours fitted better than the intercept-only model, likelihood ratio χ²(1) = 7.47, p = .006.

(1) An odds ratio is not a risk ratio; when the outcome is common (11 of 20 passed) the OR is further from 1 than the ratio of probabilities, so "1.77 times as likely" overstates the effect. (2) Wald intervals (from confint.default() or statsmodels conf_int()); say so in the table note or the method section.

Exercise C.

(a) "Quiz completion times were shorter with the new interface (median = 19.0 minutes) than with the old interface (median = 28.0 minutes), Wilcoxon rank-sum W = 57, exact p = .007, n = 8 per group. The Hodges-Lehmann estimate of the difference was 9 minutes, 95% CI [3, 17], rank-biserial r = .78."

(b) "In a linear mixed model with a random intercept for student, fitted by REML, quiz scores increased by 3.10 points per week, SE = 0.15, 95% Wald CI [2.80, 3.40]. Baseline scores varied considerably between students (random intercept SD = 7.52 points) compared with the residual variation within students (SD = 0.85 points)."

Self-test.

  1. The question in words; descriptive statistics with n; the raw-unit estimate; its 95% CI; the test statistic with df and exact p; a standardized effect size with interpretation.
  2. "Group 1 (M = ..., SD = ..., n = ...) scored higher than group 2 (...), a difference of [raw units], 95% CI [..., ...], Welch t([df]) = 2.47, p = .025, g = ..., 95% CI [..., ...]." Two decimals for t, three for p, no leading zero for p, df given, italics.
  3. d and SE take a leading zero (they can exceed 1); p, r and R² do not.
  4. SD, SE or 95% CI. For inference a 95% CI is preferred, and the caption must say which one it is.
  5. Report the difference with its CI (0.40 cm, 95% CI [-0.04, 0.84]) and say the data cannot distinguish between no difference and a gain of up to 0.84 cm.
  6. The model formula including random effects; the estimation method (REML or ML); the software and package versions; the variance components (random effect SDs and residual SD); the number of units and observations per level; and how p-values or CIs were obtained.

Revision history

VersionDateAuthorChange summary
0.1YYYY-MM-DD[Your name]First draft from template
[0.2]YYYY-MM-DD[Your name]Example: Switched to journal style with two-decimal p-values

Template liên quan