Appendix C — Statistical Tables

Status: ported 2026-05-18. All tables generated reproducibly from R distribution functions, except the Durbin-Watson bounds (Durbin & Watson 1951).

This appendix gathers the critical-value tables we use most often in the book: the \(t\), \(F\), and \(\chi^{2}\) distributions for the inferential procedures of Chapter 4, plus the Durbin–Watson bounds used in the serial-correlation diagnostic of Chapter 8. Because the entries below are produced inside R by the quantile functions qt(), qf(), and qchisq(), they are exact to machine precision rather than rounded as in printed appendices. A reader who wants a value not listed here can simply re-run the corresponding chunk with extra rows or columns.

How to read these tables

A critical value \(c_{\alpha}\) is the threshold a test statistic must cross to reject the null at significance level \(\alpha\): for a one-sided \(t\)-test of \(H_{0}: \beta_{j} = 0\) against \(H_{1}: \beta_{j} > 0\) at the 5% level, we reject when \(t > c_{0.05}\). A \(p\)-value turns the question around: it is the smallest \(\alpha\) at which the null would have been rejected given the observed statistic. The two views are equivalent — given a \(p\)-value you know which critical values you would have crossed — but the tables here are organised around critical values because that is still how most printed inference works through.

For the \(t\)-distribution, the columns below report one-tailed upper-tail critical values: \(c\) such that \(\Pr(T_{df} > c) = \alpha\). For a two-tailed test at level \(\alpha\), look up the \(\alpha/2\) column instead — so the 5% two-tailed critical value is the entry in the \(\alpha = 0.025\) column. The \(F\) and \(\chi^{2}\) tables are intrinsically one-tailed (their statistics are non-negative) and need no such adjustment. The \(t\) table is invoked in §4.5 for single-coefficient hypothesis testing; the \(F\) table is used in §4.7 for joint tests and again in §7.3 for the Breusch–Pagan heteroskedasticity test; the \(\chi^{2}\) table covers the large-sample variants of those tests; and the Durbin–Watson bounds in §C.4 are the reference for the serial-correlation diagnostic of §8.3.

C.1 C.1 Critical values of the \(t\)-distribution

The entries below are one-tailed upper critical values \(c\) such that \(\Pr(T_{df} > c) = \alpha\). The last row, \(df = \infty\), coincides with the standard-normal quantiles \(z_{1-\alpha}\) — the bridge formalised by the CLT in §A.4.

Code
df_t    <- c(1:30, 40, 60, 90, 120, Inf)
alpha_t <- c(0.10, 0.05, 0.025, 0.01, 0.005, 0.001)

t_tab <- sapply(alpha_t, function(a) qt(1 - a, df = df_t))
t_tab <- as.data.frame(t_tab)
colnames(t_tab) <- paste0("α = ", format(alpha_t, scientific = FALSE))
t_tab <- cbind(df = ifelse(is.infinite(df_t), "∞", as.character(df_t)),
               t_tab)

