Skip to contents

This function generates a Monte Carlo method sampling distribution of the standardized total, direct and indirect effects of the independent variable \(X\) on the dependent variable \(Y\) through mediator variables \(\mathbf{m}\) over a specific time interval \(\Delta t\) or a range of time intervals using the first-order stochastic differential equation model drift matrix \(\boldsymbol{\Phi}\) and process noise covariance matrix \(\boldsymbol{\Sigma}\).

Usage

MCMedStd(
  phi,
  sigma,
  vcov_theta,
  delta_t,
  from,
  to,
  med,
  R,
  test_phi = TRUE,
  ncores = NULL,
  seed = NULL,
  tol = 0.01
)

Arguments

phi

Numeric matrix. The drift matrix (\(\boldsymbol{\Phi}\)). phi should have row and column names pertaining to the variables in the system.

sigma

Numeric matrix. The process noise covariance matrix (\(\boldsymbol{\Sigma}\)).

vcov_theta

Numeric matrix. The sampling variance-covariance matrix of \(\mathrm{vec} \left( \boldsymbol{\Phi} \right)\) and \(\mathrm{vech} \left( \boldsymbol{\Sigma} \right)\)

delta_t

Numeric. Time interval (\(\Delta t\)).

from

Character string. Name of the independent variable \(X\) in phi.

to

Character string. Name of the dependent variable \(Y\) in phi.

med

Character vector. Name/s of the mediator variable/s in phi.

R

Positive integer. Number of replications.

test_phi

Logical. If test_phi = TRUE, the function tests the stability of the generated drift matrix \(\boldsymbol{\Phi}\). If the test returns FALSE, the function generates a new drift matrix \(\boldsymbol{\Phi}\) and runs the test recursively until the test returns TRUE.

ncores

Positive integer. Number of cores to use. If ncores = NULL, use a single core. Consider using multiple cores when number of replications R is a large value.

seed

Random seed.

tol

Numeric. Smallest possible time interval to allow.

Value

Returns an object of class ctmedmc which is a list with the following elements:

call

Function call.

args

Function arguments.

fun

Function used ("MCMedStd").

output

A list with length of length(delta_t).

Each element in the output list has the following elements:

est

A vector of total, direct, and indirect effects.

thetahatstar

A matrix of Monte Carlo total, direct, and indirect effects.

Details

See TotalStd(), DirectStd(), and IndirectStd() for more details.

Monte Carlo Method

Let \(\boldsymbol{\theta}\) be a vector that combines \(\mathrm{vec} \left( \boldsymbol{\Phi} \right)\), that is, the elements of the \(\boldsymbol{\Phi}\) matrix in vector form sorted column-wise and \(\mathrm{vech} \left( \boldsymbol{\Sigma} \right)\), that is, the unique elements of the \(\boldsymbol{\Sigma}\) matrix in vector form sorted column-wise. Let \(\hat{\boldsymbol{\theta}}\) be a vector that combines \(\mathrm{vec} \left( \hat{\boldsymbol{\Phi}} \right)\) and \(\mathrm{vech} \left( \hat{\boldsymbol{\Sigma}} \right)\). Based on the asymptotic properties of maximum likelihood estimators, we can assume that estimators are normally distributed around the population parameters. $$ \hat{\boldsymbol{\theta}} \sim \mathcal{N} \left( \boldsymbol{\theta}, \mathbb{V} \left( \hat{\boldsymbol{\theta}} \right) \right) $$ Using this distributional assumption, a sampling distribution of \(\hat{\boldsymbol{\theta}}\) which we refer to as \(\hat{\boldsymbol{\theta}}^{\ast}\) can be generated by replacing the population parameters with sample estimates, that is, $$ \hat{\boldsymbol{\theta}}^{\ast} \sim \mathcal{N} \left( \hat{\boldsymbol{\theta}}, \hat{\mathbb{V}} \left( \hat{\boldsymbol{\theta}} \right) \right) . $$ Let \(\mathbf{g} \left( \hat{\boldsymbol{\theta}} \right)\) be a parameter that is a function of the estimated parameters. A sampling distribution of \(\mathbf{g} \left( \hat{\boldsymbol{\theta}} \right)\) , which we refer to as \(\mathbf{g} \left( \hat{\boldsymbol{\theta}}^{\ast} \right)\) , can be generated by using the simulated estimates to calculate \(\mathbf{g}\). The standard deviations of the simulated estimates are the standard errors. Percentiles corresponding to \(100 \left( 1 - \alpha \right) \%\) are the confidence intervals.

References

Bollen, K. A. (1987). Total, direct, and indirect effects in structural equation models. Sociological Methodology, 17, 37. doi:10.2307/271028

Deboeck, P. R., & Preacher, K. J. (2015). No need to be discrete: A method for continuous time mediation analysis. Structural Equation Modeling: A Multidisciplinary Journal, 23 (1), 61–75. doi:10.1080/10705511.2014.973960

