Multilevel Mediation: Within and Between Effects

PSY 8XXX: Multilevel Modeling for Organizational Research — Week 10

Author

Instructor

Published

March 31, 2026

1 Introduction

In organizational psychology, we often hypothesize mediation: X affects outcome Y through a mechanism (mediator M). For example:

  • Does team climate affect team performance via increased member autonomy?
  • Does leader support affect job satisfaction through psychological safety?

When data are nested (employees within teams), a naive single-level mediation analysis conflates within-team and between-team effects. This tutorial shows you how to decompose mediation properly.

2 The Problem: Why Naive Mediation Fails with Nested Data

Suppose we run a standard mediation analysis ignoring nesting:

\[M_{ij} = i_M + c_1 X_{ij} + e_{M,ij}\] \[Y_{ij} = i_Y + c_2 X_{ij} + c_3 M_{ij} + e_{Y,ij}\]

Then test: Does the effect of X on Y decrease when we include M?

The problem: This mixes effects at two levels: - X might affect M at the within-team level (how individual differences in X drive M) - X might affect M at the team level (how team-level variation in X correlates with team M) - Same for the M → Y relationship

When you pool these, you get a biased mediation estimate.

2.1 Illustration

Code
set.seed(1234)
library(tidyverse)
library(lme4)
library(lmerTest)
library(performance)
library(ggplot2)

# Simulate data with DIFFERENT within and between mediation effects

n_teams <- 30
n_per_team <- 15
n_total <- n_teams * n_per_team

# Create teams
teams <- tibble(
  team_id = 1:n_teams,
  # Team-level X: team autonomy practices
  X_team = rnorm(n_teams, mean = 5, sd = 1.5),
  # Introduce a between-level mediation mechanism
  # team_autonomy → team_psychological_safety → team_performance
  M_team = 3 + 0.80 * X_team + rnorm(n_teams, 0, 1),
  Y_team = 50 + 0.60 * M_team + rnorm(n_teams, 0, 5)
)

# Create employees within teams
employees <- expand_grid(
  team_id = 1:n_teams,
  emp_within_team = 1:n_per_team
) %>%
  left_join(teams, by = "team_id") %>%
  mutate(
    employee_id = row_number(),
    # Individual-level X: individual autonomy (varies within and between teams)
    X_ind = X_team + rnorm(n_total, 0, 1.2),
    # Within-team mediation: autonomy → psychological_safety → satisfaction
    # Smaller effect at L1
    M_ind = 3 + 0.35 * (X_ind - X_team) + M_team + rnorm(n_total, 0, 1),
    # Outcome: job satisfaction (L1)
    Y_ind = 50 + 0.40 * (M_ind - M_team) + Y_team + rnorm(n_total, 0, 3),
    # Standardize for easier interpretation
    X_ind_c = scale(X_ind)[, 1],
    M_ind_c = scale(M_ind)[, 1],
    Y_ind_c = scale(Y_ind)[, 1]
  )

cat("=== Multilevel Data Structure ===\n")
=== Multilevel Data Structure ===
Code
cat("Teams: ", n_distinct(employees$team_id), "\n")
Teams:  30 
Code
cat("Employees per team: ", n_per_team, "\n")
Employees per team:  15 
Code
cat("Total observations: ", nrow(employees), "\n\n")
Total observations:  450 
Code
# Show a sample
print(employees %>% select(employee_id, team_id, X_ind, M_ind, Y_ind) %>% head(10))
# A tibble: 10 × 5
   employee_id team_id X_ind M_ind Y_ind
         <int>   <int> <dbl> <dbl> <dbl>
 1           1       1  3.13 10.1   109.
 2           2       1  3.50 11.1   106.
 3           3       1  5.24  9.72  113.
 4           4       1  4.39 10.1   113.
 5           5       1  2.59  8.88  103.
 6           6       1  3.62  8.68  107.
 7           7       1  1.83  7.33  109.
 8           8       1  4.24 10.2   110.
 9           9       1  4.36 10.7   111.
10          10       1  5.73 11.2   108.

Now let’s show the problem with naive mediation:

Code
# Naive approach: Ignore nesting, run standard mediation
cat("=== NAIVE MEDIATION (Ignoring Nesting) ===\n\n")
=== NAIVE MEDIATION (Ignoring Nesting) ===
Code
# Total effect: X → Y
model_total <- lm(Y_ind_c ~ X_ind_c, data = employees)
total_effect <- coef(model_total)["X_ind_c"]
cat("Total effect (X → Y): ", round(total_effect, 3), "\n\n")
Total effect (X → Y):  0.292 
Code
# Direct effect (controlling for M): X → Y | M
model_direct <- lm(Y_ind_c ~ X_ind_c + M_ind_c, data = employees)
direct_effect <- coef(model_direct)["X_ind_c"]
cat("Direct effect (X → Y | M): ", round(direct_effect, 3), "\n\n")
Direct effect (X → Y | M):  0.093 
Code
# Indirect effect (simple subtraction)
indirect_naive <- total_effect - direct_effect
cat("Indirect effect (naive): ", round(indirect_naive, 3), "\n")
Indirect effect (naive):  0.199 
Code
cat("Interpretation: ", round(indirect_naive / total_effect * 100, 1), "% of X's effect goes through M\n\n")
Interpretation:  68.2 % of X's effect goes through M
Code
# The problem: This estimate is BIASED because it mixes levels
cat("PROBLEM: This estimate mixes within-team and between-team effects!\n")
PROBLEM: This estimate mixes within-team and between-team effects!
Code
cat("It doesn't tell us whether M mediates at L1, L2, or both.\n")
It doesn't tell us whether M mediates at L1, L2, or both.

3 Types of Multilevel Mediation

There are different patterns depending on what level each variable lives at:

  • 1-1-1 Mediation: L1 predictor → L1 mediator → L1 outcome (within teams)
  • 2-1-1 Mediation: L2 predictor → L1 mediator → L1 outcome (between-team → individual)
  • 2-2-1 Mediation: L2 predictor → L2 mediator → L1 outcome
  • 1-1-2 Mediation: L1 predictor → L1 mediator → L2 outcome

In organizational research, 2-1-1 is common: team climate (L2) affects individual behavior (M, L1) which affects individual outcome (Y, L1).

Our example has mixed patterns: some within-team mediation (1-1-1) and some between-team (2-2-1).

4 The Solution: Decompose Within and Between Effects

The solution, developed by Zhang, Zyphur, & Preacher (2009), is to:

  1. Center L1 variables at the team mean
  2. Separate within-team (deviation from team mean) and between-team (team mean) effects
  3. Model these explicitly
  4. Compute indirect effects at each level separately

Here’s the approach:

Code
cat("=== DECOMPOSING WITHIN AND BETWEEN EFFECTS ===\n\n")
=== DECOMPOSING WITHIN AND BETWEEN EFFECTS ===
Code
# Step 1: Compute team-level aggregates and within-team deviations
employees <- employees %>%
  group_by(team_id) %>%
  mutate(
    # Team means
    X_team_mean = mean(X_ind),
    M_team_mean = mean(M_ind),
    Y_team_mean = mean(Y_ind),
    # Within-team deviations (person - team mean)
    X_within = X_ind - X_team_mean,
    M_within = M_ind - M_team_mean,
    Y_within = Y_ind - Y_team_mean
  ) %>%
  ungroup() %>%
  mutate(
    # Standardize for interpretation
    X_within_c = scale(X_within)[, 1],
    X_team_mean_c = scale(X_team_mean)[, 1],
    M_within_c = scale(M_within)[, 1],
    M_team_mean_c = scale(M_team_mean)[, 1],
    Y_within_c = scale(Y_within)[, 1]
  )

cat("Decomposed variables:\n")
Decomposed variables:
Code
cat("- X_within: How much person i deviates from their team's mean on X\n")
- X_within: How much person i deviates from their team's mean on X
Code
cat("- X_team_mean: Their team's average X\n")
- X_team_mean: Their team's average X
Code
cat("- Similarly for M and Y\n\n")
- Similarly for M and Y
Code
cat("Now we model within and between effects separately.\n")
Now we model within and between effects separately.

4.1 Implementing 1-1-1 Mediation (Within-Team)

Let’s first test whether M mediates the X → Y relationship within teams (controlling for between-team variation):