knitr::kable(
  t_tab,
  digits  = 3,
  align   = c("l", rep("r", length(alpha_t))),
  caption = "One-tailed critical values of the $t$-distribution. For a two-tailed test at level $\\alpha$, read the $\\alpha/2$ column."
)
One-tailed critical values of the \(t\)-distribution. For a two-tailed test at level \(\alpha\), read the \(\alpha/2\) column.
df α = 0.100 α = 0.050 α = 0.025 α = 0.010 α = 0.005 α = 0.001
1 3.078 6.314 12.706 31.821 63.657 318.309
2 1.886 2.920 4.303 6.965 9.925 22.327
3 1.638 2.353 3.182 4.541 5.841 10.215
4 1.533 2.132 2.776 3.747 4.604 7.173
5 1.476 2.015 2.571 3.365 4.032 5.893
6 1.440 1.943 2.447 3.143 3.707 5.208
7 1.415 1.895 2.365 2.998 3.499 4.785
8 1.397 1.860 2.306 2.896 3.355 4.501
9 1.383 1.833 2.262 2.821 3.250 4.297
10 1.372 1.812 2.228 2.764 3.169 4.144
11 1.363 1.796 2.201 2.718 3.106 4.025
12 1.356 1.782 2.179 2.681 3.055 3.930
13 1.350 1.771 2.160 2.650 3.012 3.852
14 1.345 1.761 2.145 2.624 2.977 3.787
15 1.341 1.753 2.131 2.602 2.947 3.733
16 1.337 1.746 2.120 2.583 2.921 3.686
17 1.333 1.740 2.110 2.567 2.898 3.646
18 1.330 1.734 2.101 2.552 2.878 3.610
19 1.328 1.729 2.093 2.539 2.861 3.579
20 1.325 1.725 2.086 2.528 2.845 3.552
21 1.323 1.721 2.080 2.518 2.831 3.527
22 1.321 1.717 2.074 2.508 2.819 3.505
23 1.319 1.714 2.069 2.500 2.807 3.485
24 1.318 1.711 2.064 2.492 2.797 3.467
25 1.316 1.708 2.060 2.485 2.787 3.450
26 1.315 1.706 2.056 2.479 2.779 3.435
27 1.314 1.703 2.052 2.473 2.771 3.421
28 1.313 1.701 2.048 2.467 2.763 3.408
29 1.311 1.699 2.045 2.462 2.756 3.396
30 1.310 1.697 2.042 2.457 2.750 3.385
40 1.303 1.684 2.021 2.423 2.704 3.307
60 1.296 1.671 2.000 2.390 2.660 3.232
90 1.291 1.662 1.987 2.368 2.632 3.183
120 1.289 1.658 1.980 2.358 2.617 3.160
1.282 1.645 1.960 2.326 2.576 3.090

A handful of entries are worth memorising. With \(df = \infty\) the table reproduces \(z_{0.975} = 1.96\) (column \(\alpha = 0.025\)) and \(z_{0.995} = 2.576\) (column \(\alpha = 0.005\)), the standard-normal critical values for two-sided tests at 5% and 1%. For \(df \geq 30\) the rule of thumb that \(t\) is “close to normal” already pays off: the 5% two-sided critical value (column \(\alpha = 0.025\)) sits within 5% of 1.96.

C.2 C.2 Critical values of the \(F\)-distribution

The \(F\)-tables tabulate the upper-\(\alpha\) critical value of \(F_{k_{1}, k_{2}}\), where \(k_{1}\) is the numerator degrees of freedom (the number of restrictions in a joint test) and \(k_{2}\) is the denominator degrees of freedom (typically \(n - k - 1\) in a \(k\)-regressor model with an intercept). We tabulate the two conventional significance levels separately.

Code
num_df <- c(1, 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 30)
den_df <- c(10, 15, 20, 25, 30, 40, 60, 120, Inf)

f_tab_05 <- outer(den_df, num_df,
                  function(d, n) qf(0.95, df1 = n, df2 = d))
f_tab_05 <- as.data.frame(f_tab_05)
colnames(f_tab_05) <- paste0("k1 = ", num_df)
f_tab_05 <- cbind(`k2 (den. df)` = ifelse(is.infinite(den_df), "∞",
                                          as.character(den_df)),
                  f_tab_05)

