Simple 3-variable mediation analysis simulation to test the hypothesis that X -> Y is mediated by the relationship X -> M -> Y. Currently, M and Y are assumed to be continuous variables with Gaussian errors, while X may be continuous or dichotomous.
Usage
p_mediation(
n,
a,
b,
cprime,
dichotomous.X = FALSE,
two.tailed = TRUE,
method = "wald",
sd.X = 1,
sd.Y = 1,
sd.M = 1,
gen_fun = gen_mediation,
return_analysis = FALSE,
...
)
gen_mediation(
n,
a,
b,
cprime,
dichotomous.X = FALSE,
sd.X = 1,
sd.Y = 1,
sd.M = 1,
...
)Arguments
- n
total sample size unless
dichotomous.X = TRUE, in which the value represents the size per group- a
regression coefficient for the path X -> M
- b
regression coefficient for the path M -> Y
- cprime
partial regression coefficient for the path X -> Y
- dichotomous.X
logical; should the X variable be generated as though it were dichotomous? If TRUE then
nrepresents the sample size per group- two.tailed
logical; should a two-tailed or one-tailed test be used?
- method
type of inferential method to use. Default uses the Wald (a.k.a., Sobel) test
- sd.X
standard deviation for X
- sd.Y
standard deviation for Y
- sd.M
standard deviation for M
- gen_fun
function used to generate the required two-sample data. Object returned must be a
data.framewith the columns"DV"and"group". Default usesgen_mediationto generate conditionally Gaussian distributed samples. User defined version of this function must include the argument...- return_analysis
logical; return the analysis object for further extraction and customization?
- ...
additional arguments to be passed to
gen_fun. Not used unless a customizedgen_funis defined
Author
Phil Chalmers rphilip.chalmers@gmail.com
Examples
# joint test H0: a*b = 0
p_mediation(50, a=sqrt(.35), b=sqrt(.35), cprime=.39)
#> [1] 0.0002565864
p_mediation(50, a=sqrt(.35), b=sqrt(.35), cprime=.39, dichotomous.X=TRUE)
#> [1] 5.341437e-07
# return analysis model
p_mediation(50, a=sqrt(.35), b=sqrt(.35), cprime=.39, return_analysis=TRUE)
#> lavaan 0.6-21 ended normally after 1 iteration
#>
#> Estimator ML
#> Optimization method NLMINB
#> Number of model parameters 5
#>
#> Number of observations 50
#>
#> Model Test User Model:
#>
#> Test statistic 0.000
#> Degrees of freedom 0
# data generation properties
N <- 1000
dat <- gen_mediation(n = N, a = .8, b = -.7, cprime = .2,
sd.X = 2, sd.Y = 3, sd.M = 2)
descript(dat) # specific SDs
#> # A tibble: 3 × 12
#> VARS n mean trim sd skew kurt min P25 P50 P75
#> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 X 1000 0.0345 0.0448 1.97 -0.0649 -0.169 -6.50 -1.24 0.0504 1.33
#> 2 M 1000 -0.0307 -0.0224 2.02 -0.0261 -0.184 -5.57 -1.43 0.0151 1.34
#> 3 Y 1000 0.0812 0.0713 2.98 0.0223 -0.0146 -10.3 -1.87 -0.0236 2.18
#> # ℹ 1 more variable: max <dbl>
# two-step regression-based estimates (not used)
lm(M ~ X, data=dat) |> coef() # a
#> (Intercept) X
#> -0.05822562 0.79561851
lm(Y ~ M + X, data=dat) |> coef() # b and cprime
#> (Intercept) M X
#> 0.05258074 -0.69532842 0.21069509
lm(Y ~ X, data=dat) |> coef() # c = cprime + a*b
#> (Intercept) X
#> 0.09306667 -0.34252107
# same properties, but dichotomous X variable
dat <- gen_mediation(n = N, a = .8, b = -.7, cprime = .2,
sd.X = 2, sd.Y = 3, sd.M = 2, dichotomous.X = TRUE)
descript(dat) # specific SDs
#> # A tibble: 3 × 12
#> VARS n mean trim sd skew kurt min P25 P50 P75
#> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 X 2000 2 2 2.00 0 -2.00 0 0 2 4
#> 2 M 2000 1.58 1.59 2.00 -0.0107 -0.858 -3.75 -0.0453 1.56 3.23
#> 3 Y 2000 -0.720 -0.709 2.95 -0.0104 -0.0973 -9.56 -2.74 -0.669 1.26
#> # ℹ 1 more variable: max <dbl>
# two-step regression-based estimates (not used)
lm(M ~ X, data=dat) |> coef() # a
#> (Intercept) X
#> -0.02934882 0.80493087
lm(Y ~ M + X, data=dat) |> coef() # b and cprime
#> (Intercept) M X
#> 0.01563743 -0.61796916 0.12075761
lm(Y ~ X, data=dat) |> coef() # c = cprime + a*b
#> (Intercept) X
#> 0.03377409 -0.37666484
# \donttest{
# power to detect mediation
p_mediation(n=50, a=sqrt(.35), b=sqrt(.35), cprime=.39) |>
Spower(parallel=TRUE, replications=1000)
#>
#> ── Spower Results ──────────────────────────────────────────────────────────────
#>
#> Design conditions:
#>
#> # A tibble: 1 × 4
#> n cprime sig.level power
#> <dbl> <dbl> <dbl> <lgl>
#> 1 50 0.39 0.05 NA
#>
#> Estimate of power: 0.997
#> 95% Confidence Interval: [0.994, 1.000]
#> Execution time (H:M:S): 00:00:22
# sample size estimate for .95 power
p_mediation(n=interval(50,200), a=sqrt(.35), b=sqrt(.35), cprime=.39) |>
Spower(power=.95, parallel=TRUE)
#>
#> ── Spower Results ──────────────────────────────────────────────────────────────
#>
#> Design conditions:
#>
#> # A tibble: 1 × 4
#> n cprime sig.level power
#> <dbl> <dbl> <dbl> <dbl>
#> 1 NA 0.39 0.05 0.95
#>
#> Estimate of n: 51.0
#> 95% Confidence Interval: [NA, NA]
#> Execution time (H:M:S): 00:23:41
# }