Ryan, O., & Hamaker, E. L. (2021). Time to intervene: A continuous-time approach to network analysis and centrality. Psychometrika, 87 (1), 214–252. doi:10.1007/s11336-021-09767-0

Author

Ivan Jacob Agaloos Pesigan

Examples

phi <- matrix(
  data = c(
    -0.357, 0.771, -0.450,
    0.0, -0.511, 0.729,
    0, 0, -0.693
  ),
  nrow = 3
)
colnames(phi) <- rownames(phi) <- c("x", "m", "y")
sigma <- matrix(
  data = c(
    0.24455556, 0.02201587, -0.05004762,
    0.02201587, 0.07067800, 0.01539456,
    -0.05004762, 0.01539456, 0.07553061
  ),
  nrow = 3
)
vcov_theta <- matrix(
  data = c(
    0.00843, 0.00040, -0.00151, -0.00600, -0.00033,
    0.00110, 0.00324, 0.00020, -0.00061, -0.00115,
    0.00011, 0.00015, 0.00001, -0.00002, -0.00001,
    0.00040, 0.00374, 0.00016, -0.00022, -0.00273,
    -0.00016, 0.00009, 0.00150, 0.00012, -0.00010,
    -0.00026, 0.00002, 0.00012, 0.00004, -0.00001,
    -0.00151, 0.00016, 0.00389, 0.00103, -0.00007,
    -0.00283, -0.00050, 0.00000, 0.00156, 0.00021,
    -0.00005, -0.00031, 0.00001, 0.00007, 0.00006,
    -0.00600, -0.00022, 0.00103, 0.00644, 0.00031,
    -0.00119, -0.00374, -0.00021, 0.00070, 0.00064,
    -0.00015, -0.00005, 0.00000, 0.00003, -0.00001,
    -0.00033, -0.00273, -0.00007, 0.00031, 0.00287,
    0.00013, -0.00014, -0.00170, -0.00012, 0.00006,
    0.00014, -0.00001, -0.00015, 0.00000, 0.00001,
    0.00110, -0.00016, -0.00283, -0.00119, 0.00013,
    0.00297, 0.00063, -0.00004, -0.00177, -0.00013,
    0.00005, 0.00017, -0.00002, -0.00008, 0.00001,
    0.00324, 0.00009, -0.00050, -0.00374, -0.00014,
    0.00063, 0.00495, 0.00024, -0.00093, -0.00020,
    0.00006, -0.00010, 0.00000, -0.00001, 0.00004,
    0.00020, 0.00150, 0.00000, -0.00021, -0.00170,
    -0.00004, 0.00024, 0.00214, 0.00012, -0.00002,
    -0.00004, 0.00000, 0.00006, -0.00005, -0.00001,
    -0.00061, 0.00012, 0.00156, 0.00070, -0.00012,
    -0.00177, -0.00093, 0.00012, 0.00223, 0.00004,
    -0.00002, -0.00003, 0.00001, 0.00003, -0.00013,
    -0.00115, -0.00010, 0.00021, 0.00064, 0.00006,
    -0.00013, -0.00020, -0.00002, 0.00004, 0.00057,
    0.00001, -0.00009, 0.00000, 0.00000, 0.00001,
    0.00011, -0.00026, -0.00005, -0.00015, 0.00014,
    0.00005, 0.00006, -0.00004, -0.00002, 0.00001,
    0.00012, 0.00001, 0.00000, -0.00002, 0.00000,
    0.00015, 0.00002, -0.00031, -0.00005, -0.00001,
    0.00017, -0.00010, 0.00000, -0.00003, -0.00009,
    0.00001, 0.00014, 0.00000, 0.00000, -0.00005,
    0.00001, 0.00012, 0.00001, 0.00000, -0.00015,
    -0.00002, 0.00000, 0.00006, 0.00001, 0.00000,
    0.00000, 0.00000, 0.00010, 0.00001, 0.00000,
    -0.00002, 0.00004, 0.00007, 0.00003, 0.00000,
    -0.00008, -0.00001, -0.00005, 0.00003, 0.00000,
    -0.00002, 0.00000, 0.00001, 0.00005, 0.00001,
    -0.00001, -0.00001, 0.00006, -0.00001, 0.00001,
    0.00001, 0.00004, -0.00001, -0.00013, 0.00001,
    0.00000, -0.00005, 0.00000, 0.00001, 0.00012
  ),
  nrow = 15
)

