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 . To find the area to the right, subtract from 1; the curve’s symmetry means the area below equals the area above .
R for an area (left tail):
pnorm(z)R for a critical value:
qnorm(area_to_left)
A two-sided confidence interval uses the critical value that
puts 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 is unknown. It is bell-shaped but heavier-tailed than the Normal; its shape depends on the degrees of freedom (). As grows, the t-table converges to the z-table (look at the bottom row below).
R for a critical value:
qt(1 - tail_area, df)A two-sided CI for a mean uses
qt(1 - (1 - C)/2, df)with .
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)
out33. The chi-square (χ²) table¶
The chi-square distribution is right-skewed and lives on . We use it for goodness-of-fit and independence tests, which are always one-sided (upper tail): only large values count as evidence against the null.
R for an upper-tail critical value:
qchisq(1 - alpha, df)R for a p-value from a statistic:
pchisq(stat, df, lower.tail = FALSE)
Degrees of freedom: for goodness of fit ( categories); for an 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)
out44. 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 (number of groups minus one) and the denominator (total observations minus number of groups). ANOVA tests are upper-tailed: large means the group means differ.
R for a critical value:
qf(1 - alpha, df1, df2)R for a p-value:
pf(F_stat, df1, df2, lower.tail = FALSE)
Because needs two ’s, a printed table fixes (here 0.05) and lays across the top, 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)
out55. Quick R reference for every table¶
| You want… | Direction | R function | Example |
|---|---|---|---|
| Normal area (left) | value area | pnorm(z) | pnorm(1.96) 0.975 |
| Normal critical value | area value | qnorm(p) | qnorm(0.975) 1.96 |
| t critical value | area value | qt(p, df) | qt(0.975, 10) |
| t p-value | value area | pt(t, df, lower.tail=FALSE) | upper tail |
| χ² critical value | area value | qchisq(1-a, df) | qchisq(0.95, 3) |
| χ² p-value | value area | pchisq(x, df, lower.tail=FALSE) | always upper tail |
| F critical value | area value | qf(1-a, df1, df2) | qf(0.95, 2, 30) |
| F p-value | value area | pf(F, df1, df2, lower.tail=FALSE) | always upper tail |