You have three variables and a hypothesis: A affects B, B affects C, and A also affects C directly. You could test that with two separate multiple regressions, but then neither regression knows about the other, you get no indirect effect with a confidence interval, and you cannot say whether your model as a whole holds up. Path analysis solves exactly that: it estimates every equation simultaneously and gives you global fit.
This is the practical version: what it is, how it differs from SEM, when you should not use it, how to run it in R with lavaan, and how to report it so it does not come back.
What path analysis actually is
A path analysis is a system of regression equations estimated simultaneously on observed variables. Every arrow in the diagram is a regression coefficient; what changes compared with running the regressions one at a time is that they all come from the same model and the same covariance matrix.
That buys you three things separate regressions cannot give you:
- Variables that are both predictor and outcome. A multiple regression has exactly one outcome. Here B can receive an arrow from A and send one to C inside the same model.
- Indirect effects with their own standard error. The product of two coefficients (a × b) is estimated as a parameter, so it gets its own confidence interval.
- Global fit. If your model imposes restrictions — that is, if you claim two variables are not connected — those restrictions can be tested against the data.
Path analysis, multiple regression and SEM
These three get conflated constantly, and the confusion is expensive at review. The real boundary is this:
| Multiple regression | Path analysis | Full SEM | |
|---|---|---|---|
| Outcome variables | One | Several | Several |
| Latent variables | No | No | Yes |
| Corrects measurement error | No | No | Yes |
| Fit indices | No | Yes, if df > 0 | Yes |
| Typical sample size | Modest | Modest | Large |
The third row is the one that decides. In a path analysis you enter your scale total score as if it were measured without error, and it is not: if your rumination measure has a reliability of .80, 20% of its variance is noise, and that noise attenuates the coefficient. Path analysis ignores it; SEM models it through the measurement part and returns the disattenuated estimate.
In plain terms: if your scales are short or unreliable, your paths will come out smaller than they are. It is a known bias, in a known direction, and a competent reviewer will say so. The answer is not to hide it — report the reliability of every measure and acknowledge attenuation in the discussion. If you genuinely need the correction, what you want is a structural equation model.
When to use it, and when not to
It fits well when you have a causal chain of three or four variables, measured with reasonably reliable instruments (α or ω above .80), a modest sample (150-300), and your interest is the pattern of effects rather than the exact value of each coefficient.
It does not fit in three specific situations:
- Your constructs are clearly latent and your scales are weak. Below .70 reliability, the coefficients you publish will be biased downwards, and the conclusion can flip when someone replicates with SEM.
- Your data are cross-sectional and your hypothesis is causal. That is a design problem, not a path-analysis problem — but path analysis disguises it, because arrows look like causes. A path model on a single time point describes covariation, and that is how it must be written.
- You have one outcome and no mediation. Then it is a multiple regression with extra machinery. Use the regression and save yourself the explanation.
The saturated model. If you draw every possible arrow between every variable, your model has 0 degrees of freedom: it reproduces the covariance matrix perfectly by construction. CFI = 1, RMSEA = 0 and χ² = 0 — and that is not good fit, it is the absence of any fit to evaluate. Reporting "CFI = 1.00, excellent fit" for a saturated model is one of the fastest ways to give a manuscript away.
Running it in R with lavaan
lavaan is free, it is the de facto standard in psychology, and its syntax reads almost like the diagram. The ~ operator means "is regressed on"; := defines a new parameter from existing ones.
library(lavaan)
# The model in the figure: stress -> rumination -> insomnia
model <- '
# path a
rumination ~ a*stress
# paths b and c-prime
insomnia ~ b*rumination + cp*stress
# derived parameters
indirect := a*b
total := cp + (a*b)
'
# Bootstrap the indirect effect: its sampling distribution is NOT
# normal, so the Sobel standard error is too conservative.
fit <- sem(model, data = d,
se = "bootstrap", bootstrap = 5000,
missing = "fiml")
summary(fit, standardized = TRUE, fit.measures = TRUE,
rsquare = TRUE, ci = TRUE)
Three choices in those lines deserve an explanation, because they are what you will be asked about:
se = "bootstrap". The indirect effect is a product of two coefficients and its sampling distribution is skewed. The Sobel test assumes normality and loses power; a percentile bootstrap interval with 5,000 resamples is what journals expect today.missing = "fiml". Full information maximum likelihood uses every case with at least one observation instead of deleting whole rows. If you prefer to impute, see the guide to multiple imputation.standardized = TRUE. TheStd.allcolumn holds the standardized βs, which are what you report when variables are on different scales.
Other software
Mplus does the same with MODEL INDIRECT and is the standard when you have categorical indicators or nested data. jamovi and JASP ship SEM modules with a graphical interface that run lavaan underneath: same estimation, no code. In SPSS, Hayes' PROCESS macro handles mediation and moderation very well, but it is not general path analysis: it will not estimate several outcomes at once and gives you no fit indices. If your model fits a PROCESS template, use it; if it does not, you need lavaan.
What to look at in the output
With degrees of freedom available — that is, with at least one path you deliberately left out — these are the fit indices to report and the conventional cutoffs:
| Index | Acceptable | Watch out for |
|---|---|---|
| χ² (df, p) | p > .05 | Almost always significant with large N |
| CFI / TLI | ≥ .95 | Uninformative with few df |
| RMSEA [90% CI] | ≤ .06 | Inflated in small models with low N |
| SRMR | ≤ .08 | The most stable one in path models |
Hu and Bentler's (1999) cutoffs get cited as if they were law. They are not: they came from simulations with measurement models, not with four-variable path models. Report them, but do not turn them into a pass/fail, and do not move paths until CFI crosses .95 — that is modification-index mining and it shows.
APA 7 reporting template
A path analysis results paragraph needs, in this order: software and estimator, how missing data were handled, global fit, standardized coefficients with intervals, the indirect effect with its bootstrap interval, and explained variance.
"The path model was estimated in R 4.4.1 using lavaan 0.6-19 with maximum likelihood and bootstrapped standard errors (5,000 resamples); missing data were handled with FIML. The model fitted the data adequately, χ²(1) = 1.42, p = .233, CFI = .99, RMSEA = .04 [.00, .16], SRMR = .02. Stress predicted rumination (β = .38, 95% CI [.26, .49], p < .001), and rumination predicted insomnia (β = .31, 95% CI [.19, .43], p < .001). The direct effect of stress on insomnia remained significant (β = .21, 95% CI [.09, .33], p = .001), indicating partial mediation. The indirect effect was significant (β = .12, 95% bootstrap CI [.06, .19]). The model accounted for 24% of the variance in insomnia."
Those numbers are a formatting example, not a result. If what you need is the sentence with your figures and the italics where APA wants them, the APA 7 results formatter gives it to you ready to paste.
Five things a reviewer will flag
- Presenting a saturated model as "perfect fit". With 0 df there is no fit to evaluate. Say so, and justify why you imposed no restrictions.
- Causal language with cross-sectional data. Change the verb, and add an explicit limitation.
- Using the Sobel test in 2026. Bootstrap with a percentile or bias-corrected interval, and state the number of resamples.
- Not reporting reliability. In a path analysis this is essential information: without it nobody can judge how much attenuation there is.
- Respecifying with modification indices and calling it confirmatory. If you moved paths after looking at the data, the result is exploratory and must be labeled as such, or replicated in an independent sample.
Before you submit
A well-specified path model gets rejected for things that have nothing to do with the model: a reliability that is missing, a sample size with no justification, a discussion that promises causality the design cannot support. If the manuscript is already written, it is worth putting it through a critical read before the editor does.