# Specific time interval ----------------------------------------------------
MCMedStd(
  phi = phi,
  sigma = sigma,
  vcov_theta = vcov_theta,
  delta_t = 1,
  from = "x",
  to = "y",
  med = "m",
  R = 100L # use a large value for R in actual research
)
#> 
#> Total, Direct, and Indirect Effects
#> 
#> $`1`
#>          interval     est     se   R    2.5%   97.5%
#> total           1 -0.0936 0.0293 100 -0.1598 -0.0374
#> direct          1 -0.2503 0.0415 100 -0.3291 -0.1738
#> indirect        1  0.1567 0.0223 100  0.1152  0.2091
#> 

# Range of time intervals ---------------------------------------------------
mc <- MCMedStd(
  phi = phi,
  sigma = sigma,
  vcov_theta = vcov_theta,
  delta_t = 1:5,
  from = "x",
  to = "y",
  med = "m",
  R = 100L # use a large value for R in actual research
)
plot(mc)




# Methods -------------------------------------------------------------------
# MCMedStd has a number of methods including
# print, summary, confint, and plot
print(mc)
#> 
#> Total, Direct, and Indirect Effects
#> 
#> $`1`
#>          interval     est     se   R    2.5%   97.5%
#> total           1 -0.0936 0.0308 100 -0.1478 -0.0331
#> direct          1 -0.2503 0.0441 100 -0.3267 -0.1678
#> indirect        1  0.1567 0.0217 100  0.1159  0.1900
#> 
#> $`2`
#>          interval     est     se   R    2.5%   97.5%
#> total           2  0.0748 0.0335 100  0.0168  0.1327
#> direct          2 -0.3003 0.0570 100 -0.3999 -0.2008
#> indirect        2  0.3751 0.0538 100  0.2743  0.4654
#> 
#> $`3`
#>          interval     est     se   R    2.5%   97.5%
#> total           3  0.2347 0.0402 100  0.1531  0.3107
#> direct          3 -0.2728 0.0590 100 -0.3860 -0.1756
#> indirect        3  0.5075 0.0782 100  0.3683  0.6462
#> 
#> $`4`
#>          interval     est     se   R    2.5%   97.5%
#> total           4  0.3228 0.0484 100  0.2308  0.4005
#> direct          4 -0.2222 0.0567 100 -0.3477 -0.1372
#> indirect        4  0.5450 0.0917 100  0.3870  0.7054
#> 
#> $`5`
#>          interval     est     se   R    2.5%   97.5%
#> total           5  0.3456 0.0533 100  0.2481  0.4319
#> direct          5 -0.1711 0.0526 100 -0.2977 -0.0996
#> indirect        5  0.5167 0.0954 100  0.3578  0.6833
#> 
summary(mc)
#>      effect interval         est         se   R        2.5%      97.5%
#> 1     total        1 -0.09362266 0.03082226 100 -0.14783330 -0.0330538
#> 2    direct        1 -0.25030140 0.04408603 100 -0.32667836 -0.1677639
#> 3  indirect        1  0.15667873 0.02168510 100  0.11586127  0.1899904
#> 4     total        2  0.07477656 0.03349774 100  0.01683131  0.1326673
#> 5    direct        2 -0.30032315 0.05698104 100 -0.39994752 -0.2008272
#> 6  indirect        2  0.37509972 0.05376746 100  0.27428767  0.4654007
#> 7     total        3  0.23472850 0.04020028 100  0.15306480  0.3106653
#> 8    direct        3 -0.27275165 0.05897879 100 -0.38604663 -0.1755715
#> 9  indirect        3  0.50748016 0.07824117 100  0.36829610  0.6461697
#> 10    total        4  0.32280682 0.04838026 100  0.23081662  0.4004863
#> 11   direct        4 -0.22216560 0.05673148 100 -0.34771351 -0.1372238
#> 12 indirect        4  0.54497241 0.09174825 100  0.38697162  0.7054019
#> 13    total        5  0.34557261 0.05327086 100  0.24813720  0.4318852
#> 14   direct        5 -0.17111843 0.05255223 100 -0.29771103 -0.0995923
#> 15 indirect        5  0.51669104 0.09538375 100  0.35784777  0.6832664
confint(mc, level = 0.95)
#>      effect interval       2.5 %     97.5 %
#> 1     total        1 -0.14783330 -0.0330538
#> 2    direct        1 -0.32667836 -0.1677639
#> 3  indirect        1  0.11586127  0.1899904
#> 4     total        2  0.01683131  0.1326673
#> 5    direct        2 -0.39994752 -0.2008272
#> 6  indirect        2  0.27428767  0.4654007
#> 7     total        3  0.15306480  0.3106653
#> 8    direct        3 -0.38604663 -0.1755715
#> 9  indirect        3  0.36829610  0.6461697
#> 10    total        4  0.23081662  0.4004863
#> 11   direct        4 -0.34771351 -0.1372238
#> 12 indirect        4  0.38697162  0.7054019
#> 13    total        5  0.24813720  0.4318852
#> 14   direct        5 -0.29771103 -0.0995923
#> 15 indirect        5  0.35784777  0.6832664