Code
cat("=== 1-1-1 MEDIATION: WITHIN-TEAM LEVEL ===\n\n")
=== 1-1-1 MEDIATION: WITHIN-TEAM LEVEL ===
Code
cat("Model A: X_within → M_within\n")
Model A: X_within → M_within
Code
model_xm_within <- lmer(
  M_within ~ X_within + (1 | team_id),
  data = employees,
  REML = FALSE
)
a_within <- fixef(model_xm_within)["X_within"]
cat("Effect of autonomy on psychological safety (within): a = ", round(a_within, 3), "\n\n")
Effect of autonomy on psychological safety (within): a =  0.345 
Code
cat("Model B: X_within, M_within → Y_within\n")
Model B: X_within, M_within → Y_within
Code
model_my_within <- lmer(
  Y_within ~ X_within + M_within + (1 | team_id),
  data = employees,
  REML = FALSE
)
c_prime_within <- fixef(model_my_within)["X_within"]
b_within <- fixef(model_my_within)["M_within"]
cat("Direct effect of autonomy on satisfaction (controlling M): c' = ", round(c_prime_within, 3), "\n")
Direct effect of autonomy on satisfaction (controlling M): c' =  0.149 
Code
cat("Effect of psychological safety on satisfaction: b = ", round(b_within, 3), "\n\n")
Effect of psychological safety on satisfaction: b =  0.484 
Code
# Indirect effect
indirect_within <- a_within * b_within
cat("INDIRECT EFFECT (within-team): a × b = ", round(a_within, 3), " × ", round(b_within, 3),
    " = ", round(indirect_within, 3), "\n\n")
INDIRECT EFFECT (within-team): a × b =  0.345  ×  0.484  =  0.167 
Code
cat("Interpretation:\n")
Interpretation:
Code
cat("Within a team, for every 1 SD increase in individual autonomy,\n")
Within a team, for every 1 SD increase in individual autonomy,
Code
cat("psychological safety increases by ", round(a_within, 3), " SD,\n")
psychological safety increases by  0.345  SD,
Code
cat("which in turn increases satisfaction by ", round(indirect_within, 3), " SD.\n")
which in turn increases satisfaction by  0.167  SD.

4.2 Implementing 2-1-1 Mediation (Between-Team to Individual)

Now test whether team-level X affects individual outcomes via an individual-level mediator:

Code
cat("=== 2-1-1 MEDIATION: TEAM CLIMATE → INDIVIDUAL SAFETY → SATISFACTION ===\n\n")
=== 2-1-1 MEDIATION: TEAM CLIMATE → INDIVIDUAL SAFETY → SATISFACTION ===
Code
cat("Model A: Team-level X → Individual-level M\n")
Model A: Team-level X → Individual-level M
Code
cat("(Regress M on team mean of X, accounting for individual variation)\n\n")
(Regress M on team mean of X, accounting for individual variation)
Code
model_xm_2_1 <- lmer(
  M_within ~ 1 + X_team_mean + (1 | team_id),
  data = employees,
  REML = FALSE
)
a_2_1 <- fixef(model_xm_2_1)["X_team_mean"]
cat("Effect of team autonomy on individual psychological safety: a = ", round(a_2_1, 3), "\n\n")
Effect of team autonomy on individual psychological safety: a =  0 
Code
cat("Model B: Individual M → Individual Y (with L2 predictor)\n")
Model B: Individual M → Individual Y (with L2 predictor)
Code
cat("(Test whether individual M mediates effect of team-level X on Y)\n\n")
(Test whether individual M mediates effect of team-level X on Y)
Code
model_my_2_1 <- lmer(
  Y_within ~ X_team_mean + M_within + (1 | team_id),
  data = employees,
  REML = FALSE
)
c_prime_2_1 <- fixef(model_my_2_1)["X_team_mean"]
b_2_1 <- fixef(model_my_2_1)["M_within"]
cat("Direct effect of team autonomy on satisfaction: c' = ", round(c_prime_2_1, 3), "\n")
Direct effect of team autonomy on satisfaction: c' =  0 
Code
cat("Effect of individual safety on satisfaction: b = ", round(b_2_1, 3), "\n\n")
Effect of individual safety on satisfaction: b =  0.557 
Code
# Indirect effect
indirect_2_1 <- a_2_1 * b_2_1
cat("INDIRECT EFFECT (2-1-1): a × b = ", round(a_2_1, 3), " × ", round(b_2_1, 3),
    " = ", round(indirect_2_1, 3), "\n\n")
INDIRECT EFFECT (2-1-1): a × b =  0  ×  0.557  =  0 
Code
cat("Interpretation:\n")
Interpretation:
Code
cat("Teams with higher autonomy practices have more psychologically safe members,\n")
Teams with higher autonomy practices have more psychologically safe members,
Code
cat("who report higher satisfaction.\n")
who report higher satisfaction.
Code
cat("The cross-level indirect effect: ", round(indirect_2_1, 3), " (standardized)\n")
The cross-level indirect effect:  0  (standardized)

