Answer
t tests vs the F test in regression: what is the difference?
The short answer
Each t test in a regression table asks about one coefficient, given all the other predictors in the model. The overall F test asks whether all the slopes together are zero. With a single predictor these are the same question, and F is exactly t squared with the same p value. With several predictors they answer different questions and can disagree, most often when the predictors are strongly correlated: the F test can be highly significant while no individual t test is.
The short answer
A fitted regression usually comes with two kinds of test. Each row of the coefficient table has a t test of the hypothesis that this one coefficient is zero while every other predictor stays in the model. Below the table sits one F test of the hypothesis that all the slopes are zero at once, comparing your model with a model that has only an intercept. The intercept is not part of the overall F test; it gets its own t test, which is rarely of interest.
Both tests come from the same fitted model and the same residual variance, so they are not rival methods. They are answers to different questions, and the questions only coincide when the model has a single slope.
With one predictor, F is t squared
In simple regression there is only one slope, so "is this slope zero?" and "are all the slopes zero?" are the same hypothesis. The two statistics then agree exactly: the overall F equals the slope's t squared, and the p values are identical. This is not a coincidence of the data. If t has a t distribution with ν degrees of freedom, t² has an F distribution with 1 and ν degrees of freedom, so squaring the statistic simply moves you to the matching reference distribution.
The one thing lost in squaring is the sign. The t test tells you the direction of the slope and can be run one-sided; the F test is always two-sided. The same identity explains why a two-group t test and a two-group one-way ANOVA agree, which is the focus of t test vs ANOVA with two groups. This page is about the regression setting, where the interesting part is what happens once there is more than one predictor.
With several predictors, they ask different questions
The general rule is that every t test in the table is itself an F test in disguise: the partial F test that compares the full model with the same model minus that one predictor. That partial F equals the coefficient's t squared. What differs between the tests is not the statistic but the pair of models being compared:
- **Coefficient t test. Full model versus full model without this predictor. It asks what the predictor adds beyond** the others.
- **Overall F test. Full model versus intercept only. It asks whether the predictors as a group** explain anything.
- **Partial F test for a set of terms.** Full model versus full model without that set. This is what you need for a categorical predictor with three or more levels, which enters as several dummy variables: no single t test covers the whole factor.
Because the questions differ, so can the answers. The classic case is multicollinearity. When two predictors carry nearly the same information, the model can tell that together they matter, but it cannot tell which one deserves the credit. Each one's unique contribution, given the other, is tiny and very uncertain, so the standard errors balloon and both t tests are non-significant while the overall F is highly significant. The variance inflation factor (VIF) measures this: the variance of a coefficient is multiplied by the VIF, so its standard error grows by the square root of the VIF.
The reverse can also happen. If a model has one useful predictor and many useless ones, the useful predictor's t test can be significant while the overall F is not, because the useless terms dilute the joint test across many degrees of freedom. This is the same logic as an omnibus ANOVA and its pairwise follow-ups disagreeing; see ANOVA significant but no pairwise difference.
One more trap in R: anova() on a single model gives sequential (Type I) sums of squares. Its first row tests the first predictor ignoring the ones after it, so it does not match that predictor's t test unless the predictors are uncorrelated. To get the partial F tests that match the coefficient table, compare nested models with anova(reduced, full) or use drop1(fit, test = "F").
See it in R and Python
The code fits a simple regression and checks that F = t². It then builds two predictors that are almost copies of each other, compares the joint and separate tests, and confirms that a t test equals a partial F test while the sequential anova() row does not.
R
set.seed(16947)
n <- 40
# 1. Simple regression: one slope, so the overall F equals t squared
x <- rnorm(n)
y <- 2 + 0.5 * x + rnorm(n)
fit1 <- lm(y ~ x)
ct <- summary(fit1)$coefficients["x", ]
fs <- summary(fit1)$fstatistic
round(c(b = ct[["Estimate"]], t = ct[["t value"]], t_squared = ct[["t value"]]^2,
F = fs[["value"]], df1 = fs[["numdf"]], df2 = fs[["dendf"]]), 3)
signif(c(p_t = ct[["Pr(>|t|)"]],
p_F = pf(fs[["value"]], fs[["numdf"]], fs[["dendf"]], lower.tail = FALSE)), 4)
# 2. Two nearly identical predictors: the joint F and the separate t tests disagree
x1 <- rnorm(n)
x2 <- x1 + rnorm(n, sd = 0.1)
y2 <- 1 + 0.4 * x1 + 0.4 * x2 + rnorm(n)
fit2 <- lm(y2 ~ x1 + x2)
round(c(r_x1_x2 = cor(x1, x2), vif = 1 / (1 - cor(x1, x2)^2)), 3)
round(summary(fit2)$coefficients, 3)
fs2 <- summary(fit2)$fstatistic
round(c(F = fs2[["value"]], df1 = fs2[["numdf"]], df2 = fs2[["dendf"]],
R2 = summary(fit2)$r.squared), 3)
signif(pf(fs2[["value"]], fs2[["numdf"]], fs2[["dendf"]], lower.tail = FALSE), 4)
# 3. Each t test is a partial F test: drop one predictor and compare
drop_x2 <- anova(lm(y2 ~ x1), fit2)
round(c(partial_F_x2 = drop_x2$F[2],
t_x2_squared = summary(fit2)$coefficients["x2", "t value"]^2), 4)
# 4. The sequential anova() table is a different question for x1
round(c(seq_F_x1 = anova(fit2)$`F value`[1],
t_x1_squared = summary(fit2)$coefficients["x1", "t value"]^2), 3)Python
import numpy as np
from scipy import stats
rng = np.random.default_rng(16947)
n = 40
def ols(y, *xs):
"""Least squares with an intercept: coefficients, SEs, t, p, RSS, residual df."""
X = np.column_stack([np.ones(len(y)), *xs])
b, *_ = np.linalg.lstsq(X, y, rcond=None)
rss = np.sum((y - X @ b) ** 2)
df = len(y) - X.shape[1]
se = np.sqrt(rss / df * np.diag(np.linalg.inv(X.T @ X)))
t = b / se
return b, se, t, 2 * stats.t.sf(np.abs(t), df), rss, df
def overall_f(y, rss, df):
tss = np.sum((y - y.mean()) ** 2)
k = len(y) - 1 - df
F = ((tss - rss) / k) / (rss / df)
return F, k, df, stats.f.sf(F, k, df), 1 - rss / tss
# 1. Simple regression: one slope, so the overall F equals t squared
x = rng.normal(size=n)
y = 2 + 0.5 * x + rng.normal(size=n)
b, se, t, p, rss, df = ols(y, x)
F, k, df2, pF, _ = overall_f(y, rss, df)
print("b", round(b[1], 3), "t", round(t[1], 3), "t^2", round(t[1] ** 2, 3), "F", round(F, 3))
print("p_t", round(p[1], 4), "p_F", round(pF, 4))
# 2. Two nearly identical predictors: the joint F and the separate t tests disagree
x1 = rng.normal(size=n)
x2 = x1 + rng.normal(scale=0.1, size=n)
y2 = 1 + 0.4 * x1 + 0.4 * x2 + rng.normal(size=n)
r = np.corrcoef(x1, x2)[0, 1]
print("r", round(r, 3), "vif", round(1 / (1 - r ** 2), 3))
b, se, t, p, rss_full, df_full = ols(y2, x1, x2)
print(np.round(np.column_stack([b, se, t, p]), 3))
F, k, df2, pF, r2 = overall_f(y2, rss_full, df_full)
print("F", round(F, 3), "df", k, df2, "R2", round(r2, 3), "p", f"{pF:.4g}")
# 3. Each t test is a partial F test: drop one predictor and compare
*_, rss_red, df_red = ols(y2, x1)
partial_F = ((rss_red - rss_full) / (df_red - df_full)) / (rss_full / df_full)
print("partial F x2", round(partial_F, 4), "t_x2^2", round(t[2] ** 2, 4))
# 4. The sequential (x1 first) F is a different question for x1
tss = np.sum((y2 - y2.mean()) ** 2)
seq_F = (tss - rss_red) / (rss_full / df_full)
print("sequential F x1", round(seq_F, 3), "t_x1^2", round(t[1] ** 2, 3))The figures below come from one seeded run of the R code. Python's random numbers differ from R's, so its estimates differ slightly (in its sample the simple-regression slope happens to reach significance), but the identities hold exactly and the collinear model shows the same pattern: a significant overall F with no significant coefficient.
- Simple regression. The slope is 0.246 with t(38) = 1.582, and t² = 2.501. The overall F(1, 38) is also 2.501, and both tests give p = .122. Same question, same answer.
- Two collinear predictors. The predictors correlate at r = .996, giving a VIF of 118.1, so each standard error is roughly 11 times larger than it would be with uncorrelated predictors. The coefficients are 0.809 (SE = 1.692, t = 0.478, p = .635) and 0.156 (SE = 1.682, t = 0.092, p = .927): neither is anywhere near significant.
- The joint test. Yet the overall test gives F(2, 37) = 19.193, p = 1.914 × 10⁻⁶, with R² = .509. Together the predictors explain about half the variance; separately, neither adds anything once the other is in the model.
- A t test is a partial F test. Dropping the second predictor and comparing the two models gives a partial F of 0.0085, exactly its t² of 0.0085.
- Sequential anova() is different. The first row of
anova(fit2)gives F = 38.378 for the first predictor, because it tests that predictor on its own, ignoring the second. Its t² from the coefficient table is only 0.228.
The practical reading: a significant overall F with no significant coefficients does not mean the results contradict each other. It means the predictors matter as a group but overlap too much to separate. Report the joint test, and if the individual effects are the point of the study, consider combining the overlapping predictors or collecting data where they vary more independently. For line-by-line help with the rest of the output, see How to interpret regression output in R, and for how the ANOVA F works more generally, see How to interpret the F statistic in ANOVA. More plain-language guides are on the DASS blog.
How to report a multiple regression in APA style (7th edition)
Report the overall model test with R², then each coefficient with its t test. With the collinear example above:
"The two predictors together explained a significant share of the variance in the outcome, R² = .51, F(2, 37) = 19.19, p < .001. Neither predictor was significant when controlling for the other: b = 0.81, SE = 1.69, t(37) = 0.48, p = .635, and b = 0.16, SE = 1.68, t(37) = 0.09, p = .927. The predictors were highly correlated (r = .996, VIF = 118.1)."
For a simple regression, report one test, not both, since they are identical: "b = 0.25, t(38) = 1.58, p = .122" or "F(1, 38) = 2.50, p = .122". With several predictors, a table with b, SE, t, p and 95% CIs for each coefficient is usually clearer than running text, with the overall F and R² in a note below it. Report p values below .001 as p < .001.
Related tools and guides
- APA 7 formatter for regression
- t-test power and sample size calculator
- APA 7 formatter for t tests
- t test vs ANOVA with two groups: are the assumptions really different?
- How to interpret regression output in R
- How to interpret the F statistic in ANOVA
- ANOVA significant but no pairwise difference
- Which statistical test should I use?
More answered questions
- Significant ANOVA but no significant pairwise comparisons: how can that happen?
- Why does the Welch t statistic only approximately follow a t distribution?
- How to interpret the F statistic and p value in a one-way ANOVA
Working with your own data?
General answers only go so far. Send us your situation and we'll reply by email within two business days.
Ask your questionWritten by AskStats with AI assistance. This is general information, not advice for your specific data or study. When the results matter, check your approach with a qualified statistician.