knitr::kable(
  f_tab_05,
  digits  = 3,
  align   = c("l", rep("r", length(num_df))),
  caption = "Critical values of the $F$-distribution at $\\alpha = 0.05$ (upper tail). Rows: denominator df $k_{2}$. Columns: numerator df $k_{1}$."
)
Critical values of the \(F\)-distribution at \(\alpha = 0.05\) (upper tail). Rows: denominator df \(k_{2}\). Columns: numerator df \(k_{1}\).
k2 (den. df) k1 = 1 k1 = 2 k1 = 3 k1 = 4 k1 = 5 k1 = 6 k1 = 7 k1 = 8 k1 = 10 k1 = 15 k1 = 20 k1 = 30
10 4.965 4.103 3.708 3.478 3.326 3.217 3.135 3.072 2.978 2.845 2.774 2.700
15 4.543 3.682 3.287 3.056 2.901 2.790 2.707 2.641 2.544 2.403 2.328 2.247
20 4.351 3.493 3.098 2.866 2.711 2.599 2.514 2.447 2.348 2.203 2.124 2.039
25 4.242 3.385 2.991 2.759 2.603 2.490 2.405 2.337 2.236 2.089 2.007 1.919
30 4.171 3.316 2.922 2.690 2.534 2.421 2.334 2.266 2.165 2.015 1.932 1.841
40 4.085 3.232 2.839 2.606 2.449 2.336 2.249 2.180 2.077 1.924 1.839 1.744
60 4.001 3.150 2.758 2.525 2.368 2.254 2.167 2.097 1.993 1.836 1.748 1.649
120 3.920 3.072 2.680 2.447 2.290 2.175 2.087 2.016 1.910 1.750 1.659 1.554
3.841 2.996 2.605 2.372 2.214 2.099 2.010 1.938 1.831 1.666 1.571 1.459
Code
f_tab_01 <- outer(den_df, num_df,
                  function(d, n) qf(0.99, df1 = n, df2 = d))
f_tab_01 <- as.data.frame(f_tab_01)
colnames(f_tab_01) <- paste0("k1 = ", num_df)
f_tab_01 <- cbind(`k2 (den. df)` = ifelse(is.infinite(den_df), "∞",
                                          as.character(den_df)),
                  f_tab_01)

knitr::kable(
  f_tab_01,
  digits  = 3,
  align   = c("l", rep("r", length(num_df))),
  caption = "Critical values of the $F$-distribution at $\\alpha = 0.01$ (upper tail). Rows: denominator df $k_{2}$. Columns: numerator df $k_{1}$."
)
Critical values of the \(F\)-distribution at \(\alpha = 0.01\) (upper tail). Rows: denominator df \(k_{2}\). Columns: numerator df \(k_{1}\).
k2 (den. df) k1 = 1 k1 = 2 k1 = 3 k1 = 4 k1 = 5 k1 = 6 k1 = 7 k1 = 8 k1 = 10 k1 = 15 k1 = 20 k1 = 30
10 10.044 7.559 6.552 5.994 5.636 5.386 5.200 5.057 4.849 4.558 4.405 4.247
15 8.683 6.359 5.417 4.893 4.556 4.318 4.142 4.004 3.805 3.522 3.372 3.214
20 8.096 5.849 4.938 4.431 4.103 3.871 3.699 3.564 3.368 3.088 2.938 2.778
25 7.770 5.568 4.675 4.177 3.855 3.627 3.457 3.324 3.129 2.850 2.699 2.538
30 7.562 5.390 4.510 4.018 3.699 3.473 3.304 3.173 2.979 2.700 2.549 2.386
40 7.314 5.179 4.313 3.828 3.514 3.291 3.124 2.993 2.801 2.522 2.369 2.203
60 7.077 4.977 4.126 3.649 3.339 3.119 2.953 2.823 2.632 2.352 2.198 2.028
120 6.851 4.787 3.949 3.480 3.174 2.956 2.792 2.663 2.472 2.192 2.035 1.860
6.635 4.605 3.782 3.319 3.017 2.802 2.639 2.511 2.321 2.039 1.878 1.696

The bottom row (\(k_{2} = \infty\)) is a useful sanity check: the \(F_{k_{1}, \infty}\) distribution coincides (after scaling) with \(\chi^{2}_{k_{1}}/k_{1}\), so its 5% critical value equals \(\chi^{2}_{k_{1}, 0.95}/k_{1}\). Compare, for instance, the \((k_{1} = 4, k_{2} = \infty)\) entry of the 5% \(F\) table with \(\chi^{2}_{4, 0.95}/4\) from the next section.