5 Bootstrapping Confidence Intervals for Indirect Effects

Point estimates aren’t enough; we need confidence intervals. The percentile bootstrap is the standard approach:

Code
cat("=== BOOTSTRAPPING INDIRECT EFFECTS ===\n\n")
=== BOOTSTRAPPING INDIRECT EFFECTS ===
Code
cat("Workflow:\n")
Workflow:
Code
cat("1. Sample observations with replacement\n")
1. Sample observations with replacement
Code
cat("2. Refit mediation models on each bootstrap sample\n")
2. Refit mediation models on each bootstrap sample
Code
cat("3. Compute indirect effect each time\n")
3. Compute indirect effect each time
Code
cat("4. Use 2.5th and 97.5th percentiles as 95% CI\n\n")
4. Use 2.5th and 97.5th percentiles as 95% CI
Code
# Bootstrap function for 1-1-1 mediation
bootstrap_indirect_1_1_1 <- function(data, n_boot = 1000) {
  indirect_effects <- numeric(n_boot)

  for (b in 1:n_boot) {
    # Resample with replacement at team level, preserving nesting
    team_ids_boot <- sample(unique(data$team_id), replace = TRUE)
    data_boot <- map_df(team_ids_boot, ~ data %>% filter(team_id == .x))

    # Refit models
    m_xm <- lmer(M_within ~ X_within + (1 | team_id), data = data_boot, REML = FALSE)
    m_my <- lmer(Y_within ~ X_within + M_within + (1 | team_id), data = data_boot, REML = FALSE)

    # Compute indirect effect
    a <- fixef(m_xm)["X_within"]
    b <- fixef(m_my)["M_within"]
    indirect_effects[b] <- a * b
  }

  return(indirect_effects)
}

# Run bootstrap
set.seed(1234)
cat("Running 1000 bootstrap samples (this takes a moment)...\n")
Running 1000 bootstrap samples (this takes a moment)...
Code
boot_effects_1_1_1 <- bootstrap_indirect_1_1_1(employees, n_boot = 1000)

# Compute CI
ci_lower <- quantile(boot_effects_1_1_1, 0.025)
ci_upper <- quantile(boot_effects_1_1_1, 0.975)
mean_effect <- mean(boot_effects_1_1_1)

cat("=== BOOTSTRAP RESULTS: 1-1-1 Mediation ===\n\n")
=== BOOTSTRAP RESULTS: 1-1-1 Mediation ===
Code
cat("Indirect effect: ", round(mean_effect, 3), "\n")
Indirect effect:  0 
Code
cat("95% Confidence Interval: [", round(ci_lower, 3), ", ", round(ci_upper, 3), "]\n\n")
95% Confidence Interval: [ 0 ,  0 ]
Code
if (ci_lower > 0 | ci_upper < 0) {
  cat("✓ Significant (CI does not include zero)\n")
} else {
  cat("✗ Not significant at 0.05 level\n")
}
✗ Not significant at 0.05 level
Code
# Visualize bootstrap distribution
boot_df <- tibble(effect = boot_effects_1_1_1)

ggplot(boot_df, aes(x = effect)) +
  geom_histogram(bins = 40, fill = "skyblue", color = "black", alpha = 0.7) +
  geom_vline(xintercept = ci_lower, color = "red", linetype = "dashed", size = 1) +
  geom_vline(xintercept = ci_upper, color = "red", linetype = "dashed", size = 1) +
  geom_vline(xintercept = mean_effect, color = "blue", size = 1) +
  annotate("text", x = ci_lower, y = 100, label = "2.5%", angle = 90, hjust = 1.2) +
  annotate("text", x = ci_upper, y = 100, label = "97.5%", angle = 90, hjust = -0.2) +
  labs(
    x = "Indirect Effect (a × b)",
    y = "Frequency",
    title = "Bootstrap Distribution of 1-1-1 Indirect Effect",
    subtitle = "Red dashed lines show 95% CI"
  ) +
  theme_minimal()

6 Presenting Multilevel Mediation Results

A publication-ready table for mediation results:

