Longitudinal and Growth Models · Structural Equation Modeling
Growth-Curve Modeling
A growth curve model describes how people change over time.
A latent growth curve model takes the same people's scores on three or more occasions and estimates their average trajectory and how much people differ in where they start and how fast they change.
How do first-year students' depressive symptoms change over their first nine months at university, and do students differ in how they change? Two hundred fifty first-year students completed the PHQ-9 depression questionnaire on arrival and every three months after.
- Tests
- The average trajectory over time, and individual differences in starting level and rate of change
- Observations
- Related
- Parametric
- Yes
- Headline Statistic
- \alpha_S
- Effect Size
- Change in Baseline SDs (d)
- Groups
- 1
The Basics
When to Use It
Use it when the same people are measured on one continuous outcome at three or more occasions, and you want to describe the shape of change: where people start on average, how fast they change, and how much they differ in both. Each person gets their own growth trajectory, and the model estimates the average trajectory and the spread of trajectories around it, and can bring in predictors of who changes faster. For example:
- How do first-year students' depressive symptoms change over their first nine months at university, and do students differ in how they change?
- Does children's vocabulary grow at the same rate from age 2 to 5, or do some children pull ahead?
- After starting cognitive behavioral therapy, how quickly do clients' weekly anxiety scores fall, and does homework completion predict who improves fastest?
The model. Each person's score at an occasion is their own starting level, plus their own slope times that occasion's time code, plus noise for that occasion:
Nobody's true starting level \eta_{Ii} or slope \eta_{Si} is observed; the model infers them from all of a person's scores, which is why they're latent variables. The numbers multiplying them, 1 for the starting level and the time code \lambda_t for the slope, are their loadings, and the design fixes them rather than the data. The noise \varepsilon_{ti} has its own variance at each occasion, the residual variance. Predictors that stay fixed, like moving away from home, predict the starting level and slope; ones measured at every wave, like weekly stress, can enter wave by wave as time-varying covariates.
Vocabulary You Need
Definition Growth Trajectory
The course a person's scores take across repeated measurements, described by a simple curve fitted through them: most often a straight line, with a level (where the line is at a chosen time point) and a slope (how much it rises or falls per unit of time). Each person has their own trajectory; averaging them gives the mean trajectory, and how much they differ gives the individual differences in change. A person's observed scores bounce around their trajectory from occasion to occasion, and a growth model treats that bounce as noise, not change. Trajectories can also curve, level off or change direction, which takes a curved shape such as a quadratic, or a model that lets the data set the shape (freed time loadings, in SEM terms). Glossary →
Definition Growth Factor (\eta)
In a latent growth curve model, the pieces of each person's trajectory are latent variables, called growth factors: the intercept factor is the person's level at time 0 and the slope factor is their rate of change. Their loadings are fixed rather than estimated: every score loads 1 on the intercept, and each score loads on the slope by its time code. A growth factor's mean describes the average trajectory (the average starting level, the average change per unit of time); its variance describes how much people differ from that average; and the intercept and slope factors' covariance says whether people who start higher tend to change faster or slower. In the equivalent multilevel model, the means are the fixed effects and the variances and covariance are the random effects. Glossary →
Definition Time Coding
The values given to each measurement occasion in a growth model, such as 0, 1, 2, 3 for four equally spaced waves. They fix two things. The slope is the change per one unit of the codes, so 0, 1, 2, 3 for measurements three months apart makes it the change per three months, and 0, 3, 6, 9 would make it the change per month. The intercept is the predicted level where time equals 0, so putting 0 at the first wave makes it the starting level, and putting 0 at the last wave (−3, −2, −1, 0) makes it the level at the end. Recoding time doesn't change how well the model fits, but it changes the intercept's mean and variance, its correlation with the slope, and the effects of any predictors of the intercept. Unequally spaced occasions get codes in proportion to the time that passed. Glossary →
Assumptions
1. Linear Relationship The relationship between your variables follows a straight line, not a curve.
- What It Means
- The average trajectory, and each person's own, follows a straight line over the time codes: the expected change from one wave to the next is the same size at every step. A drop that levels off, or a dip followed by recovery, breaks it.
- Applies To
- Relationship
- How to Check
- Plot the observed mean at each wave, and a sample of people's own trajectories, against the time codes. Then compare the linear model with a model that frees the later time loadings (a latent-basis model) or adds a quadratic growth factor, using a likelihood-ratio test, and look at how far the model's predicted means sit from the observed wave means.
- How Much It Matters
- A lot. If the true trajectories bend, such as symptoms dropping in the first term and then leveling off, a straight line misplaces the start and end, blurs the slope's meaning, and pushes the bend into the variances and residuals. Beating a no-change model (χ²(8) = 51.21 against the line's χ²(5) = 6.87) shows the scores change, not that they change in a straight line; for that, compare curved shapes. Here the wave means drop less between months 6 and 9 (0.11 points) than before (about 0.5), but neither a quadratic with its variance fixed at 0 (Δχ²(1) = 2.21, p = .14) nor freed loadings (Δχ²(2) = 2.65, p = .27) fits significantly better, and the line's predicted means sit within 0.17 points of the observed ones. With four waves these tests have little power, so report that the leveling off was checked, not that the line is proven.
If It's Violated
- Alternative Test Add a third growth factor with loadings 0, 1, 4, 9 (the squared time codes) for a curve that bends once. It needs at least four waves, and with exactly four its variance is often hard to estimate; fixing the quadratic variance at 0 helps.
- Alternative Test Fix the first two slope loadings at 0 and 1 and estimate the rest (a latent basis model), so the data say what share of the total change happens between each pair of waves.
- Alternative Test Use two slope factors, one before and one after a known turning point such as the end of the first term.
2. Correctly Specified Model Your model includes the paths and correlations that really matter.
- What It Means
- Beyond the shape of change, the model's other restrictions hold: the outcome measures the same thing on the same scale at every wave, each wave's leftover noise is unrelated to the other waves', the growth factors capture everything a person's scores share across waves, and predictors relate to the growth factors as specified. Every estimate and every fit index is conditional on that pattern.
- Applies To
- Covariance structure
- How to Check
- Look at the residual covariances between waves that the model leaves unexplained, especially between adjacent waves, and at the modification indices for residual covariances or direct paths from a predictor to one wave. Compare the model with plausible alternatives specified in advance, such as correlated residuals for adjacent waves. Fit statistics can show a model is wrong; they can't show it's right.
- How Much It Matters
- Some. Beyond the shape of change, the model assumes each wave's leftover noise is unrelated to the others' and that the predictors relate to the growth factors as specified. Leftover noise that carries over from one wave to the next, or a predictor that is also related to particular waves directly, shows up as misfit and bends the variance estimates. With only 5 degrees of freedom there's little room to detect it.
If It's Violated
- Design Change Decide before looking which alternatives are plausible (equal residual variances, correlated neighboring residuals, a curve) and compare them with χ² difference tests.
- Proceed with Caveat If you add a residual correlation because the data suggested it, say so and report both models.
3. Independent Observations The people (or other units) in your study don't influence each other.
- What It Means
- Each person's data comes from a separate, unconnected source, so knowing one person's scores tells you nothing about anyone else's. In designs that measure people more than once, their own scores are meant to be related; it's different people who must be independent. Methods built for clustered data, such as multilevel models and GEE, also allow members of the same group to be related, as long as the analysis names the grouping; then it's the groups that must be independent.
- Applies To
- Observations
- How to Check
- By design, not by a test. Did each person contribute their own data, with no clusters such as roommates, couples, therapy groups or classrooms whose members influence each other? If there are clusters, does the analysis model every one of them?
- How Much It Matters
- A lot, for the standard errors. Each student's own four scores are supposed to be related, and the growth factors model that. Different students must not be: students sharing a residence hall or a class could influence each other's mood, making standard errors too small.
If It's Violated
- Alternative Test Multilevel Growth-Curve Modeling. Add a level for the cluster, such as residence halls, so students in the same hall can share part of their trajectory.
-
Correction
Keep the model and correct its standard errors and χ² for clustering (for example
cluster =in lavaan).
4. Multivariate Normality The variables are roughly bell-shaped together (within each group, when there are groups), or the sample is big enough that it matters less.
- What It Means
- The variables jointly follow a multivariate normal distribution: each is roughly normal, and every weighted combination of them is too, so the scatterplot of any two is an oval cloud. When the design has groups, as in MANOVA, it applies within each group; in a multivariate regression, to the outcomes' residuals; in factor analysis and SEM, it applies to the observed variables that maximum likelihood is fitted to (for outcomes, after allowing for any predictors the model takes as given). P-values and standard errors rely on it; estimates are usually less affected, and robust standard errors or a scaled test statistic can take its place.
- Applies To
- Joint distribution
- How to Check
- Look at a histogram of each variable (or each outcome's residuals, in a model with predictors) and a scatterplot of each pair, within each group if there are groups, for strong skew, curves or stray points. Multivariate outliers show up as large squared Mahalanobis distances from the means (each group's own, if there are groups). Don't rely on a normality test as a gatekeeper: with small samples it misses real problems, and with large ones it flags trivial ones.
- How Much It Matters
- Some. Maximum likelihood estimates stay about right when scores are skewed, but χ² tends to run too large and standard errors too small. PHQ-9 scores can't go below 0, and 37 of our 1,000 scores sit at 0, a mild floor that barely matters at these averages; a sample of mostly symptom-free students would pile up there.
If It's Violated
-
Robust Estimation
Use robust ML (
estimator = "MLR"in lavaan and Mplus), which corrects the standard errors and rescales χ² and the fit indexes for non-normality. - Robust Estimation Bootstrap the standard errors and confidence intervals of the growth parameters.
5. Missing at Random Your missing scores aren't missing because of what they would have been.
- What It Means
- Methods that use every available score, such as full-information maximum likelihood (FIML) and multiple imputation, can be trusted when whether a score is missing depends only on things that were measured and are included in the analysis, such as earlier scores or a recorded background variable, and not on the missing score itself. Then, if the model is right, their estimates are close to right in large samples. Data missing completely at random, with no pattern at all, meet the assumption too. If people skip a measurement because of the very value they'd have reported, such as students missing a mood survey in the weeks they're most depressed, no method that ignores why they're missing can fully correct for it.
- Applies To
- Observations
- How to Check
- It can't be tested from the data, because the scores that would show it are the missing ones. Compare people with and without missing waves on their earlier scores and background variables, include variables that predict missingness in the model, and record why people dropped out. When the risk is serious, check how much the results change under different assumptions about the missing scores (a sensitivity analysis).
- How Much It Matters
- Depends on why scores are missing. Our file is complete, but real studies lose students across a year. With full-information maximum likelihood, students with some waves missing still count, and in large samples the estimates are close to right if dropping out depends only on things measured and included in the model, such as earlier symptom scores. If students skip a survey because of how depressed they are that month, a score nobody recorded, the decline will look better than it is.
If It's Violated
-
Robust Estimation
Fit the model to every available score (
missing = "fiml"in lavaan; the default in Mplus) instead of dropping students with a missing wave. - Robust Estimation Impute the missing scores several times from the observed data, fit the model to each, and pool the results.
- Proceed with Caveat Say how many people missed each wave, compare them with completers on their earlier scores, and check how much the conclusions depend on the missing-at-random assumption.
Limitations
This Is Not Your Test If…
- You only want to compare the averages at a few time points One-Way Repeated-Measures ANOVA →
- You measured the same people only twice Paired-Samples t-Test →
- Each person was measured at different times, or people sit in groups Multilevel Growth-Curve Modeling →
- Your outcome is yes/no or a count Generalized and Multilevel Regression →
- You're asking how two variables affect each other, not how one changes Path Analysis →
What It Doesn't Tell You
- Why. Nothing here says what eased students' symptoms. Settling in, the end of exams, or simply the calendar could all produce the same decline, and there's no comparison group of non-students.
- Whether moving away causes anything. Students who moved away started higher and improved faster, but they weren't assigned to move. They may differ in many other ways, such as distance from family or the kind of university they chose.
- Whether it matters. A decline of 1.2 PHQ-9 points over nine months is clearly different from zero but small, and it doesn't mean the average student feels noticeably better.
- What happens between or after the waves. Four measurements three months apart can't show a dip around exams or what happens in the second year. The straight line is a summary of these four occasions, not a promise about the months in between or beyond.
- What happens when data are missing. Our file is complete. Real studies lose people, and full-information maximum likelihood only corrects for that if dropping out depends on things measured and included in the model, such as earlier scores (Curran et al., 2010); if students stop answering because of how they feel at the wave they skip, not how they felt earlier, no estimation method fully repairs the trajectory.
Common Mistakes
-
Don'tInterpret the intercept without saying where time 0 is.
InsteadCode time so that 0 falls on a meaningful occasion, such as the first wave, and say so when reporting.
-
Don'tTreat the intercept–slope correlation as a fixed fact about people.
InsteadReport it with the time coding. Moving time 0 to another wave changes it, sometimes even its sign.
-
Don'tDrop everyone with a missed wave before fitting the model.
InsteadFit it to all available scores with full-information maximum likelihood, and report the attrition.
-
Don'tConclude that people don't differ in change because the slope variance's z test isn't significant.
InsteadCompare models with and without it, reading the χ² difference against a mix of χ² distributions (see Statistical Significance).
-
Don'tReport the mean slope in time-code units without saying what one unit of time is.
InsteadState the time unit, as in "0.39 points per 3 months", and the total change over the study.
-
Don'tReport RMSEA without its confidence interval.
InsteadGive the 90% interval too. With a few hundred people it's often wide enough to span “close” and “mediocre”.
-
Don'tRead a bigger χ² as a stronger effect.
InsteadReport an effect size suited to the design, such as Cramér's V, an odds ratio or a model's coefficients. χ² grows with sample size even when the effect doesn't.
-
Don'tRead a p-value as the chance that the null hypothesis is true.
InsteadRead it as: if the null were true, how often data at least this extreme would turn up.
Result Decoder
Significance and Effect Size Guidelines
Benchmarks Significance (p Value)
-
p < .001
Very strong evidence against the null hypothesis.
-
.001 ≤ p < .01
Strong evidence against the null hypothesis.
-
.01 ≤ p < .05
Statistically significant at α = .05. Moderate evidence against the null hypothesis.
-
.05 ≤ p < .10
Not significant. Weak evidence; sometimes called a “trend.” Treat it as inconclusive.
-
p ≥ .10
Not significant. Little evidence against the null, which is not the same as evidence of no effect.
These evidence labels are one common convention for describing p in graded language rather than as significant or not; the boundaries are rough guides, not rules, and other authors draw them differently. Muff et al. (2022) argue for this kind of language of evidence over a single cutoff. α is chosen before the analysis, and p never says how big or important an effect is.
Benchmarks Effect Size (Change in Baseline SDs (d))
-
|d| < 0.2
Below Small
Smaller than the conventional small benchmark. Whether an effect this size matters depends on the setting.
-
0.2 ≤ |d| < 0.5
Small
A relatively modest standardized difference
-
0.5 ≤ |d| < 0.8
Medium
A moderate standardized difference
-
|d| ≥ 0.8
Large
A relatively substantial standardized difference
Cohen's (1988) benchmarks are conventions. Here d is the whole study's change divided by the SD of scores at the start (Feingold, 2009), so it grows with the length of the study: the same mean slope over twice as long gives twice the d. Say how long the study was.
How It's Reported
Equation Form
αS = −0.39 points per 3 months, 95% CI [−0.53, −0.24], d = −0.26, z = −5.25, p < .001; ψSS = 0.52, rIS = −.35; χ²(5) = 6.87, p = .230, CFI = .997, RMSEA = .039, 90% CI [.000, .102], SRMR = .033
Table 1. Linear Growth Model for PHQ-9 Scores
| Estimate | SE | z | p | |
|---|---|---|---|---|
| Means (Average Trajectory) | ||||
| Intercept, \alpha_I | 8.983 | 0.260 | 34.54 | < .001 |
| Slope, \alpha_S | −0.386 | 0.073 | −5.25 | < .001 |
| Variances and Covariance (Individual Differences) | ||||
| Intercept, \psi_{II} | 13.747 | 1.560 | 8.81 | < .001 |
| Slope, \psi_{SS} | 0.519 | 0.164 | 3.17 | .002 |
| Intercept with slope, \psi_{IS} | −0.930 | 0.378 | −2.46 | .014 |
| Residual Variances | ||||
| Month 0, \theta_1 | 4.646 | 0.816 | ||
| Month 3, \theta_2 | 4.392 | 0.536 | ||
| Month 6, \theta_3 | 4.473 | 0.534 | ||
| Month 9, \theta_4 | 3.631 | 0.732 |
Note. N = 250. Maximum likelihood. Time coded 0, 1, 2, 3 for months 0, 3, 6 and 9, so the intercept is the level at arrival and the slope is the change per 3 months. z tests of variances are only rough guides, because a variance can't fall below 0 (Stoel et al., 2006). Intercept–slope correlation rIS = −.35.
Table 2. Fit of Three Growth Models
| \chi^2 | df | p | CFI | RMSEA | RMSEA 90% CI | SRMR | |
|---|---|---|---|---|---|---|---|
| No change (intercept only) | 51.21 | 8 | < .001 | .932 | .147 | [.110, .187] | .063 |
| Linear change | 6.87 | 5 | .230 | .997 | .039 | [.000, .102] | .033 |
| Linear change, predicted by moving away | 6.96 | 7 | .433 | 1.000 | .000 | [.000, .077] | .028 |
Note. N = 250. Maximum likelihood. The no-change model has an intercept factor only; the linear model adds the slope factor; the last row adds moving away from home as a predictor of both growth factors. The no-change model fits far worse than the linear one, χ²(3) = 44.34 for the difference (a conservative test, since the slope variance it drops sits on the boundary at 0; Stoel et al., 2006).
Table 3. Moving Away from Home as a Predictor of Starting Level and Change
| Estimate | SE | z | p | |
|---|---|---|---|---|
| Intercept (stayed home) | 7.831 | 0.351 | 22.28 | < .001 |
| Moved away → intercept | 2.325 | 0.499 | 4.66 | < .001 |
| Slope (stayed home) | −0.237 | 0.103 | −2.31 | .021 |
| Moved away → slope | −0.301 | 0.146 | −2.06 | .039 |
| Residual intercept variance | 12.412 | 1.443 | ||
| Residual slope variance | 0.499 | 0.162 | ||
| Residual intercept–slope covariance | −0.761 | 0.361 | −2.11 | .035 |
Note. N = 250 (124 moved away). Moved away coded 1, stayed home 0, so the intercept and slope rows are the stay-home students' averages, and the moved-away rows are the differences. Students who moved away: slope −0.24 + (−0.30) = −0.54 points per 3 months. Residual variances are what's left of each growth factor's variance after moving away is taken into account. Arrows mark which variable predicts which, not a causal effect.
Full Text (APA Style)
A linear latent growth curve model (maximum likelihood; time coded 0, 1, 2, 3 for months 0, 3, 6 and 9) fit the students' PHQ-9 scores well, χ²(5) = 6.87, p = .230, CFI = .997, RMSEA = .039, 90% CI [.000, .102], SRMR = .033, and much better than a model with no change, Δχ²(3) = 44.34, p < .001 (Table 2). Neither a quadratic curve nor freely estimated time loadings fit significantly better. Students arrived with mild symptoms on average (αI = 8.98, SE = 0.26), which eased by 0.39 points every three months (αS = −0.39, 95% CI [−0.53, −0.24]), or 1.16 points over the nine months, d = −0.26, z = −5.25, p < .001. Students differed in where they started (ψII = 13.75, SD = 3.71) and in how fast they changed (ψSS = 0.52, SD = 0.72 points per 3 months), and those who arrived with more symptoms tended to improve faster, rIS = −.35, z = −2.46, p = .014 (Table 1). Students who had moved away from home started 2.32 points higher and improved 0.30 points more per three months than those who hadn't, z = −2.06, p = .039 (Table 3).
- Say how time was coded and what one unit is, so readers know where the intercept sits and what the slope counts.
- Give the means of the growth factors (the average trajectory) and their variances and covariance (the individual differences), each with its standard error.
- Report fit as for any SEM: χ² with df and p, CFI, RMSEA with its 90% CI, and SRMR, plus a comparison with plausible alternative shapes.
- Name the estimator and how missing data were handled (here, none were missing).
Reading Each Piece
The equation form above, piece by piece, in this order: how big, how certain, then how surprising.
| αI = 8.98 | The average student arrived with a PHQ-9 score of about 9, in the mild range (5 to 9). This is the model's line at month 0, not the raw average of 9.06. |
| αS = −0.39 | On average, symptoms eased by 0.39 PHQ-9 points every three months, about 1.2 points over the nine months. Coding time in months (0, 3, 6, 9) would give the same line with a slope of −0.13 per month. |
| 95% CI [−0.53, −0.24] | The average change in the population is plausibly anywhere from about a quarter of a point to half a point per three months. The whole range is below zero. |
| ψSS = 0.52 | Students' rates of change differ a lot compared with the average: a typical student's slope sits 0.72 points per 3 months from the −0.39 mean, so while most improved, the model puts roughly 3 in 10 on a rising line. That share assumes slopes are normally distributed and rests on a variance estimated from four waves, so treat it as rough. Starting levels differ too, with an SD of 3.71 points. |
| rIS = −.35 | Students who arrived with more symptoms tended to improve faster, a moderate correlation (p = .014). It's tied to where time 0 sits: it links the slope to the level on arrival, and with time 0 at month 9 it would link it to the level at the end instead. Coded that way (−3, −2, −1, 0), the same data give a correlation of +.24: students who ended the year with more symptoms had improved more slowly. |
| CFI = .997 | The model removes almost all of the misfit of a model in which the four waves are unrelated, above the cutoff of about .95 that Hu and Bentler (1999) suggest. lavaan's comparison model lets each wave keep its own mean, so CFI says little about whether the average trajectory is right; the χ² difference with the no-change model (Table 2) is the better check of that. |
| RMSEA = .039 | Little misfit per degree of freedom, under the .05 “close fit” convention. |
| 90% CI [.000, .102] | With only 5 degrees of freedom the interval is wide: the data can't rule out anything from perfect fit to mediocre. That's typical of growth models with few waves. |
| SRMR = .033 | The predicted correlations (and, in lavaan, the standardized means) differ from the observed ones by about .03 on average. |
| d = −0.26 | Over nine months the average student's symptoms fell by about a quarter of a standard deviation, a small change by the benchmarks above. Whether 1.2 PHQ-9 points matters to a student is a clinical question, not a statistical one. Benchmarks ↑ |
| χ²(5) = 6.87 | If straight lines fit exactly, χ² would average about its 5 degrees of freedom; 6.87 is close to that. The no-change model's 51.21 on 8 df is far worse, strong evidence that scores change over the year. |
| z = −5.25 | The mean slope is 5.25 standard errors below zero. z is judged against the normal curve, since the standard errors come from large-sample theory. |
| p = .230 (fit) | If every student's true trajectory were a straight line, with only random noise around it, a gap at least this big between the predicted and observed means and covariances would turn up about 23% of the time, so the test finds no misfit. That's not proof the lines are right, only that four waves and 250 students show no sign they're wrong. Benchmarks ↑ |
| p < .001 | If the average student's symptoms weren't changing, a mean slope at least this far from zero, in either direction, would almost never turn up in a sample of 250. The decline is statistically significant, and small. Benchmarks ↑ |
Calculations
The Running Example
The first-year mood study: 250 students, PHQ-9 scores (0 to 27) at months 0, 3, 6 and 9 of their first year, with a straight-line trajectory fitted for each student.
| Null Hypothesis | Alternative | |
|---|---|---|
| Mean Slope | \alpha_S = 0 | \alpha_S \neq 0 |
| Straight-Line Fit | \Sigma = \Sigma(\theta),\ \mu = \mu(\theta) | the model misses the means or covariances |
\alpha_S (“alpha S”) is the slope factor's mean: the average change in PHQ-9 points per three months among all first-year students like these, which our −0.39 estimates. \Sigma and \mu are the population's covariances and means of the four waves; \Sigma(\theta) and \mu(\theta) are what straight-line trajectories with the model's 9 parameters \theta predict. The second null says straight lines reproduce them exactly.
What Your Data Should Look Like
One score per person per occasion, plus any predictors that don't change over time. Ours is stored long, one row per student per wave, with columns for the student, the wave, the PHQ-9 score and whether they moved away from home. SEM programs such as lavaan and Amos want it wide, one row per student and one column per wave, so reshape it first; mixed-model programs take it long as it is. The time codes (0, 1, 2, 3 here, for months 0, 3, 6, 9) live in the model's loadings, not in the data. People with a missed wave stay in the file, with that score left blank.
| student | wave | phq9 | moved_away |
|---|---|---|---|
| 1 | 1 | 6 | 1 |
| 1 | 2 | 10 | 1 |
| 1 | 3 | 6 | 1 |
| 1 | 4 | 8 | 1 |
| 2 | 1 | 7 | 1 |
| 2 | 2 | 4 | 1 |
| … 994 more rows | |||
| n | M | SD | |
|---|---|---|---|
| Month 0 | 250 | 9.06 | 4.38 |
| Month 3 | 250 | 8.57 | 4.02 |
| Month 6 | 250 | 8.04 | 3.99 |
| Month 9 | 250 | 7.93 | 4.14 |
250 students × 4 waves: every student has a score for every wave.
Simulated data.
Napkin Math
The whole test, one idea at a time. Under each heading, a line says why the step matters, and the green note reads the equation in plain English with the first-year mood study's numbers. Collapse all to read just the headings: they tell the whole story on their own.
-
1. Count What the Model Has to Explain
A growth model is judged on how well it reproduces the waves' means, variances and covariances, so first count them, then count what the model spends. Each score loads 1 on the intercept factor and its time code on the slope factor; those loadings are fixed, not estimated, so they cost nothing.
df = \dfrac{k(k + 1)}{2} + k - q =\dfrac{4 \times 5}{2} + 4 - 9 = 14 - 9= 5
k(k + 1)/2 + k = 14
q = 9
k is our 4 waves, which have 4 variances, 6 covariances and 4 means, 14 in all. q is the model's 9 free parameters: 2 growth factor means, 2 variances, 1 covariance and 4 residual variances. 14 − 9 = 5 pieces of information the straight lines could get wrong.
-
2. Check Whether Straight Lines Describe the Data
Before reading the trajectory, check that its shape is right. Maximum likelihood finds the parameters that bring the predicted means and covariances closest to the observed ones, and χ² measures what's left over. A model with no change at all is the natural comparison.
\chi^2 = N \times F_{\text{ML}} =250 \times 0.02748= 6.87
p = .230
CFI = .997
RMSEA = .039
90\%\ \text{CI} = [.000, .102]
SRMR = .033
F_{\text{ML}} is the leftover gap between the observed and predicted means and covariances, 0.02748, and N is our 250 students. 250 × 0.02748 = 6.87 on 5 df (lavaan prints half of F_{\text{ML}}, fmin = 0.014, because it writes χ² as 2N × fmin). A model where nobody changes leaves 51.21 on 8 df.
-
3. Estimate Where Students Start on Average
Every score loads 1 on the intercept factor, and the first wave's time code is 0, so the intercept factor is each student's level on arrival. Its mean is the average starting point of the trajectory.
\hat{\mu}_0 = \alpha_I + 0 \times \alpha_S = \alpha_I =8.98 + 0 \times (-0.386)= 8.98 points
SE = 0.26
\alpha_I is the intercept factor's mean, 8.98 PHQ-9 points, with a standard error of 0.26. At month 0 the slope is multiplied by 0, so the predicted average on arrival is just 8.98, in the mild range.
-
4. Estimate How Fast Symptoms Change on Average
The idea: draw a straight line through each student's four scores and average the slopes. The model does the same in one pass, so the slope factor's mean is the average change per step of the time codes, here three months.
\alpha_S \approx \bar{b} = \dfrac{\sum_i b_i}{N} =\dfrac{-98.40}{250}= −0.39 points per 3 months
\bar{b} = −0.394
\hat{\mu}_3 = 7.83
SE = 0.073
b_i is the slope of a least-squares line through student i's four scores. The 250 slopes add up to −98.40, an average of −0.394 points per 3 months. Maximum likelihood fits all the lines at once and gives the noisier waves a little less weight, so the slope factor's mean \alpha_S comes out at −0.386, with a standard error of 0.073. Its average line runs from 8.98 at arrival through 8.60 and 8.21 to 7.83 at month 9, within 0.17 points of the observed wave means (9.06, 8.57, 8.04, 7.93).
-
5. Measure How Big the Change Is
A slope in PHQ-9 points per three months is hard to compare with other studies. Dividing the whole study's change by how much students differed at the start puts it in standard deviations, like Cohen's d for a pre–post change.
d = \dfrac{\alpha_S \times \lambda_{\text{last}}}{SD_{\text{baseline}}} =\dfrac{-0.386 \times 3}{4.38}= −0.26
SD_{\text{baseline}} = 4.38
d_{\text{moved away}} = −0.21
\alpha_S \times \lambda_{\text{last}} is the average change from month 0 to month 9, −0.39 × 3 = −1.16 points, and SD_{\text{baseline}} is the spread of scores on arrival, 4.38. −1.16 ÷ 4.38 = −0.26.
-
6. Compare the Average Change with Its Uncertainty
The mean slope is an estimate, and its standard error says how much it would wobble from sample to sample. z counts how many standard errors it sits from no change, and ±1.96 standard errors gives a 95% range.
z = \dfrac{\hat{\theta}}{SE_{\hat{\theta}}} =\dfrac{-0.3856}{0.0734}= −5.25
95\%\ \text{CI} = [−0.53, −0.24]
\hat{\theta} is our mean slope, −0.3856, and SE its standard error, 0.0734. −0.3856 ÷ 0.0734 = −5.25. For the interval, 1.96 × 0.0734 = 0.144, so −0.386 ± 0.144 runs from −0.53 to −0.24.
-
7. Ask How Surprising the Decline Would Be If Symptoms Weren't Changing
Finally for the average trajectory, ask how often a sample of 250 would give a mean slope at least this far from zero, in either direction, if the average student didn't change at all.
p = 2 \times P(Z \ge |z|) =2 \times P(Z \le -5.25)< .001
P(Z \le -5.25) is the chance a standard normal value lands at or below −5.25. Doubled for both directions it's about .00000015, far below .001.
-
8. Measure How Much Students Differ in Where They Start and How Fast They Change
The means describe the average student; the growth factors' variances describe how students differ. Students' own slopes vary, but with only four noisy scores each, part of that spread is noise. Taking the noise away leaves how much their true rates of change differ.
\psi_{SS} \approx \operatorname{Var}(b_i) - \dfrac{\bar{\sigma}^2_e}{\sum_t (t - \bar{t})^2}= 0.52
\operatorname{Var}(b_i) = 1.36
\bar{\sigma}^2_e / 5 = 0.87
SD_S = \sqrt{\psi_{SS}} = 0.72
\psi_{II} = 13.75
SD_I = \sqrt{\psi_{II}} = 3.71
\operatorname{Var}(b_i), the variance of the 250 slopes from step 4, is 1.36. Each student's own line misses their scores by an average residual variance \bar{\sigma}^2_e of 4.35, and with time codes 0 to 3 (squared distances from their mean adding to 5), that makes each slope wobble by 4.35 ÷ 5 = 0.87. 1.36 − 0.87 = 0.49. Maximum likelihood does the same separation more carefully and gives \psi_{SS} = 0.52. Its square root is easier to read: the slopes' SD is √0.519 = 0.72 points per 3 months. If slopes are roughly normal, about 95% of students' slopes fall within −0.39 ± 1.96 × 0.72, from −1.80 (improving fast) to +1.03 (getting worse).
-
9. Check Whether Students Who Start Higher Change Differently
The intercept and slope factors can covary. A negative covariance means students who arrive with more symptoms tend to have steeper declines. Dividing by both SDs turns it into a correlation.
r_{IS} = \dfrac{\psi_{IS}}{\sqrt{\psi_{II}\,\psi_{SS}}} =\dfrac{-0.930}{\sqrt{13.75 \times 0.519}} = \dfrac{-0.930}{2.672}= −.35
\psi_{IS} = −0.93
p = .014
\psi_{IS} is the covariance between starting level and slope, −0.93, and \sqrt{\psi_{II}\,\psi_{SS}} = 3.71 × 0.72 = 2.67. −0.93 ÷ 2.67 = −.35. The covariance's own z is −0.93 ÷ 0.378 = −2.46, p = .014.
Run It in Software
The code below reads the running example's data from data.csv; save it in the same folder you run the code from.
SPSS (version 30, as documented by IBM)
SPSS Statistics has no growth-curve menu in the SEM sense (IBM's add-on SPSS Amos draws one: two latent variables with every loading fixed). But the same model can be fitted as a mixed model, which gives identical estimates when each wave keeps its own residual variance. Our file is already long, one row per student per wave.
- Transform → Compute Variable:
time = wave - 1, so the time codes are 0, 1, 2, 3. - Analyze → Mixed Models → Linear. Put
studentin Subjects andwavein Repeated, and choose Diagonal as the Repeated Covariance Type (one residual variance per wave). Continue. - Move
phq9to Dependent Variable andtimeto Covariate(s). - Fixed: add
time, keep Include intercept. - Random: add
time, tick Include intercept, set Covariance Type to Unstructured, and movestudentinto Combinations. - Estimation: choose Maximum Likelihood (ML). Statistics: tick Parameter estimates and Tests for covariance parameters. OK.
Or paste this syntax:
COMPUTE time = wave - 1. EXECUTE. MIXED phq9 WITH time /FIXED=time /METHOD=ML /PRINT=SOLUTION TESTCOV G /RANDOM=INTERCEPT time | SUBJECT(student) COVTYPE(UN) /REPEATED=wave | SUBJECT(student) COVTYPE(DIAG).
Reading the Output
Read Estimates of Fixed Effects first: the Intercept row is the mean intercept (8.98) and the time row the mean slope (−0.39, with its standard error, t and Sig.). Then Estimates of Covariance Parameters: the Repeated Measures rows are the four residual variances (4.65, 4.39, 4.47, 3.63), and the Intercept + time [subject = student] rows hold the intercept variance (UN (1,1), 13.75), the intercept–slope covariance (UN (2,1), −0.93) and the slope variance (UN (2,2), 0.52). These should match Table 1; the same model in R's nlme (with weights = varIdent(form = ~ 1 | wave)) reproduces them to five decimals. MIXED doesn't compare the model with a saturated one, so it gives no χ² test of fit, CFI or RMSEA. For those, use Amos or R, or fit a model with free wave means and an unstructured REPEATED covariance and compare the −2 log likelihoods.
Output laid out from this page's computed results, not captured from a live run; labels and layout may differ slightly in your version.
R
library(lavaan)
mood <- read.csv("data.csv")
# lavaan wants one row per student, one column per wave
wide <- reshape(mood, direction = "wide", idvar = c("student", "moved_away"),
timevar = "wave", v.names = "phq9", sep = "_")
model <- '
i =~ 1*phq9_1 + 1*phq9_2 + 1*phq9_3 + 1*phq9_4
s =~ 0*phq9_1 + 1*phq9_2 + 2*phq9_3 + 3*phq9_4
'
fit <- growth(model, data = wide)
summary(fit, fit.measures = TRUE, standardized = TRUE)
# Does moving away from home predict where students start and how fast they change?
fit_x <- growth(paste(model, "i + s ~ moved_away"), data = wide)
summary(fit_x)
lavaan 0.7-2 ended normally after 53 iterations
Estimator ML
Number of model parameters 9
Number of observations 250
Model Test User Model:
Test statistic 6.871
Degrees of freedom 5
P-value (Chi-square) 0.230
Model Test Baseline Model:
Test statistic 636.898
Degrees of freedom 6
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.997
Tucker-Lewis Index (TLI) 0.996
Root Mean Square Error of Approximation:
RMSEA 0.039
90 Percent confidence interval - lower 0.000
90 Percent confidence interval - upper 0.102
P-value H_0: RMSEA <= 0.050 0.536
P-value H_0: RMSEA >= 0.080 0.169
Standardized Root Mean Square Residual:
SRMR 0.033
Covariances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
i ~~
s -0.930 0.378 -2.462 0.014 -0.348 -0.348
Intercepts:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
i 8.983 0.260 34.541 0.000 2.423 2.423
s -0.386 0.073 -5.253 0.000 -0.535 -0.535
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.phq9_1 4.646 0.816 5.691 0.000 4.646 0.253
.phq9_2 4.392 0.536 8.195 0.000 4.392 0.261
.phq9_3 4.473 0.534 8.373 0.000 4.473 0.270
.phq9_4 3.631 0.732 4.960 0.000 3.631 0.220
i 13.747 1.560 8.812 0.000 1.000 1.000
s 0.519 0.164 3.169 0.002 1.000 1.000
And from summary(fit_x):
Regressions:
Estimate Std.Err z-value P(>|z|)
i ~
moved_away 2.325 0.499 4.659 0.000
s ~
moved_away -0.301 0.146 -2.065 0.039
Output trimmed: the information criteria, GFI and the fixed loadings are left out, and only the regressions are shown from the second model. growth() frees the growth factors' means and fixes the waves' own intercepts at 0, so the Intercepts of i and s are the average trajectory; under Variances, i and s are the individual differences and the dotted .phq9_ rows the residual variances. Std.all of the i ~~ s covariance is the intercept–slope correlation, −.348. For robust ML add estimator = "MLR"; if some students missed a wave, add missing = "fiml".
Output from a real run: R 4.6.1 (lavaan 0.7-2), run 2026-09-29.
Python
import pandas as pd
import statsmodels.formula.api as smf
mood = pd.read_csv("data.csv")
mood["time"] = mood["wave"] - 1 # time codes 0, 1, 2, 3
# The growth model as a mixed model: a random intercept and slope per student,
# fitted by maximum likelihood (reml=False) as the SEM programs are.
fit = smf.mixedlm("phq9 ~ time", mood, groups="student",
re_formula="~time").fit(reml=False)
print(fit.summary())
print(fit.cov_re)
Mixed Linear Model Regression Results
=============================================================
Model: MixedLM Dependent Variable: phq9
No. Observations: 1000 Method: ML
No. Groups: 250 Scale: 4.3484
-------------------------------------------------------------
Coef. Std.Err. z P>|z| [0.025 0.975]
-------------------------------------------------------------
Intercept 8.990 0.261 34.503 0.000 8.480 9.501
time -0.394 0.074 -5.349 0.000 -0.538 -0.249
student Var 13.930 0.892
student x time Cov -0.978 0.175
time Var 0.484 0.071
=============================================================
student time
student 13.929873 -0.978075
time -0.978075 0.484050
Output trimmed to the model summary. statsmodels' mixed model gives every wave the same residual variance (Scale, 4.35), so it fits the growth model with the four residual variances constrained equal: mean intercept 8.99 and mean slope −0.394 instead of 8.98 and −0.386. Constrain the residual variances to be equal in lavaan and you get these same numbers. The standard errors it prints for the variances don't match lavaan's, so use lavaan for tests of the variances. For the growth model exactly as on this page, with fit indexes, use R's lavaan; Python's semopy fits SEMs too, though it needs extra work for latent means.
Output from a real run: Python 3.9.6 (statsmodels 0.14.6, pandas 2.3.3), run 2026-10-03; header lines trimmed.
Impact
Effect Size
A slope is already a size, in the outcome's own units per unit of time: 0.39 PHQ-9 points every three months. To compare it with other studies, turn the whole study's change into standard deviations of the starting scores. Feingold (2009) recommends this metric for a difference in growth between groups, putting it on the same scale as Cohen's d from a two-group trial; applied to one group's change, as here, it parallels a pre–post d standardized by the baseline SD.
Over nine months the average student's symptoms fell 1.16 points, about a quarter of the spread between students on arrival: a small change by convention. For the difference between students who moved away and those who didn't, the same recipe uses their difference in slopes, −0.30 × 3 = −0.90 points, over the baseline SD pooled within the two groups, 4.22: d = −0.21.
d depends on the study's length, so always say how long it ran. The variances carry the other half of the size story: the slopes' SD of 0.72 points per three months is almost twice the average slope, so the average hides students heading in opposite directions. In practical terms, the typical student ends the year about one point lower on a 27-point questionnaire, while the model puts roughly 3 in 10 on a rising line (assuming slopes are normally distributed; a rough figure from four waves). Four scores per student can't say with much confidence which students those are, but they're the ones a counseling service would want to find.
Benchmarks Change in Baseline SDs (d) at a Glance
Statistical Significance
A growth model answers several questions at once, and each has its own p. For the mean slope, p answers: if the average person didn't change, how often would a sample's mean slope land at least this far from zero? The same Wald z test is used for the other parameters, such as the intercept–slope covariance or a predictor's effect on the slope.
If the average student's symptoms weren't changing, a mean slope of −0.39 with a standard error of 0.073 would turn up far less than 1 time in 1,000: z = −5.25, p < .001. The negative intercept–slope covariance is more modest, p = .014, and so is the difference in slopes between students who moved away and those who didn't, p = .039.
The χ² test of fit works the other way round: its null hypothesis is the model, so a small p counts against straight lines. Ours, p = .230, finds no misfit, which with 5 degrees of freedom isn't strong evidence the lines are right. Tests of variances need care too. A variance can't be below 0, so testing whether it's 0 puts the null on the edge of what's possible: the z test is only a rough guide, and the usual χ² difference test is too conservative, because the correct reference distribution is a mix of χ² distributions (Stoel et al., 2006). To test whether people differ in their slopes, fit the model again with the slope variance and its covariance fixed at 0 and compare. Here Δχ²(2) = 11.65. Instead of reading it against χ²(2), average the p-values from χ²(1) and χ²(2): ½(.0006 + .0030) = .0018 (Stoel et al., 2006). For a single variance, halve the usual p. Either way, students differ. p is not the probability that the null hypothesis is true, and it says nothing about how big the change is. That's what the slope, its interval and d are for.
Benchmarks p at a Glance
Strength of evidence against the null hypothesis.
Power and Sample Size
Power is the chance that a study detects an effect that's really there. In a growth model it depends on more than the number of people: how many waves there are and how far apart, how long the study runs, how much people's slopes vary, how noisy each occasion is, and how much data go missing. There's no formula that covers all of that, so the usual approach is a Monte Carlo study: pick plausible values for every parameter, simulate many datasets from them, fit the model to each, and count how often the effect comes out significant (Muthén & Muthén, 2002).
Suppose the truth were exactly what we estimated: students who moved away improve 0.30 points per three months faster, with the same variances and noise. We simulated 1,000 studies at each sample size. With 250 students, the difference in slopes came out significant only about 57% of the time, so our significant result was a bit lucky; about 500 students give 84%. The average decline is far easier to detect, but the residual intercept–slope covariance in the moved-away model (Table 3) needs about as many people as the slope difference: 55% power at 250, 86% at 500.
Plan for the smallest difference in change that would matter, by simulation. Count waves as well as people: the total number of person-by-time observations matters for power too (Curran et al., 2010). Growth models have been fitted with as few as 22 people, but about 100 or more is often preferred (Curran et al., 2010), and more when you want to explain who changes faster. There's no calculator for growth models here; Mplus's Monte Carlo facility, or simsem and lavaan's simulateData() in R, run the simulation.
Other Info
Follow-Up and Post Hoc Tests
None needed. This test answers a single question, so there are no planned contrasts or post hoc tests to run.
References
-
Meredith, W., & Tisak, J. (1990). Latent curve analysis. Psychometrika, 55(1), 107–122.
https://doi.org/10.1007/BF02294746
“These procedures may be viewed as an alternative to standard repeated measures ANOVA and to first-order auto-regressive methods.” (Abstract)
-
McArdle, J. J., & Epstein, D. (1987). Latent growth curves within developmental structural equation models. Child Development, 58(1), 110–133.
https://doi.org/10.2307/1130295
“A longitudinal model that includes correlations, variances, and means is described as a latent growth curve model (LGM).” (Abstract)
-
Curran, P. J., Obeidat, K., & Losardo, D. (2010). Twelve frequently asked questions about growth curve modeling. Journal of Cognition and Development, 11(2), 121–136.
https://doi.org/10.1080/15248371003699969
“In many situations, the multilevel and SEM approaches to growth modeling are numerically identical, yet in others, there are important differences.” (“How Are Growth Models Fit to Data?”)
“growth models have successfully been fitted to samples as small as n = 22 (Huttenlocher, Haight, Bryk, Seltzer, & Lyons, 1991), although sample sizes approaching at least 100 are often preferred.” (“What Are the Data Requirements to Use Growth Models?”)
“the missing data must be characterized as missing completely at random (e.g., cases are truly missing at random) or missing at random (e.g., cases are missing as a function of measured characteristics such as gender or ethnicity)” (“Can Growth Models Be Estimated with Partially Missing Data?”)
-
Biesanz, J. C., Deeb-Sossa, N., Papadakis, A. A., Bollen, K. A., & Curran, P. J. (2004). The role of coding time in estimating and interpreting growth curve models. Psychological Methods, 9(1), 30–52.
https://doi.org/10.1037/1082-989X.9.1.30
“Recommendations include coding time to produce readily interpretable estimates and graphing lower order effects across time with appropriate confidence intervals to help illustrate and understand the growth process.” (Abstract)
-
Feingold, A. (2009). Effect sizes for growth-modeling analysis for controlled clinical trials in the same metric as for classical analysis. Psychological Methods, 14(1), 43–53.
https://doi.org/10.1037/a0014699
“the correct effect size for treatment efficacy in GMA--the difference between the estimated means of the 2 groups at end of study (determined from the coefficient for the slope difference and length of study) divided by the baseline standard deviation--is not reported in clinical trials.” (Abstract)
-
Stoel, R. D., Garre, F. G., Dolan, C., & van den Wittenboer, G. (2006). On the likelihood ratio test in structural equation modeling when parameters are subject to boundary constraints. Psychological Methods, 11(4), 439–455.
https://doi.org/10.1037/1082-989X.11.4.439
“For instance, this occurs in testing whether the variance of a growth parameter is significantly different from 0.” (Abstract)
-
Muthén, L. K., & Muthén, B. O. (2002). How to use a Monte Carlo study to decide on sample size and determine power. Structural Equation Modeling, 9(4), 599–620.
https://doi.org/10.1207/S15328007SEM0904_8
“In reality there is no rule of thumb that applies to all situations.” (Abstract)
- Hu, L., & Bentler, P. M. (1999). Cutoff criteria for fit indexes in covariance structure analysis: Conventional criteria versus new alternatives. Structural Equation Modeling, 6(1), 1–55. https://doi.org/10.1080/10705519909540118
- Rosseel, Y. (2012). lavaan: An R package for structural equation modeling. Journal of Statistical Software, 48(2), 1–36. https://doi.org/10.18637/jss.v048.i02
- Kroenke, K., Spitzer, R. L., & Williams, J. B. W. (2001). The PHQ-9: Validity of a brief depression severity measure. Journal of General Internal Medicine, 16(9), 606–613. https://doi.org/10.1046/j.1525-1497.2001.016009606.x
- Cohen, J. (1988). Statistical power analysis for the behavioral sciences (2nd ed.). Lawrence Erlbaum Associates.
-
Browne, M. W., & Cudeck, R. (1992). Alternative ways of assessing model fit. Sociological Methods & Research, 21(2), 230–258.
https://doi.org/10.1177/0049124192021002005
“Practical difficulties associated with the usual tests of exact fit or [sic] a model are discussed and a test of “close fit” of a model is suggested.” (Abstract)
-
MacCallum, R. C., Browne, M. W., & Sugawara, H. M. (1996). Power analysis and determination of sample size for covariance structure modeling. Psychological Methods, 1(2), 130–149.
https://doi.org/10.1037/1082-989X.1.2.130
“We emphasize the value of confidence intervals for fit indices, and we stress the relationship of confidence intervals to a framework for hypothesis testing.” (Abstract)
-
Kenny, D. A., Kaniskan, B., & McCoach, D. B. (2015). The performance of RMSEA in models with small degrees of freedom. Sociological Methods & Research, 44(3), 486–507.
https://doi.org/10.1177/0049124114543236
“when the cutoff values are used to assess the fit of the properly specified models with small df and small sample size, the RMSEA too often falsely indicates a poor fitting model” (Abstract)
-
Bentler, P. M. (1990). Comparative fit indexes in structural models. Psychological Bulletin, 107(2), 238–246.
https://doi.org/10.1037/0033-2909.107.2.238
“A new coefficient is proposed to summarize the relative reduction in the noncentrality parameters of two nested models.” (Abstract)
-
Muff, S., Nilsen, E. B., O'Hara, R. B., & Nater, C. R. (2022). Rewriting results sections in the language of evidence. Trends in Ecology & Evolution, 37(3), 203–210.
https://doi.org/10.1016/j.tree.2021.10.009
“we suggest language of evidence that allows for a more nuanced approach to communicate scientific findings as a simple and intuitive alternative to statistical significance testing” (Abstract)
-
MacCallum, R. C., Roznowski, M., & Necowitz, L. B. (1992). Model modifications in covariance structure analysis: The problem of capitalization on chance. Psychological Bulletin, 111(3), 490–504.
https://doi.org/10.1037/0033-2909.111.3.490
“The use of alternative a priori models is recommended as a preferred strategy.” (Abstract)
Spot an error? Something still confusing? Tell us at support@statsforpsychology.com.