C.3 C.3 Critical values of the \(\chi^{2}\)-distribution

Code
df_chi    <- c(1:10, 15, 20, 30, 50, 100)
alpha_chi <- c(0.10, 0.05, 0.025, 0.01, 0.005)

chi_tab <- sapply(alpha_chi, function(a) qchisq(1 - a, df = df_chi))
chi_tab <- as.data.frame(chi_tab)
colnames(chi_tab) <- paste0("α = ", format(alpha_chi, scientific = FALSE))
chi_tab <- cbind(df = as.character(df_chi), chi_tab)

knitr::kable(
  chi_tab,
  digits  = 3,
  align   = c("l", rep("r", length(alpha_chi))),
  caption = "Upper-tail critical values of the $\\chi^{2}$-distribution: $c$ such that $\\Pr(\\chi^{2}_{df} > c) = \\alpha$."
)
Upper-tail critical values of the \(\chi^{2}\)-distribution: \(c\) such that \(\Pr(\chi^{2}_{df} > c) = \alpha\).
df α = 0.100 α = 0.050 α = 0.025 α = 0.010 α = 0.005
1 2.706 3.841 5.024 6.635 7.879
2 4.605 5.991 7.378 9.210 10.597
3 6.251 7.815 9.348 11.345 12.838
4 7.779 9.488 11.143 13.277 14.860
5 9.236 11.070 12.833 15.086 16.750
6 10.645 12.592 14.449 16.812 18.548
7 12.017 14.067 16.013 18.475 20.278
8 13.362 15.507 17.535 20.090 21.955
9 14.684 16.919 19.023 21.666 23.589
10 15.987 18.307 20.483 23.209 25.188
15 22.307 24.996 27.488 30.578 32.801
20 28.412 31.410 34.170 37.566 39.997
30 40.256 43.773 46.979 50.892 53.672
50 63.167 67.505 71.420 76.154 79.490
100 118.498 124.342 129.561 135.807 140.169

The \(\chi^{2}\) table is the natural reference for large-sample versions of the joint test (the Wald statistic is asymptotically \(\chi^{2}_{q}\) where \(q\) is the number of restrictions) and for the Breusch–Pagan test of §7.3, whose \(LM\) statistic is \(\chi^{2}_{k}\) under the null of homoskedasticity.

C.4 C.4 Durbin–Watson bounds

