manymome.table
Shu Fai Cheung & Sing-Hang Cheung
2024-03-04
Source:vignettes/manymome.table.Rmd
manymome.table.Rmd
Introduction
This article is a brief illustration of how convert some results from
the package manymome (Cheung & Cheung,
2023) to publication-ready tables using the functions from manymome.table.
It assumes readers have used manymome
. This guide will
focus on converting the results using the as_flextable()
method.
Several Indirect Effects
The example from this article will be used, with some modifications.
This is the sample data set from manymome
:
library(manymome)
dat <- data_serial
print(head(dat), digits = 3)
#> x m1 m2 y c1 c2
#> 1 12.12 20.6 9.33 9.00 0.109262 6.01
#> 2 9.81 18.2 9.47 11.56 -0.124014 6.42
#> 3 10.11 20.3 10.05 9.35 4.278608 5.34
#> 4 10.07 19.7 10.17 11.41 1.245356 5.59
#> 5 11.91 20.5 10.05 14.26 -0.000932 5.34
#> 6 9.13 16.5 8.93 10.01 1.802727 5.91
Th following model is fitted in lavaan
:
library(lavaan)
#> This is lavaan 0.6-17
#> lavaan is FREE software! Please report any bugs.
mod_med <- "
m1 ~ x
m2 ~ m1 + x
y ~ m2 + m1 + x
"
fit_med <- sem(model = mod_med,
data = dat,
fixed.x = TRUE)
Use all_indirect_paths()
to identify all indirect
paths:
all_paths <- all_indirect_paths(fit = fit_med,
x = "x",
y = "y")
all_paths
#> Call:
#> all_indirect_paths(fit = fit_med, x = "x", y = "y")
#> Path(s):
#> path
#> 1 x -> m1 -> m2 -> y
#> 2 x -> m1 -> y
#> 3 x -> m2 -> y
Estimate the indirect effects, with bootstrap confidence intervals.
# R set to 100 just for illustration.
# Use 5000 or 10000 and set parallel to TRUE in real research.
out_all <- many_indirect_effects(paths = all_paths,
fit = fit_med,
standardized_x = TRUE,
standardized_y = TRUE,
boot_ci = TRUE,
R = 100,
seed = 12345,
parallel = FALSE,
progress = FALSE)
out_all
#>
#> == Indirect Effect(s) (Both x-variable(s) and y-variable(s) Standardized) ==
#> std CI.lo CI.hi Sig
#> x -> m1 -> m2 -> y 0.119 0.016 0.223 Sig
#> x -> m1 -> y -0.163 -0.307 -0.039 Sig
#> x -> m2 -> y -0.058 -0.208 0.024
#>
#> - [CI.lo to CI.hi] are 95.0% percentile confidence intervals by
#> nonparametric bootstrapping with 100 samples.
#> - std: The standardized indirect effects.
#>
The method as_flextable()
can then be used to convert
the output to a flextable. To use this method, we need to load the
package manymome.table
first.
library(manymome.table)
ft_all <- as_flextable(out_all)
ft_all
Path |
Effect |
Std. Effect |
95% CI |
SE |
|
---|---|---|---|---|---|
x → m1 → m2 → y |
0.25 |
0.12 |
[0.02 |
, 0.22] |
0.05 |
x → m1 → y |
-0.34 |
-0.16 |
[-0.31 |
, -0.04] |
0.07 |
x → m2 → y |
-0.12 |
-0.06 |
[-0.21 |
, 0.02] |
0.05 |
x → .. → y |
-0.21 |
-0.10 |
[-0.29 |
, 0.04] |
0.07 |
Note: CI = confidence interval; paths with '..' are total indirect effects; Std. Effect is completely standardized effect. |
By default, if standardized effects are requested, the unstandardized effects will also be printed when converting to a flextable.
Not demonstrated here due to speed concern, it also supports output with confidence intervals.
See help(as_flextable.indirect_list)
for more
information on the options available in the conversion.
Conditional Indirect Effects
The example from this article will be used, with some modifications.
This is the sample data set from `manymome:
dat <- data_med_mod_ab
print(head(dat), digits = 3)
#> x w1 w2 m y c1 c2
#> 1 9.27 4.97 2.66 3.46 8.80 9.26 3.14
#> 2 10.79 4.13 3.33 4.05 7.37 10.71 5.80
#> 3 11.10 5.91 3.32 4.04 8.24 10.60 5.45
#> 4 9.53 4.78 2.32 3.54 8.37 9.22 3.83
#> 5 10.00 4.38 2.95 4.65 8.39 9.58 4.26
#> 6 12.25 5.81 4.04 4.73 9.65 9.51 4.01
For illustration, OLS regression is used instead of structural equation modeling to fit the model:
m ~ x + w1 + w1x + c1 + c2
#> m ~ x + w1 + w1x + c1 + c2
y ~ m + w2 + w2m + x + c1 + c2
#> y ~ m + w2 + w2m + x + c1 + c2
lm_m <- lm(m ~ x*w1, dat)
lm_y <- lm(y ~ m*w2 + x, dat)
lm_out <- lm2list(lm_m, lm_y)
Compute conditional indirect effects:
# R set to 100 just for illustration.
# Use 5000 or 10000 and set parallel to TRUE in real research.
out_cond <- cond_indirect_effects(wlevels =c("w1", "w2"),
x = "x",
y = "y",
m = "m",
fit = lm_out,
standardized_x = TRUE,
standardized_y = TRUE,
boot_ci = TRUE,
R = 100,
seed = 12345,
parallel = FALSE,
progress = FALSE)
out_cond
#>
#> == Conditional indirect effects ==
#>
#> Path: x -> m -> y
#> Conditional on moderator(s): w1, w2
#> Moderator(s) represented by: w1, w2
#>
#> [w1] [w2] (w1) (w2) std CI.lo CI.hi Sig m~x y~m ind
#> 1 M+1.0SD M+1.0SD 6.173 4.040 0.412 0.110 0.685 Sig 0.599 0.685 0.410
#> 2 M+1.0SD M-1.0SD 6.173 2.055 0.182 -0.021 0.437 0.599 0.302 0.181
#> 3 M-1.0SD M+1.0SD 4.038 4.040 0.119 -0.089 0.393 0.173 0.685 0.118
#> 4 M-1.0SD M-1.0SD 4.038 2.055 0.052 -0.042 0.203 0.173 0.302 0.052
#>
#> - [CI.lo to CI.hi] are 95.0% percentile confidence intervals by
#> nonparametric bootstrapping with 100 samples.
#> - std: The standardized indirect effects.
#> - ind: The unstandardized indirect effects.
#> - 'm~x','y~m' is/are the path coefficient(s) along the path conditional
#> on the moderators.
The method as_flextable()
can then be used to convert
the output to a flextable.
library(manymome.table)
ft_cond <- as_flextable(out_cond)
ft_cond
Path: x → m → y | ||||||||
---|---|---|---|---|---|---|---|---|
[w1] |
[w2] |
(w1) |
(w2) |
Effect |
Std. Effect |
95% CI |
SE |
|
M+1.0SD |
M+1.0SD |
6.17 |
4.04 |
0.41 |
0.41 |
[0.11 |
, 0.68] |
0.15 |
M+1.0SD |
M-1.0SD |
6.17 |
2.06 |
0.18 |
0.18 |
[-0.02 |
, 0.44] |
0.11 |
M-1.0SD |
M+1.0SD |
4.04 |
4.04 |
0.12 |
0.12 |
[-0.09 |
, 0.39] |
0.12 |
M-1.0SD |
M-1.0SD |
4.04 |
2.06 |
0.05 |
0.05 |
[-0.04 |
, 0.20] |
0.07 |
Note: [w] is the meaning of a level of moderator 'w'; (w) is the value of a level of moderator 'w': CI = confidence interval; Std. Effect is completely standardized effect. |
By default, if standardized effects are requested, the unstandardized effects will also be printed when converting to a flextable.
Not demonstrated here due to speed concern, it also supports output with confidence intervals.
See help(as_flextable.cond_indirect_effects)
for more
information on the options available in the conversion.
Other Features
Further Processing by flextable
The output of both methods is a flextable object. Therefore, it can
be further modified by functions for flextable. Load the package
flextable
first to use its functions.
For example:
library(flextable)
ft_cond2 <- ft_cond |>
bold(part = "header") |>
bg(i = c(1, 2), bg = "lightblue", part = "body") |>
bg(i = c(3, 4), bg = "lightgreen", part = "body")
ft_cond2
Path: x → m → y | ||||||||
---|---|---|---|---|---|---|---|---|
[w1] |
[w2] |
(w1) |
(w2) |
Effect |
Std. Effect |
95% CI |
SE |
|
M+1.0SD |
M+1.0SD |
6.17 |
4.04 |
0.41 |
0.41 |
[0.11 |
, 0.68] |
0.15 |
M+1.0SD |
M-1.0SD |
6.17 |
2.06 |
0.18 |
0.18 |
[-0.02 |
, 0.44] |
0.11 |
M-1.0SD |
M+1.0SD |
4.04 |
4.04 |
0.12 |
0.12 |
[-0.09 |
, 0.39] |
0.12 |
M-1.0SD |
M-1.0SD |
4.04 |
2.06 |
0.05 |
0.05 |
[-0.04 |
, 0.20] |
0.07 |
Note: [w] is the meaning of a level of moderator 'w'; (w) is the value of a level of moderator 'w': CI = confidence interval; Std. Effect is completely standardized effect. |
The export functions from flextable
can also be used to
export one or more tables to an external file, such as a Word file:
save_as_docx(ft_cond, "conditional_effects.docx")
Please refer to the documentation of flextable
for
further information.
Other Options
Both as_flextable.indirect_list()
and
as_flextable.cond_indirect_effects()
have options for
customize the generation of the table. For example, if the list of
indirect paths have different predictors (x-variables) and/or different
outcome variables (y-variables), the estimates caN be grouped by x-
and/or y-variables. Please refer to the help pages for further
details.