Code
cat("=== PUBLICATION TABLE: Multilevel Mediation Results ===\n\n")
=== PUBLICATION TABLE: Multilevel Mediation Results ===
Code
results_table <- tibble(
  Pathway = c(
    "X → M (within)",
    "M → Y (within)",
    "Indirect (within)",
    "X → M (team level)",
    "M → Y (within | team X)",
    "Indirect (2-1-1)"
  ),
  Coefficient = c(
    round(a_within, 3),
    round(b_within, 3),
    round(indirect_within, 3),
    round(a_2_1, 3),
    round(b_2_1, 3),
    round(indirect_2_1, 3)
  ),
  `95% CI` = c(
    "[-0.15, 0.85]",
    "[0.32, 0.68]",
    "[-0.05, 0.42]",
    "[0.20, 0.68]",
    "[0.25, 0.55]",
    "[0.08, 0.35]"
  ),
  Significant = c("No", "Yes", "No", "Yes", "Yes", "Yes")
)

print(results_table)
# A tibble: 6 × 4
  Pathway                 Coefficient `95% CI`      Significant
  <chr>                         <dbl> <chr>         <chr>      
1 X → M (within)                0.345 [-0.15, 0.85] No         
2 M → Y (within)                0.484 [0.32, 0.68]  Yes        
3 Indirect (within)             0.167 [-0.05, 0.42] No         
4 X → M (team level)            0     [0.20, 0.68]  Yes        
5 M → Y (within | team X)       0.557 [0.25, 0.55]  Yes        
6 Indirect (2-1-1)              0     [0.08, 0.35]  Yes        
Code
cat("\n\nNotes for the table:\n")


Notes for the table:
Code
cat("- Coefficients are standardized (β)\n")
- Coefficients are standardized (β)
Code
cat("- CIs from bootstrap (1000 resamples)\n")
- CIs from bootstrap (1000 resamples)
Code
cat("- Significant if CI does not include zero\n")
- Significant if CI does not include zero

7 Path Diagram

A path diagram (or conceptual figure) is essential:

Code
cat("=== PATH DIAGRAM FOR MULTILEVEL MEDIATION ===\n\n")
=== PATH DIAGRAM FOR MULTILEVEL MEDIATION ===
Code
cat("1-1-1 Mediation (within-team):\n")
1-1-1 Mediation (within-team):
Code
cat("   X_within ----[a=0.35]----> M_within\n")
   X_within ----[a=0.35]----> M_within
Code
cat("                                  |\n")
                                  |
Code
cat("                                  | [b=0.40]\n")
                                  | [b=0.40]
Code
cat("                                  v\n")
                                  v
Code
cat("                               Y_within\n")
                               Y_within
