Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Before software, statisticians read probability tables to turn a distribution into a number (a probability or a critical value). You will mostly use R — pnorm, qt, and friends — but reading a table by hand cements what those functions actually do, and many exams still hand you one. This appendix explains how to read each table and then generates small reference tables with live R code so the values are computed, never transcribed.

# Round helper so every printed table is tidy and reproducible.
fmt <- function(x, d = 4) formatC(x, format = "f", digits = d)

11. The standard Normal (z) table

The z-table gives the area to the left of a z-score under the standard Normal curve N(0,1)N(0, 1). To find the area to the right, subtract from 1; the curve’s symmetry means the area below z-z equals the area above +z+z.

A two-sided C%C\% confidence interval uses the critical value zz^\star that puts (1C)/2(1-C)/2 in each tail, i.e. qnorm(1 - (1 - C)/2).

z   <- c(-2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 1.96, 2, 2.5)
data.frame(z = z, `area_left_P(Z<z)` = fmt(pnorm(z)), check.names = FALSE)
conf <- c(0.80, 0.90, 0.95, 0.98, 0.99)
data.frame(
  confidence_level = paste0(conf * 100, "%"),
  tail_area_each   = fmt((1 - conf) / 2),
  z_star           = fmt(qnorm(1 - (1 - conf) / 2))
)

The 68–95–99.7 rule is just three z-areas; here are the exact figures:

k <- 1:3
data.frame(
  within_k_SD = k,
  exact_area  = fmt(pnorm(k) - pnorm(-k)),
  rounded     = c("68%", "95%", "99.7%")
)

22. The t table

The t-distribution is used for inference about means when σ\sigma is unknown. It is bell-shaped but heavier-tailed than the Normal; its shape depends on the degrees of freedom (dfdf). As dfdf grows, the t-table converges to the z-table (look at the bottom row below).

dfs   <- c(1, 5, 10, 15, 20, 30, 50, 100, Inf)
levels_c <- c(0.90, 0.95, 0.99)
tbl <- sapply(levels_c, function(C) qt(1 - (1 - C) / 2, dfs))
out <- data.frame(df = ifelse(is.finite(dfs), as.character(dfs), "Inf (= z)"),
                  check.names = FALSE)
out[paste0("t*_", levels_c * 100, "%")] <- fmt(tbl)
out

33. The chi-square (χ²) table

The chi-square distribution is right-skewed and lives on [0,)[0, \infty). We use it for goodness-of-fit and independence tests, which are always one-sided (upper tail): only large χ2\chi^2 values count as evidence against the null.

Degrees of freedom: k1k - 1 for goodness of fit (kk categories); (r1)(c1)(r-1)(c-1) for an r×cr \times c independence table.

df_chi <- c(1, 2, 3, 4, 5, 6, 8, 10)
alphas <- c(0.10, 0.05, 0.01)
m <- sapply(alphas, function(a) qchisq(1 - a, df_chi))
out <- data.frame(df = df_chi)
out[paste0("alpha=", alphas)] <- fmt(m, 3)
out

44. The F table

The F-distribution is used in ANOVA to compare variances. It is right-skewed and indexed by two degrees of freedom: the numerator df1=k1df_1 = k - 1 (number of groups minus one) and the denominator df2=Nkdf_2 = N - k (total observations minus number of groups). ANOVA tests are upper-tailed: large FF means the group means differ.

Because FF needs two dfdf’s, a printed table fixes α\alpha (here 0.05) and lays df1df_1 across the top, df2df_2 down the side:

df1_vals <- c(1, 2, 3, 4, 5)
df2_vals <- c(5, 10, 15, 20, 30, 60, 120)
fmat <- outer(df2_vals, df1_vals, function(d2, d1) qf(0.95, d1, d2))
out <- data.frame(df2 = df2_vals)
out[paste0("df1=", df1_vals)] <- fmt(fmat, 3)
out

55. Quick R reference for every table

You want…DirectionR functionExample
Normal area (left)value \rightarrow areapnorm(z)pnorm(1.96) \rightarrow 0.975
Normal critical valuearea \rightarrow valueqnorm(p)qnorm(0.975) \rightarrow 1.96
t critical valuearea \rightarrow valueqt(p, df)qt(0.975, 10)
t p-valuevalue \rightarrow areapt(t, df, lower.tail=FALSE)upper tail
χ² critical valuearea \rightarrow valueqchisq(1-a, df)qchisq(0.95, 3)
χ² p-valuevalue \rightarrow areapchisq(x, df, lower.tail=FALSE)always upper tail
F critical valuearea \rightarrow valueqf(1-a, df1, df2)qf(0.95, 2, 30)
F p-valuevalue \rightarrow areapf(F, df1, df2, lower.tail=FALSE)always upper tail