The Durbin–Watson statistic \(d = \sum_{t=2}^{n}(\hat u_{t} - \hat u_{t-1})^{2} / \sum_{t=1}^{n}\hat u_{t}^{2}\) does not have a single critical value: its exact null distribution depends on the design matrix \(\mathbf{X}\), not just on \(n\) and the number of regressors. Durbin and Watson (1951) sidestepped this by tabulating two bounds, \(d_{L}\) and \(d_{U}\), between which the true critical value must lie regardless of \(\mathbf{X}\). The bounds below are taken from Durbin, J. and Watson, G. S. (1951), “Testing for serial correlation in least squares regression. II,” Biometrika 38(1), 159–178, for \(\alpha = 0.05\) and \(k'\) regressors excluding the constant. A representative subset is reproduced; consult the original tables for values of \(n\) not listed.

Code
dw_05 <- data.frame(
  n      = c(15, 20, 25, 30, 40, 50, 75, 100, 150, 200),
  dL_k1  = c(1.08, 1.20, 1.29, 1.35, 1.44, 1.50, 1.60, 1.65, 1.72, 1.76),
  dU_k1  = c(1.36, 1.41, 1.45, 1.49, 1.54, 1.59, 1.65, 1.69, 1.75, 1.78),
  dL_k2  = c(0.95, 1.10, 1.21, 1.28, 1.39, 1.46, 1.57, 1.63, 1.71, 1.75),
  dU_k2  = c(1.54, 1.54, 1.55, 1.57, 1.60, 1.63, 1.68, 1.72, 1.76, 1.79),
  dL_k3  = c(0.82, 1.00, 1.12, 1.21, 1.34, 1.42, 1.54, 1.61, 1.69, 1.74),
  dU_k3  = c(1.75, 1.68, 1.66, 1.65, 1.66, 1.67, 1.71, 1.74, 1.77, 1.80),
  dL_k4  = c(0.69, 0.90, 1.04, 1.14, 1.29, 1.38, 1.51, 1.59, 1.68, 1.73),
  dU_k4  = c(1.97, 1.83, 1.77, 1.74, 1.72, 1.72, 1.74, 1.76, 1.79, 1.81),
  dL_k5  = c(0.56, 0.79, 0.95, 1.07, 1.23, 1.34, 1.49, 1.57, 1.67, 1.72),
  dU_k5  = c(2.21, 1.99, 1.89, 1.83, 1.79, 1.77, 1.77, 1.78, 1.80, 1.82)
)

colnames(dw_05) <- c(
  "n",
  "k'=1 dL", "k'=1 dU",
  "k'=2 dL", "k'=2 dU",
  "k'=3 dL", "k'=3 dU",
  "k'=4 dL", "k'=4 dU",
  "k'=5 dL", "k'=5 dU"
)

knitr::kable(
  dw_05,
  digits  = 2,
  align   = c("l", rep("r", 10)),
  caption = "Durbin–Watson 5% bounds $d_{L}$ and $d_{U}$ by sample size $n$ and number of regressors $k'$ excluding the constant. Source: Durbin & Watson (1951)."
)
Durbin–Watson 5% bounds \(d_{L}\) and \(d_{U}\) by sample size \(n\) and number of regressors \(k'\) excluding the constant. Source: Durbin & Watson (1951).
n k’=1 dL k’=1 dU k’=2 dL k’=2 dU k’=3 dL k’=3 dU k’=4 dL k’=4 dU k’=5 dL k’=5 dU
15 1.08 1.36 0.95 1.54 0.82 1.75 0.69 1.97 0.56 2.21
20 1.20 1.41 1.10 1.54 1.00 1.68 0.90 1.83 0.79 1.99
25 1.29 1.45 1.21 1.55 1.12 1.66 1.04 1.77 0.95 1.89
30 1.35 1.49 1.28 1.57 1.21 1.65 1.14 1.74 1.07 1.83
40 1.44 1.54 1.39 1.60 1.34 1.66 1.29 1.72 1.23 1.79
50 1.50 1.59 1.46 1.63 1.42 1.67 1.38 1.72 1.34 1.77
75 1.60 1.65 1.57 1.68 1.54 1.71 1.51 1.74 1.49 1.77
100 1.65 1.69 1.63 1.72 1.61 1.74 1.59 1.76 1.57 1.78
150 1.72 1.75 1.71 1.76 1.69 1.77 1.68 1.79 1.67 1.80
200 1.76 1.78 1.75 1.79 1.74 1.80 1.73 1.81 1.72 1.82
NoteThe four-region decision rule

Given an observed Durbin–Watson statistic \(d\), the test for positive first-order autocorrelation at level \(\alpha\) partitions the unit-line into four regions:

  • \(d < d_{L}\): reject \(H_{0}\) in favour of positive autocorrelation.
  • \(d_{L} \leq d \leq d_{U}\): inconclusive — the test cannot decide.
  • \(d_{U} < d < 4 - d_{U}\): do not reject \(H_{0}\) of no autocorrelation.
  • \(4 - d_{U} \leq d \leq 4 - d_{L}\): inconclusive (negative side).
  • \(d > 4 - d_{L}\): reject \(H_{0}\) in favour of negative autocorrelation.

Inconclusive regions are the price paid for the design-free bounds: when \(d\) falls into one of them, switch to a test that does not depend on the design matrix (e.g. the Breusch–Godfrey LM test of §8.3), which is now standard in applied work.