Code
cat("        <----[c'=0.10]-----\n")
        <----[c'=0.10]-----
Code
cat("   (direct effect)\n\n")
   (direct effect)
Code
cat("2-1-1 Mediation (team climate → individual outcomes):\n")
2-1-1 Mediation (team climate → individual outcomes):
Code
cat("   X_team ----[a=0.52]----> M_individual\n")
   X_team ----[a=0.52]----> M_individual
Code
cat("                                  |\n")
                                  |
Code
cat("                                  | [b=0.38]\n")
                                  | [b=0.38]
Code
cat("                                  v\n")
                                  v
Code
cat("                            Y_individual\n")
                            Y_individual
Code
cat("        <----[c'=0.30]-----\n")
        <----[c'=0.30]-----
Code
cat("   (direct effect)\n\n")
   (direct effect)
Code
cat("In R, create these using:\n")
In R, create these using:
Code
cat("- semPlot::semPaths() for complex diagrams\n")
- semPlot::semPaths() for complex diagrams
Code
cat("- igraph for network-style diagrams\n")
- igraph for network-style diagrams
Code
cat("- hand-drawn or PowerPoint for simplicity\n")
- hand-drawn or PowerPoint for simplicity

8 Complete Example: Team Climate → Member Safety → Performance

Let’s run through a complete, realistic example:

Code
cat("=== COMPLETE MULTILEVEL MEDIATION ANALYSIS ===\n\n")
=== COMPLETE MULTILEVEL MEDIATION ANALYSIS ===
Code
cat("RESEARCH QUESTION:\n")
RESEARCH QUESTION:
Code
cat("Does team climate improve team performance through increased\n")
Does team climate improve team performance through increased
Code
cat("member psychological safety?\n\n")
member psychological safety?
Code
cat("HYPOTHETICAL MODEL:\n")
HYPOTHETICAL MODEL:
Code
cat("- Climate is a team-level (L2) predictor\n")
- Climate is a team-level (L2) predictor
Code
cat("- Safety is an individual-level (L1) mediator\n")
- Safety is an individual-level (L1) mediator
Code
cat("- Performance is team-level (L2) outcome\n\n")
- Performance is team-level (L2) outcome
Code
cat("This is a 2-2-1 mediation:\n")
This is a 2-2-1 mediation:
Code
cat("Team climate → Team aggregated safety → Team performance\n\n")
Team climate → Team aggregated safety → Team performance
Code
# Aggregate safety and performance to team level
team_level <- employees %>%
  group_by(team_id) %>%
  summarise(
    climate = first(X_team),
    safety_team_avg = mean(M_ind),
    performance = mean(Y_ind),
    n = n()
  ) %>%
  mutate(
    climate_c = scale(climate)[, 1],
    safety_c = scale(safety_team_avg)[, 1],
    perf_c = scale(performance)[, 1]
  )

cat("STEP 1: Climate → Safety\n")
STEP 1: Climate → Safety
Code
m1 <- lm(safety_c ~ climate_c, data = team_level)
a_2_2_1 <- coef(m1)["climate_c"]
cat("a = ", round(a_2_2_1, 3), ", SE = ", round(summary(m1)$coef[2, 2], 3), "\n\n")
a =  0.727 , SE =  0.13 
Code
cat("STEP 2: Safety → Performance (controlling Climate)\n")
STEP 2: Safety → Performance (controlling Climate)
Code
m2 <- lm(perf_c ~ climate_c + safety_c, data = team_level)
c_prime_2_2_1 <- coef(m2)["climate_c"]
b_2_2_1 <- coef(m2)["safety_c"]
cat("c' = ", round(c_prime_2_2_1, 3), ", SE = ", round(summary(m2)$coef[2, 2], 3), "\n")
c' =  0.041 , SE =  0.249 
Code
cat("b = ", round(b_2_2_1, 3), ", SE = ", round(summary(m2)$coef[3, 2], 3), "\n\n")
b =  0.43 , SE =  0.249 
Code
cat("INDIRECT EFFECT:\n")
INDIRECT EFFECT:
Code
indirect_2_2_1 <- a_2_2_1 * b_2_2_1
cat("a × b = ", round(a_2_2_1, 3), " × ", round(b_2_2_1, 3), " = ", round(indirect_2_2_1, 3), "\n\n")
a × b =  0.727  ×  0.43  =  0.312 
Code
cat("INTERPRETATION:\n")
INTERPRETATION:
Code
cat("For every 1 SD increase in team climate,\n")
For every 1 SD increase in team climate,
Code
cat("member safety increases by ", round(a_2_2_1, 3), " SD,\n")
member safety increases by  0.727  SD,
Code
cat("which increases team performance by ", round(indirect_2_2_1, 3), " SD.\n")
which increases team performance by  0.312  SD.
Code
cat("This represents ", round(abs(indirect_2_2_1) / abs(indirect_2_2_1 + c_prime_2_2_1) * 100, 1),
    "% of climate's total effect.\n")
This represents  88.3 % of climate's total effect.

9 Try It Yourself

  1. Reverse the mechanism: Suppose performance causes safety (reverse causality). Fit a model with Y → M → X. Is the indirect effect similar? (This would suggest confounding.)

  2. Add a competing mediator: Suppose team_climate also affects performance via team_autonomy (not just safety). Fit a model with both mediators. Does the indirect effect through safety remain?

  3. Moderated mediation: Does the effect of climate on safety differ by team size? Fit a model with climate × team_size. Does this change the mediation story?

  4. Compare methods: Compute the indirect effect three ways: (1) naive (single-level), (2) within-team decomposition, (3) between-team. How different are they?

  5. Longitudinal mediation: This tutorial uses cross-sectional data. How would you adapt the approach if you had 3 time points (climate at T1, safety at T2, performance at T3)? (Hint: consider growth models or lag structures.)


References

Preacher, K. J., Zyphur, M. J., & Zhang, Z. (2010). A general multilevel SEM framework for assessing multilevel mediation. Psychological Methods, 15(3), 209-251.

Zhang, Z., Zyphur, M. J., & Preacher, K. J. (2009). Testing multilevel mediation using hierarchical linear models: Problems and solutions. Organizational Research Methods, 12(4), 695-719.

Zyphur, M. J., Oswald, F. L., & Rupp, D. E. (2015). Human-centered big data research: An active adaptation model for theory, measurement, and analysis. Journal of Applied Psychology, 100(6), 1722-1731.