Type
as a
covariateYear
and Year^2
as covariatesDiscipline
as a covariateCountry
as
a covariateType
and Discipline
as covariatesType
and Country
as covariatesDiscipline
and Country
as covariatesType
, Discipline
, and Country
as
covariatesThe metaSEM
package provides functions for
conducting univariate and multivariate meta-analysis using a structural
equation modeling approach via the OpenMx
package. It also
implemented the two-stage structural equation modeling (TSSEM) approach
to conducting a fixed- and random-effects meta-analytic structural
equation modeling (MASEM) on correlation/covariance matrices.
The metaSEM
package is based on the following
papers:
## Load the library
library(metaSEM)
## Try to use more than one cores
mxOption(NULL, 'Number of Threads', parallel::detectCores()-2)
## Show the first few studies of the data set
head(Becker83)
study di vi percentage items
1 1 -0.33 0.03 25 2
2 2 0.07 0.03 25 2
3 3 -0.30 0.02 50 2
4 4 0.35 0.02 100 38
5 5 0.69 0.07 100 30
6 6 0.81 0.22 100 45
## Random-effects meta-analysis with ML
summary( meta(y=di, v=vi, data=Becker83) )
Call:
meta(y = di, v = vi, data = Becker83)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.174734 0.113378 -0.047482 0.396950 1.5412 0.1233
Tau2_1_1 0.077376 0.054108 -0.028674 0.183426 1.4300 0.1527
Q statistic on the homogeneity of effect sizes: 30.64949
Degrees of freedom of the Q statistic: 9
P value of the Q statistic: 0.0003399239
Heterogeneity indices (based on the estimated Tau2):
Estimate
Intercept1: I2 (Q statistic) 0.6718
Number of studies (or clusters): 10
Number of observed statistics: 10
Number of estimated parameters: 2
Degrees of freedom: 8
-2 log likelihood: 7.928307
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Fixed-effects meta-analysis by fixing the heterogeneity variance at 0
summary( meta(y=di, v=vi, data=Becker83, RE.constraints=0) )
Call:
meta(y = di, v = vi, data = Becker83, RE.constraints = 0)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.100640 0.060510 -0.017957 0.219237 1.6632 0.09627 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 30.64949
Degrees of freedom of the Q statistic: 9
P value of the Q statistic: 0.0003399239
Heterogeneity indices (based on the estimated Tau2):
Estimate
Intercept1: I2 (Q statistic) 0
Number of studies (or clusters): 10
Number of observed statistics: 10
Number of estimated parameters: 1
Degrees of freedom: 9
-2 log likelihood: 17.86043
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Mixed-effects meta-analysis with "log(items)" as the predictor
summary( meta(y=di, v=vi, x=log(items), data=Becker83) )
Call:
meta(y = di, v = vi, x = log(items), data = Becker83)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 -3.2015e-01 1.0981e-01 -5.3539e-01 -1.0492e-01 -2.9154 0.003552
Slope1_1 2.1088e-01 4.5084e-02 1.2251e-01 2.9924e-01 4.6774 2.905e-06
Tau2_1_1 1.0000e-10 2.0095e-02 -3.9386e-02 3.9386e-02 0.0000 1.000000
Intercept1 **
Slope1_1 ***
Tau2_1_1
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 30.64949
Degrees of freedom of the Q statistic: 9
P value of the Q statistic: 0.0003399239
Explained variances (R2):
y1
Tau2 (no predictor) 0.0774
Tau2 (with predictors) 0.0000
R2 1.0000
Number of studies (or clusters): 10
Number of observed statistics: 10
Number of estimated parameters: 3
Degrees of freedom: 7
-2 log likelihood: -4.208024
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Sample data from Tenenbaum and Leaper (2002, Table 1).
Tenenbaum02 <- Tenenbaum02[, c("r", "v", "Offspring_age", "Year_pub")]
## Set seed for reproducibility
set.seed(1234567)
## Let's drop 40% in Offspring_age
missing_per <- 0.4
## MCAR
index <- round(nrow(Tenenbaum02)*missing_per)
index <- rep(c(TRUE, FALSE), times=c(index, nrow(Tenenbaum02)-index))
index <- sample(index)
my.MCAR <- Tenenbaum02
my.MCAR[index, "Offspring_age"] <- NA
my.MCAR$Offspring_age <- scale(my.MCAR$Offspring_age, scale=FALSE)
my.MCAR$Year_pub <- scale(my.MCAR$Year_pub, scale=FALSE)
my.MCAR
r v Offspring_age Year_pub
1 0.12 0.0029084053 NA -4.91666667
2 -0.08 0.0099721309 -48.3448276 3.08333333
3 -0.05 0.0103646484 -72.3448276 -7.91666667
4 -0.08 0.0094022949 -69.3448276 -8.91666667
5 0.15 0.0013089127 209.6551724 -1.91666667
6 0.12 0.0404753067 -60.3448276 0.08333333
7 0.17 0.0052101393 NA 0.08333333
8 0.34 0.0181898456 107.6551724 -3.91666667
9 -0.01 0.0020238867 NA 5.08333333
10 0.33 0.0048124801 NA 10.08333333
11 0.40 0.0147000000 -93.3448276 1.08333333
12 0.30 0.0138016667 -90.3448276 4.08333333
13 0.07 0.0162331805 -57.3448276 13.08333333
14 -0.02 0.0099920016 NA -2.91666667
15 0.19 0.0092910321 -5.3448276 -2.91666667
16 0.15 0.0006964331 23.6551724 11.08333333
17 0.19 0.0032148900 -18.3448276 7.08333333
18 0.02 0.0057097152 -30.3448276 -7.91666667
19 0.47 0.0085492508 NA -6.91666667
20 0.19 0.0046455161 5.6551724 11.08333333
21 0.33 0.0124071752 NA -7.91666667
22 0.06 0.0157589359 -36.3448276 -7.91666667
23 0.05 0.0033166875 NA 2.08333333
24 0.24 0.0024877248 NA 5.08333333
25 0.14 0.0123228738 NA -10.91666667
26 -0.02 0.0285485760 NA 5.08333333
27 0.28 0.0066877682 NA 11.08333333
28 0.14 0.0034825513 35.6551724 9.08333333
29 0.27 0.0245575546 -42.3448276 -3.91666667
30 0.38 0.0140779108 -12.3448276 -10.91666667
31 0.52 0.0212926464 NA -5.91666667
32 0.66 0.0127418944 23.6551724 -5.91666667
33 0.36 0.0303038464 23.6551724 -5.91666667
34 0.21 0.0042698356 11.6551724 10.08333333
35 0.19 0.0042231964 11.6551724 10.08333333
36 0.14 0.0184843108 NA -12.91666667
37 0.36 0.0102377859 95.6551724 -7.91666667
38 0.09 0.0006314927 23.6551724 11.08333333
39 0.16 0.0053946327 NA 13.08333333
40 -0.07 0.0319427100 NA -0.91666667
41 0.36 0.0140295585 89.6551724 -8.91666667
42 0.36 0.0008270700 95.6551724 -4.91666667
43 0.22 0.0238300674 -0.3448276 8.08333333
44 0.04 0.0066899501 -72.3448276 7.08333333
45 0.06 0.0146001906 NA -8.91666667
46 0.41 0.0150447307 NA -3.91666667
47 0.04 0.0140394727 NA -3.91666667
48 0.23 0.0067954425 -48.3448276 2.08333333
## y: effect size
## v: sampling variance
## x: covariate
## av: auxiliary variable
fit <- metaFIML(y=r, v=v, x=Offspring_age, av=Year_pub, data=my.MCAR)
summary(fit)
Call:
metaFIML(y = r, v = v, x = Offspring_age, av = Year_pub, data = my.MCAR)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Tau2_1_1 1.2136e-02 4.5317e-03 3.2543e-03 2.1018e-02 2.6781 0.0074043
CovX1_X1 4.6116e+03 1.2071e+03 2.2456e+03 6.9775e+03 3.8203 0.0001333
CovX2_X1 -6.0799e+01 9.3480e+01 -2.4402e+02 1.2242e+02 -0.6504 0.5154378
CovX2_X2 5.7118e+01 1.1659e+01 3.4267e+01 7.9970e+01 4.8990 9.633e-07
CovX2_Y1 -1.3300e-01 1.6016e-01 -4.4691e-01 1.8090e-01 -0.8304 0.4062874
Slope1_1 6.8319e-04 3.5911e-04 -2.0648e-05 1.3870e-03 1.9025 0.0571103
Intercept1 1.8420e-01 2.1886e-02 1.4130e-01 2.2709e-01 8.4164 < 2.2e-16
MeanX1 7.7304e-02 1.2395e+01 -2.4216e+01 2.4371e+01 0.0062 0.9950239
MeanX2 -3.3781e-08 1.0909e+00 -2.1382e+00 2.1382e+00 0.0000 1.0000000
Tau2_1_1 **
CovX1_X1 ***
CovX2_X1
CovX2_X2 ***
CovX2_Y1
Slope1_1 .
Intercept1 ***
MeanX1
MeanX2
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 179.0075
Degrees of freedom of the Q statistic: 47
P value of the Q statistic: 0
Explained variances (R2):
y1
Tau2 (no predictor) 0.0142
Tau2 (with predictors) 0.0121
R2 0.1474
Number of studies (or clusters): 48
Number of observed statistics: 9
Number of estimated parameters: 9
Degrees of freedom: 0
-2 log likelihood: 613.2553
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Show the data set
Berkey98
trial pub_year no_of_patients PD AL var_PD cov_PD_AL var_AL
1 1 1983 14 0.47 -0.32 0.0075 0.0030 0.0077
2 2 1982 15 0.20 -0.60 0.0057 0.0009 0.0008
3 3 1979 78 0.40 -0.12 0.0021 0.0007 0.0014
4 4 1987 89 0.26 -0.31 0.0029 0.0009 0.0015
5 5 1988 16 0.56 -0.39 0.0148 0.0072 0.0304
## Multivariate meta-analysis with a random-effects model
mult1 <- meta(y=cbind(PD, AL), v=cbind(var_PD, cov_PD_AL, var_AL), data=Berkey98)
summary(mult1)
Call:
meta(y = cbind(PD, AL), v = cbind(var_PD, cov_PD_AL, var_AL),
data = Berkey98)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.3448392 0.0536312 0.2397239 0.4499544 6.4298 1.278e-10 ***
Intercept2 -0.3379381 0.0812479 -0.4971812 -0.1786951 -4.1593 3.192e-05 ***
Tau2_1_1 0.0070020 0.0090497 -0.0107351 0.0247391 0.7737 0.4391
Tau2_2_1 0.0094607 0.0099698 -0.0100797 0.0290010 0.9489 0.3427
Tau2_2_2 0.0261445 0.0177409 -0.0086270 0.0609161 1.4737 0.1406
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 128.2267
Degrees of freedom of the Q statistic: 8
P value of the Q statistic: 0
Heterogeneity indices (based on the estimated Tau2):
Estimate
Intercept1: I2 (Q statistic) 0.6021
Intercept2: I2 (Q statistic) 0.9250
Number of studies (or clusters): 5
Number of observed statistics: 10
Number of estimated parameters: 5
Degrees of freedom: 5
-2 log likelihood: -11.68131
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Plot the effect sizes
plot(mult1)
## Plot the effect sizes with the forest plots
## Load the library for forest plots
library("metafor")
## Create extra panels for the forest plots
plot(mult1, diag.panel=TRUE, main="Multivariate meta-analysis",
axis.label=c("PD", "AL"))
## Forest plot for PD
forest( rma(yi=PD, vi=var_PD, data=Berkey98) )
title("Forest plot of PD")
## Forest plot for AL
forest( rma(yi=AL, vi=var_AL, data=Berkey98) )
title("Forest plot of AL")
## Fixed-effects meta-analysis by fixiing the heterogeneity variance component at
## a 2x2 matrix of 0.
summary( meta(y=cbind(PD, AL), v=cbind(var_PD, cov_PD_AL, var_AL), data=Berkey98,
RE.constraints=matrix(0, nrow=2, ncol=2)) )
Call:
meta(y = cbind(PD, AL), v = cbind(var_PD, cov_PD_AL, var_AL),
data = Berkey98, RE.constraints = matrix(0, nrow = 2, ncol = 2))
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.307219 0.028575 0.251212 0.363225 10.751 < 2.2e-16 ***
Intercept2 -0.394377 0.018649 -0.430929 -0.357825 -21.147 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 128.2267
Degrees of freedom of the Q statistic: 8
P value of the Q statistic: 0
Heterogeneity indices (based on the estimated Tau2):
Estimate
Intercept1: I2 (Q statistic) 0
Intercept2: I2 (Q statistic) 0
Number of studies (or clusters): 5
Number of observed statistics: 10
Number of estimated parameters: 2
Degrees of freedom: 8
-2 log likelihood: 90.88326
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Multivariate meta-analysis with "publication year-1979" as a predictor
summary( meta(y=cbind(PD, AL), v=cbind(var_PD, cov_PD_AL, var_AL), data=Berkey98,
x=scale(pub_year, center=1979)) )
Call:
meta(y = cbind(PD, AL), v = cbind(var_PD, cov_PD_AL, var_AL),
x = scale(pub_year, center = 1979), data = Berkey98)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.3440001 0.0857659 0.1759020 0.5120982 4.0109 6.048e-05 ***
Intercept2 -0.2918175 0.1312797 -0.5491208 -0.0345141 -2.2229 0.02622 *
Slope1_1 0.0063540 0.1078235 -0.2049762 0.2176842 0.0589 0.95301
Slope2_1 -0.0705888 0.1620966 -0.3882922 0.2471147 -0.4355 0.66322
Tau2_1_1 0.0080405 0.0101206 -0.0117955 0.0278766 0.7945 0.42692
Tau2_2_1 0.0093413 0.0105515 -0.0113392 0.0300218 0.8853 0.37599
Tau2_2_2 0.0250135 0.0170788 -0.0084603 0.0584873 1.4646 0.14303
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 128.2267
Degrees of freedom of the Q statistic: 8
P value of the Q statistic: 0
Explained variances (R2):
y1 y2
Tau2 (no predictor) 0.0070020 0.0261
Tau2 (with predictors) 0.0080405 0.0250
R2 0.0000000 0.0433
Number of studies (or clusters): 5
Number of observed statistics: 10
Number of estimated parameters: 7
Degrees of freedom: 3
-2 log likelihood: -12.00859
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
This section illustrates how to conduct three-level meta-analyses
using the metaSEM
package implemented in the R
environment. The metaSEM
package was written to simplify
the procedures to perform a meta-analysis. Most readers may only need to
use the metaSEM
package to conduct the analysis. The next
section shows how to conduct two- and three-level meta-analyses with the
meta()
and meta3L()
functions. The third
section demonstrates more complicated three-level meta-analyses using a
dataset with more predictors. This section shows how to implement
three-level meta-analyses as structural equation models using the
OpenMx
package. It provides detailed steps on how
three-level meta-analyses can be formulated as structural equation
models.
This section also demonstrates the advantages of using the SEM
approach to conduct three-level meta-analyses. These include flexibility
on imposing constraints for model comparisons and construction of
likelihood-based confidence interval (LBCI). I also demonstrate how to
conduct three-level meta-analysis with restricted (or residual) maximum
likelihood (REML) using the reml3L()
function and handling
missing covariates with the full information maximum likelihood (FIML)
using the meta3LFIML()
function. Readers may refer to
Cheung (2015) for the design and implementation of the
metaSEM
package and Cheung (2014) for the theory and issues
on how to formulate three-level meta-analyses as structural equation
models.
Two datasets from published meta-analyses were used in the illustrations. The first dataset was based on Cooper et al. (2003) and Konstantopoulos (2011). Konstantopoulos (2011) selected part of the dataset to illustrate how to conduct a three-level meta-analysis. The second dataset was reported by Bornmann et al. (2007) and Marsh et al. (2009). They conducted a three-level meta-analysis on gender effects in peer reviews of grant proposals.
As an illustration, I first conduct the tradition (two-level)
meta-analysis using the meta()
function. Then I conduct a
three-level meta-analysis using the meta3L()
function. We
may compare the similarities and differences between these two sets of
results.
Before running the analyses, we need to load the metaSEM
library. The datasets are stored in the library. It is always a good
idea to inspect the data before the analyses. We may display the first
few cases of the dataset by using the head()
command.
#### Cooper et al. (2003)
library("metaSEM")
head(Cooper03)
District Study y v Year
1 11 1 -0.18 0.118 1976
2 11 2 -0.22 0.118 1976
3 11 3 0.23 0.144 1976
4 11 4 -0.30 0.144 1976
5 12 5 0.13 0.014 1989
6 12 6 -0.26 0.014 1989
Similar to other R
packages, we may use
summary()
to extract the results after running the
analyses. I first conduct a random-effects meta-analysis and then a
fixed- and mixed-effects meta-analyses.
Tau2_1_1
in
the output) and \(I^2\) were 0.0866 and
0.9459, respectively. This indicates that the between-study effect
explains about 95% of the total variation. The average population effect
(labeled Intercept1
in the output; and its 95% Wald CI) was
0.1280 (0.0428, 0.2132).#### Two-level meta-analysis
## Random-effects model
summary( meta(y=y, v=v, data=Cooper03) )
Call:
meta(y = y, v = v, data = Cooper03)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.128003 0.043472 0.042799 0.213207 2.9445 0.003235 **
Tau2_1_1 0.086537 0.019485 0.048346 0.124728 4.4411 8.949e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 578.864
Degrees of freedom of the Q statistic: 55
P value of the Q statistic: 0
Heterogeneity indices (based on the estimated Tau2):
Estimate
Intercept1: I2 (Q statistic) 0.9459
Number of studies (or clusters): 56
Number of observed statistics: 56
Number of estimated parameters: 2
Degrees of freedom: 54
-2 log likelihood: 33.2919
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
RE.constraints
argument (random-effects constraints). The
estimated common effect (and its 95% Wald CI) was 0.0464 (0.0284,
0.0644).## Fixed-effects model
summary( meta(y=y, v=v, data=Cooper03, RE.constraints=0) )
Call:
meta(y = y, v = v, data = Cooper03, RE.constraints = 0)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.0464072 0.0091897 0.0283957 0.0644186 5.0499 4.42e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 578.864
Degrees of freedom of the Q statistic: 55
P value of the Q statistic: 0
Heterogeneity indices (based on the estimated Tau2):
Estimate
Intercept1: I2 (Q statistic) 0
Number of studies (or clusters): 56
Number of observed statistics: 56
Number of estimated parameters: 1
Degrees of freedom: 55
-2 log likelihood: 434.2075
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Year
was used as a covariate. It is
easier to interpret the intercept by centering the Year
with scale(Year, scale=FALSE)
. The scale=FALSE
argument means that it is centered, but not standardized. The estimated
regression coefficient (labeled Slope1_1
in the output; and
its 95% Wald CI) was 0.0051 (-0.0033, 0.0136) which is not significant
at \(\alpha=.05\). The \(R^2\) is 0.0164.## Mixed-effects model
summary( meta(y=y, v=v, x=scale(Year, scale=FALSE), data=Cooper03) )
Call:
meta(y = y, v = v, x = scale(Year, scale = FALSE), data = Cooper03)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.1259126 0.0432028 0.0412367 0.2105884 2.9145 0.003563 **
Slope1_1 0.0051307 0.0043248 -0.0033457 0.0136071 1.1864 0.235483
Tau2_1_1 0.0851153 0.0190462 0.0477856 0.1224451 4.4689 7.862e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 578.864
Degrees of freedom of the Q statistic: 55
P value of the Q statistic: 0
Explained variances (R2):
y1
Tau2 (no predictor) 0.0865
Tau2 (with predictors) 0.0851
R2 0.0164
Number of studies (or clusters): 56
Number of observed statistics: 56
Number of estimated parameters: 3
Degrees of freedom: 53
-2 log likelihood: 31.88635
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Tau2_2
in the output) and at level 3 \(\tau^2_{(3)}\) (labeled Tau2_3
in the output) were 0.0329 and 0.0577, respectively. The level 2 \(I^2_{(2)}\) (labeled I2_2
in
the output) and the level 3 \(I^2_{(3)}\) (labeled I2_3
in
the output) were 0.3440 and 0.6043, respectively. Schools (level 2) and
districts (level 3) explain about 34% and 60% of the total variation,
respectively. The average population effect (and its 95% Wald CI) was
0.1845 (0.0266, 0.3423).#### Three-level meta-analysis
## Random-effects model
summary( meta3L(y=y, v=v, cluster=District, data=Cooper03) )
Call:
meta3L(y = y, v = v, cluster = District, data = Cooper03)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 0.1844554 0.0805411 0.0265977 0.3423131 2.2902 0.022010 *
Tau2_2 0.0328648 0.0111397 0.0110314 0.0546982 2.9502 0.003175 **
Tau2_3 0.0577384 0.0307423 -0.0025154 0.1179921 1.8781 0.060362 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 578.864
Degrees of freedom of the Q statistic: 55
P value of the Q statistic: 0
Heterogeneity indices (based on the estimated Tau2):
Estimate
I2_2 (Typical v: Q statistic) 0.3440
I2_3 (Typical v: Q statistic) 0.6043
Number of studies (or clusters): 11
Number of observed statistics: 56
Number of estimated parameters: 3
Degrees of freedom: 53
-2 log likelihood: 16.78987
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Year
was used as a covariate. The
estimated regression coefficient (labeled Slope_1
in the
output; and its 95% Wald CI) was 0.0051 (-0.0116, 0.0218) which is not
significant at \(\alpha=.05\). The
estimated level 2 \(R^2_{(2)}\) and
level 3 \(R^2_{(3)}\) were 0.0000 and
0.0221, respectively.## Mixed-effects model
summary( meta3L(y=y, v=v, cluster=District, x=scale(Year, scale=FALSE),
data=Cooper03) )
Call:
meta3L(y = y, v = v, cluster = District, x = scale(Year, scale = FALSE),
data = Cooper03)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 0.1780268 0.0805219 0.0202067 0.3358469 2.2109 0.027042 *
Slope_1 0.0050737 0.0085266 -0.0116382 0.0217856 0.5950 0.551814
Tau2_2 0.0329390 0.0111620 0.0110618 0.0548162 2.9510 0.003168 **
Tau2_3 0.0564628 0.0300330 -0.0024007 0.1153264 1.8800 0.060104 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 578.864
Degrees of freedom of the Q statistic: 55
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.032865 0.0577
Tau2 (with predictors) 0.032939 0.0565
R2 0.000000 0.0221
Number of studies (or clusters): 11
Number of observed statistics: 56
Number of estimated parameters: 4
Degrees of freedom: 52
-2 log likelihood: 16.43629
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Model comparisons Many research hypotheses involve model
comparisons among nested models. anova()
, a generic
function for comparing nested models, may be used to conduct a
likelihood ratio test which is also known as a chi-square difference
test.
Testing \(H_0: \tau^2_{(3)} = 0\)
## Model comparisons
model2 <- meta(y=y, v=v, data=Cooper03, model.name="2 level model", silent=TRUE)
#### An equivalent model by fixing tau2 at level 3=0 in meta3L()
## model2 <- meta3L(y=y, v=v, cluster=District, data=Cooper03,
## model.name="2 level model", RE3.constraints=0)
model3 <- meta3L(y=y, v=v, cluster=District, data=Cooper03,
model.name="3 level model", silent=TRUE)
anova(model3, model2)
base comparison ep minus2LL df AIC diffLL diffdf
1 3 level model <NA> 3 16.78987 53 22.78987 NA NA
2 3 level model 2 level model 2 33.29190 54 37.29190 16.50203 1
p
1 NA
2 4.859793e-05
meta3L()
. For example, Eq_tau2
is used as the label in RE2.constraints
and
RE3.constraints
meaning that both the level 2 and level 3
random effects heterogeneity variances are constrained equally. The
value of 0.1
was used as the starting value in the
constraints.## Testing \tau^2_2 = \tau^2_3
modelEqTau2 <- meta3L(y=y, v=v, cluster=District, data=Cooper03,
model.name="Equal tau2 at both levels",
RE2.constraints="0.1*Eq_tau2", RE3.constraints="0.1*Eq_tau2")
anova(model3, modelEqTau2)
base comparison ep minus2LL df AIC diffLL
1 3 level model <NA> 3 16.78987 53 22.78987 NA
2 3 level model Equal tau2 at both levels 2 17.47697 54 21.47697 0.6870959
diffdf p
1 NA NA
2 1 0.4071539
LB
in the
intervals.type
argument.## LBCI for random-effects model
summary( meta3L(y=y, v=v, cluster=District, data=Cooper03,
I2=c("I2q", "ICC"), intervals.type="LB") )
Call:
meta3L(y = y, v = v, cluster = District, data = Cooper03, intervals.type = "LB",
I2 = c("I2q", "ICC"))
95% confidence intervals: Likelihood-based statistic
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 0.184455 NA 0.011605 0.358269 NA NA
Tau2_2 0.032865 NA 0.016298 0.063113 NA NA
Tau2_3 0.057738 NA 0.019780 0.177329 NA NA
Q statistic on the homogeneity of effect sizes: 578.864
Degrees of freedom of the Q statistic: 55
P value of the Q statistic: 0
Heterogeneity indices (I2) and their 95% likelihood-based CIs:
lbound Estimate ubound
I2_2 (Typical v: Q statistic) 0.12739 0.34396 0.6568
ICC_2 (tau^2/(tau^2+tau^3)) 0.13116 0.36273 0.7006
I2_3 (Typical v: Q statistic) 0.27835 0.60429 0.8452
ICC_3 (tau^3/(tau^2+tau^3)) 0.29938 0.63727 0.8688
Number of studies (or clusters): 11
Number of observed statistics: 56
Number of estimated parameters: 3
Degrees of freedom: 53
-2 log likelihood: 16.78987
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## LBCI for mixed-effects model
summary( meta3L(y=y, v=v, cluster=District, x=scale(Year, scale=FALSE),
data=Cooper03, intervals.type="LB") )
Call:
meta3L(y = y, v = v, cluster = District, x = scale(Year, scale = FALSE),
data = Cooper03, intervals.type = "LB")
95% confidence intervals: Likelihood-based statistic
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 0.1780268 NA 0.0047821 0.3513321 NA NA
Slope_1 0.0050737 NA -0.0128999 0.0238841 NA NA
Tau2_2 0.0329390 NA 0.0163205 0.0634266 NA NA
Tau2_3 0.0564628 NA 0.0192097 0.1204622 NA NA
Q statistic on the homogeneity of effect sizes: 578.864
Degrees of freedom of the Q statistic: 55
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.032865 0.0577
Tau2 (with predictors) 0.032939 0.0565
R2 0.000000 0.0221
Number of studies (or clusters): 11
Number of observed statistics: 56
Number of estimated parameters: 4
Degrees of freedom: 52
-2 log likelihood: 16.43629
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## REML
summary( reml1 <- reml3L(y=y, v=v, cluster=District, data=Cooper03) )
Call:
reml3L(y = y, v = v, cluster = District, data = Cooper03)
95% confidence intervals: z statistic approximation
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Tau2_2 0.0327365 0.0110922 0.0109963 0.0544768 2.9513 0.003164 **
Tau2_3 0.0650619 0.0355102 -0.0045368 0.1346607 1.8322 0.066921 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Number of studies (or clusters): 56
Number of observed statistics: 55
Number of estimated parameters: 2
Degrees of freedom: 53
-2 log likelihood: -81.14044
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
summary( reml0 <- reml3L(y=y, v=v, cluster=District, data=Cooper03,
RE.equal=TRUE, model.name="Equal Tau2") )
Call:
reml3L(y = y, v = v, cluster = District, data = Cooper03, RE.equal = TRUE,
model.name = "Equal Tau2")
95% confidence intervals: z statistic approximation
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Tau2 0.040418 0.010290 0.020249 0.060587 3.9277 8.576e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Number of studies (or clusters): 56
Number of observed statistics: 55
Number of estimated parameters: 1
Degrees of freedom: 54
-2 log likelihood: -80.1371
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
anova(reml1, reml0)
base comparison ep minus2LL df AIC diffLL
1 Variance component with REML <NA> 2 -81.14044 -2 -77.14044 NA
2 Variance component with REML Equal Tau2 1 -80.13710 -1 -78.13710 1.003336
diffdf p
1 NA NA
2 1 0.3165046
summary( reml3L(y=y, v=v, cluster=District, x=scale(Year, scale=FALSE),
data=Cooper03) )
Call:
reml3L(y = y, v = v, cluster = District, x = scale(Year, scale = FALSE),
data = Cooper03)
95% confidence intervals: z statistic approximation
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Tau2_2 0.0326502 0.0110529 0.0109870 0.0543134 2.9540 0.003137 **
Tau2_3 0.0722656 0.0405349 -0.0071813 0.1517125 1.7828 0.074619 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Number of studies (or clusters): 56
Number of observed statistics: 54
Number of estimated parameters: 2
Degrees of freedom: 52
-2 log likelihood: -72.09405
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
This section replicates the findings in Table 3 of Marsh et al. (2009). Several additional analyses on model comparisons were conducted. Missing data were artificially introduced to illustrate how missing data might be handled with FIML.
The effect size and its sampling variance are logOR
(log
of the odds ratio) and v
, respectively.
Cluster
is the variable representing the cluster effect,
whereas the potential covariates are Year
(year of
publication), Type
(Grants
vs. Fellowship
), Discipline
(Physical sciences
, Life sciences/biology
,
Social sciences/humanities
and
Multidisciplinary
) and Country
(United States
, Canada
,
Australia
, United Kingdom
and
Europe
).
#### Bornmann et al. (2007)
head(Bornmann07)
Id Study Cluster logOR v Year Type
1 1 Ackers (2000a; Marie Curie) 1 -0.40108 0.01391692 1996 Fellowship
2 2 Ackers (2000b; Marie Curie) 1 -0.05727 0.03428793 1996 Fellowship
3 3 Ackers (2000c; Marie Curie) 1 -0.29852 0.03391122 1996 Fellowship
4 4 Ackers (2000d; Marie Curie) 1 0.36094 0.03404025 1996 Fellowship
5 5 Ackers (2000e; Marie Curie) 1 -0.33336 0.01282103 1996 Fellowship
6 6 Ackers (2000f; Marie Curie) 1 -0.07173 0.01361189 1996 Fellowship
Discipline Country
1 Physical sciences Europe
2 Physical sciences Europe
3 Physical sciences Europe
4 Physical sciences Europe
5 Social sciences/humanities Europe
6 Physical sciences Europe
The Q statistic was 221.2809 (df = 65), p < .001. The estimated average effect (and its 95% Wald CI) was -0.1008 (-0.1794, -0.0221). The \(\hat{\tau}^2_{(2)}\) and \(\hat{\tau}^3_{(3)}\) were 0.0038 and 0.0141, respectively. The \(I^2_{(2)}\) and \(I^2_{(3)}\) were 0.1568 and 0.5839, respectively.
## Model 0: Intercept
summary( Model0 <- meta3L(y=logOR, v=v, cluster=Cluster, data=Bornmann07,
model.name="3 level model") )
Call:
meta3L(y = logOR, v = v, cluster = Cluster, data = Bornmann07,
model.name = "3 level model")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept -0.1007784 0.0401327 -0.1794371 -0.0221198 -2.5111 0.01203 *
Tau2_2 0.0037965 0.0027210 -0.0015367 0.0091297 1.3952 0.16295
Tau2_3 0.0141352 0.0091445 -0.0037877 0.0320580 1.5458 0.12216
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Heterogeneity indices (based on the estimated Tau2):
Estimate
I2_2 (Typical v: Q statistic) 0.1568
I2_3 (Typical v: Q statistic) 0.5839
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 3
Degrees of freedom: 63
-2 log likelihood: 25.80256
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Testing tau^2_3 = 0
Model0a <- meta3L(logOR, v, cluster=Cluster, data=Bornmann07,
RE3.constraints=0, model.name="2 level model")
anova(Model0, Model0a)
base comparison ep minus2LL df AIC diffLL diffdf
1 3 level model <NA> 3 25.80256 63 31.80256 NA NA
2 3 level model 2 level model 2 36.02279 64 40.02279 10.22024 1
p
1 NA
2 0.001389081
## Testing tau^2_2 = tau^2_3
Model0b <- meta3L(logOR, v, cluster=Cluster, data=Bornmann07,
RE2.constraints="0.1*Eq_tau2", RE3.constraints="0.1*Eq_tau2",
model.name="tau2_2 equals tau2_3")
anova(Model0, Model0b)
base comparison ep minus2LL df AIC diffLL diffdf
1 3 level model <NA> 3 25.80256 63 31.80256 NA NA
2 3 level model tau2_2 equals tau2_3 2 27.16166 64 31.16166 1.359103 1
p
1 NA
2 0.243693
Type
as a covariateGrants
) is used as the
reference group. The estimated intercept (labeled Intercept
in the output) represents the estimated effect size for
Grants
and the regression coefficient (labeled
Slope_1
in the output) is the difference between
Fellowship
and Grants
.
Type
(and its 95% Wald CI) was
-0.1956 (-0.3018, -0.0894) which is statistically significant at \(\alpha=.05\). This is the difference
between Fellowship
and Grants
. The \(R^2_{(2)}\) and \(R^2_{(3)}\) were 0.0693 and 0.7943,
respectively.## Model 1: Type as a covariate
## Convert characters into a dummy variable
## Type2=0 (Grants); Type2=1 (Fellowship)
Type2 <- ifelse(Bornmann07$Type=="Fellowship", yes=1, no=0)
summary( Model1 <- meta3L(logOR, v, x=Type2, cluster=Cluster, data=Bornmann07))
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = Type2, data = Bornmann07)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept -0.0066071 0.0371125 -0.0793462 0.0661320 -0.1780 0.8587001
Slope_1 -0.1955869 0.0541649 -0.3017483 -0.0894256 -3.6110 0.0003051 ***
Tau2_2 0.0035335 0.0024306 -0.0012303 0.0082974 1.4538 0.1460058
Tau2_3 0.0029079 0.0031183 -0.0032039 0.0090197 0.9325 0.3510704
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0035335 0.0029
R2 0.0692595 0.7943
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 4
Degrees of freedom: 62
-2 log likelihood: 17.62569
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Grants
and Fellowship
as indicator variables
Grants
and
Fellowship
, we may create two indicator variables to
represent them. Since we cannot estimate the intercept and these
coefficients at the same time, we need to fix the intercept at 0 by
specifying the intercept.constraints=0
argument in
meta3L()
. We are now able to include both
Grants
and Fellowship
in the analysis. The
estimated effects (and their 95% CIs) for Grants
and
Fellowship
were -0.0066 (-0.0793, 0.0661) and -0.2022
(-0.2805, -0.1239), respectively.## Alternative model: Grants and Fellowship as indicators
## Indicator variables
Grant <- ifelse(Bornmann07$Type=="Grant", yes=1, no=0)
Fellowship <- ifelse(Bornmann07$Type=="Fellowship", yes=1, no=0)
Model1b <- meta3L(logOR, v, x=cbind(Grant, Fellowship),
cluster=Cluster, data=Bornmann07,
intercept.constraints=0, model.name="Model 1")
summary(Model1b)
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(Grant,
Fellowship), data = Bornmann07, intercept.constraints = 0,
model.name = "Model 1")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Slope_1 -0.0066071 0.0371125 -0.0793462 0.0661320 -0.1780 0.8587
Slope_2 -0.2021940 0.0399473 -0.2804893 -0.1238987 -5.0615 4.159e-07 ***
Tau2_2 0.0035335 0.0024306 -0.0012303 0.0082974 1.4538 0.1460
Tau2_3 0.0029079 0.0031183 -0.0032039 0.0090197 0.9325 0.3511
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0035335 0.0029
R2 0.0692595 0.7943
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 4
Degrees of freedom: 62
-2 log likelihood: 17.62569
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Year
and Year^2
as
covariatescbind()
command. For example,
cbind(Year, Year^2)
includes both Year
and its
squared as covariates. In the output, Slope_1
and
Slope_2
refer to the regression coefficients for
Year
and Year^2
, respectively. To increase the
numerical stability, the covariates are usually centered before creating
the quadratic terms. Since Marsh et al. (2009) standardized
Year
in their analysis, I follow this practice here.Year
and Year^2
were -0.0010 (-0.0473, 0.0454)
and -0.0118 (-0.0247, 0.0012), respectively. The \(R^2_{(2)}\) and \(R^2_{(3)}\) were 0.2430 and 0.0000,
respectively.## Model 2: Year and Year^2 as covariates
summary( Model2 <- meta3L(logOR, v, x=cbind(scale(Year), scale(Year)^2),
cluster=Cluster, data=Bornmann07,
model.name="Model 2") )
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(scale(Year),
scale(Year)^2), data = Bornmann07, model.name = "Model 2")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept -0.08627312 0.04125581 -0.16713302 -0.00541322 -2.0912 0.03651 *
Slope_1 -0.00095287 0.02365224 -0.04731040 0.04540466 -0.0403 0.96786
Slope_2 -0.01176840 0.00659995 -0.02470407 0.00116727 -1.7831 0.07457 .
Tau2_2 0.00287389 0.00206817 -0.00117965 0.00692744 1.3896 0.16466
Tau2_3 0.01479446 0.00926095 -0.00335666 0.03294558 1.5975 0.11015
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0028739 0.0148
R2 0.2430134 0.0000
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 5
Degrees of freedom: 61
-2 log likelihood: 22.3836
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
## Testing beta_{Year} = beta_{Year^2}=0
anova(Model2, Model0)
base comparison ep minus2LL df AIC diffLL diffdf p
1 Model 2 <NA> 5 22.38360 61 32.38360 NA NA NA
2 Model 2 3 level model 3 25.80256 63 31.80256 3.418955 2 0.1809603
Discipline
as a covariateDiscipline
.
multidisciplinary
is used as the reference group in the
analysis.DisciplinePhy
, DisciplineLife
and
DisciplineSoc
were -0.0091 (-0.2041, 0.1859), -0.1262
(-0.2804, 0.0280) and -0.2370 (-0.4746, 0.0007), respectively. The \(R^2_2\) and \(R^2_3\) were 0.0000 and 0.4975,
respectively.## Model 3: Discipline as a covariate
## Create dummy variables using multidisciplinary as the reference group
DisciplinePhy <- ifelse(Bornmann07$Discipline=="Physical sciences", yes=1, no=0)
DisciplineLife <- ifelse(Bornmann07$Discipline=="Life sciences/biology", yes=1, no=0)
DisciplineSoc <- ifelse(Bornmann07$Discipline=="Social sciences/humanities", yes=1, no=0)
summary( Model3 <- meta3L(logOR, v, x=cbind(DisciplinePhy, DisciplineLife, DisciplineSoc),
cluster=Cluster, data=Bornmann07,
model.name="Model 3") )
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(DisciplinePhy,
DisciplineLife, DisciplineSoc), data = Bornmann07, model.name = "Model 3")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept -0.01474783 0.06389945 -0.13998845 0.11049279 -0.2308 0.81747
Slope_1 -0.00913064 0.09949198 -0.20413134 0.18587005 -0.0918 0.92688
Slope_2 -0.12617957 0.07866274 -0.28035571 0.02799656 -1.6041 0.10870
Slope_3 -0.23695698 0.12123091 -0.47456520 0.00065124 -1.9546 0.05063 .
Tau2_2 0.00390942 0.00283949 -0.00165587 0.00947471 1.3768 0.16857
Tau2_3 0.00710338 0.00643210 -0.00550331 0.01971006 1.1044 0.26944
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0039094 0.0071
R2 0.0000000 0.4975
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 6
Degrees of freedom: 60
-2 log likelihood: 20.07571
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Discipline
is significant
## Testing whether Discipline is significant
anova(Model3, Model0)
base comparison ep minus2LL df AIC diffLL diffdf p
1 Model 3 <NA> 6 20.07571 60 32.07571 NA NA NA
2 Model 3 3 level model 3 25.80256 63 31.80256 5.726842 3 0.1256832
Country
as a covariateCountry
. The
United States
is used as the reference group in the
analysis.CountryAus
, CountryCan
,
CountryEur
, and CountryUK
are -0.0240
(-0.2405, 0.1924), -0.1341 (-0.3674, 0.0993), -0.2211 (-0.3660, -0.0762)
and 0.0537 (-0.1413, 0.2487), respectively. The \(R^2_2\) and \(R^2_3\) were 0.1209 and 0.6606,
respectively.## Model 4: Country as a covariate
## Create dummy variables using the United States as the reference group
CountryAus <- ifelse(Bornmann07$Country=="Australia", yes=1, no=0)
CountryCan <- ifelse(Bornmann07$Country=="Canada", yes=1, no=0)
CountryEur <- ifelse(Bornmann07$Country=="Europe", yes=1, no=0)
CountryUK <- ifelse(Bornmann07$Country=="United Kingdom", yes=1, no=0)
summary( Model4 <- meta3L(logOR, v, x=cbind(CountryAus, CountryCan, CountryEur,
CountryUK), cluster=Cluster, data=Bornmann07,
model.name="Model 4") )
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(CountryAus,
CountryCan, CountryEur, CountryUK), data = Bornmann07, model.name = "Model 4")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 0.0025681 0.0597768 -0.1145923 0.1197285 0.0430 0.965732
Slope_1 -0.0240109 0.1104328 -0.2404552 0.1924333 -0.2174 0.827876
Slope_2 -0.1340800 0.1190667 -0.3674465 0.0992865 -1.1261 0.260127
Slope_3 -0.2210801 0.0739174 -0.3659556 -0.0762046 -2.9909 0.002782 **
Slope_4 0.0537251 0.0994803 -0.1412527 0.2487030 0.5401 0.589157
Tau2_2 0.0033376 0.0023492 -0.0012667 0.0079420 1.4208 0.155383
Tau2_3 0.0047979 0.0044818 -0.0039862 0.0135820 1.0705 0.284379
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0033376 0.0048
R2 0.1208598 0.6606
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 7
Degrees of freedom: 59
-2 log likelihood: 14.18259
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Discipline
is significant
## Testing whether Discipline is significant
anova(Model4, Model0)
base comparison ep minus2LL df AIC diffLL diffdf p
1 Model 4 <NA> 7 14.18259 59 28.18259 NA NA NA
2 Model 4 3 level model 3 25.80256 63 31.80256 11.61996 4 0.02041284
Type
and Discipline
as
covariates## Model 5: Type and Discipline as covariates
Model5 <- meta3L(logOR, v, x=cbind(Type2, DisciplinePhy, DisciplineLife,
DisciplineSoc), cluster=Cluster, data=Bornmann07,
model.name="Model 5")
## Rerun to remove error code
Model5 <- rerun(Model5)
summary(Model5)
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(Type2,
DisciplinePhy, DisciplineLife, DisciplineSoc), data = Bornmann07,
model.name = "Model 5")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 6.7036e-02 1.8553e-02 3.0672e-02 1.0340e-01 3.6132 0.0003025 ***
Slope_1 -1.9004e-01 4.0234e-02 -2.6890e-01 -1.1118e-01 -4.7233 2.32e-06 ***
Slope_2 1.9511e-02 6.5942e-02 -1.0973e-01 1.4875e-01 0.2959 0.7673209
Slope_3 -1.2779e-01 3.5914e-02 -1.9818e-01 -5.7400e-02 -3.5582 0.0003734 ***
Slope_4 -2.3950e-01 9.4054e-02 -4.2384e-01 -5.5154e-02 -2.5464 0.0108849 *
Tau2_2 2.3062e-03 1.4270e-03 -4.9059e-04 5.1030e-03 1.6162 0.1060586
Tau2_3 1.0000e-10 NA NA NA NA NA
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0023062 0.0000
R2 0.3925434 1.0000
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 7
Degrees of freedom: 59
-2 log likelihood: 4.66727
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Discipline
is significant after
controlling for Type
Discipline
is still
significant after controlling for Type
.## Testing whether Discipline is significant after controlling for Type
anova(Model5, Model1)
base comparison ep minus2LL df AIC diffLL diffdf
1 Model 5 <NA> 7 4.66727 59 18.66727 NA NA
2 Model 5 Meta analysis with ML 4 17.62569 62 25.62569 12.95842 3
p
1 NA
2 0.004727388
Type
and Country
as
covariates## Model 6: Type and Country as covariates
Model6 <- meta3L(logOR, v, x=cbind(Type2, CountryAus, CountryCan,
CountryEur, CountryUK), cluster=Cluster, data=Bornmann07,
model.name="Model 6")
## Rerun to remove error code
Model6 <- rerun(Model6)
summary(Model6)
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(Type2,
CountryAus, CountryCan, CountryEur, CountryUK), data = Bornmann07,
model.name = "Model 6")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 6.7507e-02 1.8933e-02 3.0399e-02 1.0461e-01 3.5656 0.0003631 ***
Slope_1 -1.5167e-01 4.1113e-02 -2.3225e-01 -7.1092e-02 -3.6892 0.0002250 ***
Slope_2 -6.9580e-02 8.5164e-02 -2.3650e-01 9.7339e-02 -0.8170 0.4139267
Slope_3 -1.4231e-01 7.5204e-02 -2.8970e-01 5.0878e-03 -1.8923 0.0584497 .
Slope_4 -1.6116e-01 4.0203e-02 -2.3995e-01 -8.2361e-02 -4.0086 6.108e-05 ***
Slope_5 9.0419e-03 7.0074e-02 -1.2830e-01 1.4639e-01 0.1290 0.8973315
Tau2_2 2.2976e-03 1.4407e-03 -5.2618e-04 5.1213e-03 1.5947 0.1107693
Tau2_3 1.0000e-10 NA NA NA NA NA
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0022976 0.0000
R2 0.3948192 1.0000
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 8
Degrees of freedom: 58
-2 log likelihood: 5.076592
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Country
is significant after
controlling for Type
Country
is significant after controlling for
Type
.## Testing whether Country is significant after controlling for Type
anova(Model6, Model1)
base comparison ep minus2LL df AIC diffLL diffdf
1 Model 6 <NA> 8 5.076592 58 21.07659 NA NA
2 Model 6 Meta analysis with ML 4 17.625692 62 25.62569 12.5491 4
p
1 NA
2 0.01370262
Discipline
and Country
as
covariates## Model 7: Discipline and Country as covariates
summary( meta3L(logOR, v, x=cbind(DisciplinePhy, DisciplineLife, DisciplineSoc,
CountryAus, CountryCan, CountryEur, CountryUK),
cluster=Cluster, data=Bornmann07,
model.name="Model 7") )
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(DisciplinePhy,
DisciplineLife, DisciplineSoc, CountryAus, CountryCan, CountryEur,
CountryUK), data = Bornmann07, model.name = "Model 7")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 0.0029305 0.0576743 -0.1101090 0.1159700 0.0508 0.95948
Slope_1 0.1742169 0.1702554 -0.1594776 0.5079114 1.0233 0.30618
Slope_2 0.0826806 0.1599802 -0.2308749 0.3962361 0.5168 0.60528
Slope_3 -0.0462265 0.1715774 -0.3825119 0.2900590 -0.2694 0.78761
Slope_4 -0.0486321 0.1306918 -0.3047835 0.2075192 -0.3721 0.70981
Slope_5 -0.2169132 0.1915703 -0.5923842 0.1585577 -1.1323 0.25751
Slope_6 -0.3036578 0.1670721 -0.6311130 0.0237975 -1.8175 0.06914 .
Slope_7 -0.0605272 0.1809419 -0.4151669 0.2941125 -0.3345 0.73799
Tau2_2 0.0032661 0.0022784 -0.0011994 0.0077317 1.4335 0.15171
Tau2_3 0.0040618 0.0038459 -0.0034759 0.0115996 1.0562 0.29090
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0032661 0.0041
R2 0.1396974 0.7126
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 10
Degrees of freedom: 56
-2 log likelihood: 10.31105
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Type
, Discipline
, and
Country
as covariates## Model 8: Type, Discipline and Country as covariates
Model8 <- meta3L(logOR, v, x=cbind(Type2, DisciplinePhy, DisciplineLife, DisciplineSoc,
CountryAus, CountryCan, CountryEur, CountryUK),
cluster=Cluster, data=Bornmann07,
model.name="Model 8")
## There was an estimation error. The model was rerun again.
summary(rerun(Model8))
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = cbind(Type2,
DisciplinePhy, DisciplineLife, DisciplineSoc, CountryAus,
CountryCan, CountryEur, CountryUK), data = Bornmann07, model.name = "Model 8")
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 6.8563e-02 1.8630e-02 3.2049e-02 1.0508e-01 3.6802 0.000233 ***
Slope_1 -1.6885e-01 4.1545e-02 -2.5028e-01 -8.7425e-02 -4.0643 4.818e-05 ***
Slope_2 2.5329e-01 1.5814e-01 -5.6670e-02 5.6324e-01 1.6016 0.109239
Slope_3 1.2689e-01 1.4774e-01 -1.6268e-01 4.1646e-01 0.8589 0.390410
Slope_4 -8.3549e-03 1.5796e-01 -3.1795e-01 3.0124e-01 -0.0529 0.957818
Slope_5 -1.1530e-01 1.1146e-01 -3.3377e-01 1.0317e-01 -1.0344 0.300948
Slope_6 -2.6412e-01 1.6402e-01 -5.8559e-01 5.7344e-02 -1.6103 0.107323
Slope_7 -2.9029e-01 1.4859e-01 -5.8152e-01 9.5194e-04 -1.9536 0.050754 .
Slope_8 -1.5975e-01 1.6285e-01 -4.7893e-01 1.5943e-01 -0.9810 0.326609
Tau2_2 2.1010e-03 1.2925e-03 -4.3226e-04 4.6342e-03 1.6255 0.104051
Tau2_3 1.0000e-10 NA NA NA NA NA
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 221.2809
Degrees of freedom of the Q statistic: 65
P value of the Q statistic: 0
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0021010 0.0000
R2 0.4466073 1.0000
Number of studies (or clusters): 21
Number of observed statistics: 66
Number of estimated parameters: 11
Degrees of freedom: 55
-2 log likelihood: -1.645211
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
When there are missing data in the covariates, data with missing
values are excluded from the analysis in meta3()
. The
missing covariates can be handled by the use of FIML in
meta3LFIML()
. We illustrate two examples on how to analyze
data with missing covariates with missing completely at random (MCAR)
and missing at random (MAR) data.
Type
was introduced
by the MCAR mechanism.#### Handling missing covariates with FIML
## MCAR
## Set seed for replication
set.seed(1000000)
## Copy Bornmann07 to my.df
my.df <- Bornmann07
## "Fellowship": 1; "Grant": 0
my.df$Type_MCAR <- ifelse(Bornmann07$Type=="Fellowship", yes=1, no=0)
## Create 17 out of 66 missingness with MCAR
my.df$Type_MCAR[sample(1:66, 17)] <- NA
summary( meta3L(y=logOR, v=v, cluster=Cluster, x=Type_MCAR, data=my.df) )
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = Type_MCAR, data = my.df)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept 0.0044909 0.0362672 -0.0665916 0.0755733 0.1238 0.9015
Slope_1 -0.2182446 0.0554287 -0.3268829 -0.1096063 -3.9374 8.237e-05 ***
Tau2_2 0.0014063 0.0021623 -0.0028317 0.0056443 0.6504 0.5155
Tau2_3 0.0031148 0.0035202 -0.0037846 0.0100143 0.8848 0.3762
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 154.2762
Degrees of freedom of the Q statistic: 48
P value of the Q statistic: 4.410916e-13
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0011603 0.0185
Tau2 (with predictors) 0.0014063 0.0031
R2 0.0000000 0.8318
Number of studies (or clusters): 20
Number of observed statistics: 49
Number of estimated parameters: 4
Degrees of freedom: 45
-2 log likelihood: 10.56012
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
meta3L()
because the covariates are treated as a
design matrix. When meta3LFIM()
is used, users need to
specify whether the covariates are at level 2 (x2
) or level
3 (x3
).summary(meta3LFIML(y=logOR, v=v, cluster=Cluster, x2=Type_MCAR, data=my.df))
Call:
meta3LFIML(y = logOR, v = v, cluster = Cluster, x2 = Type_MCAR,
data = my.df)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept -0.0024343 0.0360701 -0.0731303 0.0682618 -0.0675 0.9461939
SlopeX2_1 -0.2086677 0.0545138 -0.3155128 -0.1018226 -3.8278 0.0001293 ***
Tau2_2 0.0016732 0.0022114 -0.0026610 0.0060075 0.7567 0.4492584
Tau2_3 0.0035540 0.0035810 -0.0034646 0.0105726 0.9925 0.3209675
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0037965 0.0141
Tau2 (with predictors) 0.0016732 0.0036
R2 0.5592669 0.7486
Number of studies (or clusters): 21
Number of observed statistics: 115
Number of estimated parameters: 7
Degrees of freedom: 108
-2 log likelihood: 56.64328
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
Type
depends on the values of Year
.
Type
is missing when Year
is smaller than
1996.## MAR
Type_MAR <- ifelse(Bornmann07$Type=="Fellowship", yes=1, no=0)
## Create 27 out of 66 missingness with MAR for cases Year<1996
index_MAR <- ifelse(Bornmann07$Year<1996, yes=TRUE, no=FALSE)
Type_MAR[index_MAR] <- NA
summary(meta3L(logOR, v, x=Type_MAR, cluster=Cluster, data=Bornmann07))
Call:
meta3L(y = logOR, v = v, cluster = Cluster, x = Type_MAR, data = Bornmann07)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept -0.01587052 0.03952546 -0.09333901 0.06159796 -0.4015 0.688032
Slope_1 -0.17573647 0.06328327 -0.29976940 -0.05170355 -2.7770 0.005487 **
Tau2_2 0.00259266 0.00171596 -0.00077056 0.00595588 1.5109 0.130811
Tau2_3 0.00278384 0.00267150 -0.00245221 0.00801989 1.0421 0.297388
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 151.11
Degrees of freedom of the Q statistic: 38
P value of the Q statistic: 1.998401e-15
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0029593 0.0097
Tau2 (with predictors) 0.0025927 0.0028
R2 0.1238926 0.7121
Number of studies (or clusters): 12
Number of observed statistics: 39
Number of estimated parameters: 4
Degrees of freedom: 35
-2 log likelihood: -24.19956
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
av2
) and level 3
(av3
) auxiliary variables. Auxiliary variables are those
that predict the missing values or are correlated with the variables
that contain missing values. The inclusion of auxiliary variables can
improve the efficiency of the estimation and the parameter
estimates.## Include auxiliary variable
summary(meta3LFIML(y=logOR, v=v, cluster=Cluster, x2=Type_MAR, av2=Year, data=my.df))
Call:
meta3LFIML(y = logOR, v = v, cluster = Cluster, x2 = Type_MAR,
av2 = Year, data = my.df)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept -0.0264058 0.0572055 -0.1385266 0.0857150 -0.4616 0.644372
SlopeX2_1 -0.2003998 0.0691093 -0.3358516 -0.0649481 -2.8998 0.003735 **
Tau2_2 0.0029970 0.0022371 -0.0013877 0.0073817 1.3396 0.180359
Tau2_3 0.0030212 0.0032463 -0.0033415 0.0093839 0.9307 0.352033
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Explained variances (R2):
Level 2 Level 3
Tau2 (no predictor) 0.0049237 0.0088
Tau2 (with predictors) 0.0029970 0.0030
R2 0.3913239 0.6571
Number of studies (or clusters): 21
Number of observed statistics: 171
Number of estimated parameters: 14
Degrees of freedom: 157
-2 log likelihood: 377.3479
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
The correlation matrices and the sample sizes were stored in
Digman97$data
and Digman97$n
, respectively. We
may list the first few cases of the data by using the
head()
command.
#### Load the metaSEM library for TSSEM
library(metaSEM)
#### Inspect the data for inspection
head(Digman97$data)
$`Digman 1 (1994)`
A C ES E I
A 1.00 0.62 0.41 -0.48 0.00
C 0.62 1.00 0.59 -0.10 0.35
ES 0.41 0.59 1.00 0.27 0.41
E -0.48 -0.10 0.27 1.00 0.37
I 0.00 0.35 0.41 0.37 1.00
$`Digman 2 (1994)`
A C ES E I
A 1.00 0.39 0.53 -0.30 -0.05
C 0.39 1.00 0.59 0.07 0.44
ES 0.53 0.59 1.00 0.09 0.22
E -0.30 0.07 0.09 1.00 0.45
I -0.05 0.44 0.22 0.45 1.00
$`Digman 3 (1963c)`
A C ES E I
A 1.00 0.65 0.35 0.25 0.14
C 0.65 1.00 0.37 -0.10 0.33
ES 0.35 0.37 1.00 0.24 0.41
E 0.25 -0.10 0.24 1.00 0.41
I 0.14 0.33 0.41 0.41 1.00
$`Digman & Takemoto-Chock (1981b)`
A C ES E I
A 1.00 0.65 0.70 -0.26 -0.03
C 0.65 1.00 0.71 -0.16 0.24
ES 0.70 0.71 1.00 0.01 0.11
E -0.26 -0.16 0.01 1.00 0.66
I -0.03 0.24 0.11 0.66 1.00
$`Graziano & Ward (1992)`
A C ES E I
A 1.00 0.64 0.35 0.29 0.22
C 0.64 1.00 0.27 0.16 0.22
ES 0.35 0.27 1.00 0.32 0.36
E 0.29 0.16 0.32 1.00 0.53
I 0.22 0.22 0.36 0.53 1.00
$`Yik & Bond (1993)`
A C ES E I
A 1.00 0.66 0.57 0.35 0.38
C 0.66 1.00 0.45 0.20 0.31
ES 0.57 0.45 1.00 0.49 0.31
E 0.35 0.20 0.49 1.00 0.59
I 0.38 0.31 0.31 0.59 1.00
head(Digman97$n)
[1] 102 149 334 162 91 656
To conduct a fixed-effects TSSEM, we may specify
method=FEM
argument (the default method) in calling the
tssem1()
function. The results are stored in an object
named fixed1
. It can be displayed by the
summary()
command. The \(\chi^2(130, N=4,496) = 1,499.73, p <
.001\), CFI=0.6825, RMSEA=0.1812 and SRMR=0.1750. Based on the
test statistic and the goodness-of-fit indices, the assumption of
homogeneity of correlation matrices was rejected.
## Fixed-effects model: Stage 1 analysis
fixed1 <- tssem1(Cov=Digman97$data, n=Digman97$n, method="FEM")
summary(fixed1)
Call:
tssem1FEM(Cov = Cov, n = n, cor.analysis = cor.analysis, model.name = model.name,
cluster = cluster, suppressWarnings = suppressWarnings, silent = silent,
run = run)
Coefficients:
Estimate Std.Error z value Pr(>|z|)
S[1,2] 0.363278 0.013368 27.1760 < 2.2e-16 ***
S[1,3] 0.390375 0.012880 30.3077 < 2.2e-16 ***
S[1,4] 0.103572 0.015047 6.8830 5.861e-12 ***
S[1,5] 0.092286 0.015047 6.1331 8.621e-10 ***
S[2,3] 0.416070 0.012519 33.2345 < 2.2e-16 ***
S[2,4] 0.135148 0.014776 9.1464 < 2.2e-16 ***
S[2,5] 0.141431 0.014866 9.5135 < 2.2e-16 ***
S[3,4] 0.244459 0.014153 17.2724 < 2.2e-16 ***
S[3,5] 0.138339 0.014834 9.3259 < 2.2e-16 ***
S[4,5] 0.424566 0.012375 34.3071 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Goodness-of-fit indices:
Value
Sample size 4496.0000
Chi-square of target model 1505.4443
DF of target model 130.0000
p value of target model 0.0000
Chi-square of independence model 4471.4242
DF of independence model 140.0000
RMSEA 0.1815
RMSEA lower 95% CI 0.1736
RMSEA upper 95% CI 0.1901
SRMR 0.1621
TLI 0.6580
CFI 0.6824
AIC 1245.4443
BIC 412.0217
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
The pooled correlation matrix (the parameter estimates) can be
extracted by the use of the coef()
command.
coef(fixed1)
A C ES E I
A 1.00000000 0.3632782 0.3903748 0.1035716 0.09228557
C 0.36327824 1.0000000 0.4160695 0.1351477 0.14143058
ES 0.39037483 0.4160695 1.0000000 0.2444593 0.13833895
E 0.10357155 0.1351477 0.2444593 1.0000000 0.42456626
I 0.09228557 0.1414306 0.1383390 0.4245663 1.00000000
As an illustration, I continued to fit the structural model based on
the pooled correlation matrix. We may specify the two-factor model with
the RAM
formulation. An alternative and easier way to specify the model is
to use lavann
’s syntax.
model1 <- "## Factor loadings
Alpha =~ A+C+ES
Beta =~ E+I
## Factor correlation
Alpha ~~ Beta"
plot(model1)
RAM1 <- lavaan2RAM(model1, obs.variables=c("A","C","ES","E","I"),
A.notation="on", S.notation="with")
RAM1
$A
A C ES E I Alpha Beta
A "0" "0" "0" "0" "0" "0.1*AonAlpha" "0"
C "0" "0" "0" "0" "0" "0.1*ConAlpha" "0"
ES "0" "0" "0" "0" "0" "0.1*ESonAlpha" "0"
E "0" "0" "0" "0" "0" "0" "0.1*EonBeta"
I "0" "0" "0" "0" "0" "0" "0.1*IonBeta"
Alpha "0" "0" "0" "0" "0" "0" "0"
Beta "0" "0" "0" "0" "0" "0" "0"
$S
A C ES E I
A "0.5*AwithA" "0" "0" "0" "0"
C "0" "0.5*CwithC" "0" "0" "0"
ES "0" "0" "0.5*ESwithES" "0" "0"
E "0" "0" "0" "0.5*EwithE" "0"
I "0" "0" "0" "0" "0.5*IwithI"
Alpha "0" "0" "0" "0" "0"
Beta "0" "0" "0" "0" "0"
Alpha Beta
A "0" "0"
C "0" "0"
ES "0" "0"
E "0" "0"
I "0" "0"
Alpha "1" "0*AlphawithBeta"
Beta "0*AlphawithBeta" "1"
$F
A C ES E I Alpha Beta
A 1 0 0 0 0 0 0
C 0 1 0 0 0 0 0
ES 0 0 1 0 0 0 0
E 0 0 0 1 0 0 0
I 0 0 0 0 1 0 0
$M
A C ES E I Alpha Beta
1 "0*Amean" "0*Cmean" "0*ESmean" "0*Emean" "0*Imean" "0" "0"
fixed2 <- tssem2(fixed1, RAM=RAM1, intervals="LB",
model.name="TSSEM2 Digman97")
summary(fixed2)
Call:
wls(Cov = coef.tssem1FEM(tssem1.obj), aCov = vcov.tssem1FEM(tssem1.obj),
n = sum(tssem1.obj$n), RAM = RAM, Amatrix = Amatrix, Smatrix = Smatrix,
Fmatrix = Fmatrix, diag.constraints = diag.constraints, cor.analysis = tssem1.obj$cor.analysis,
intervals.type = intervals.type, mx.algebras = mx.algebras,
mxModel.Args = mxModel.Args, subset.variables = subset.variables,
model.name = model.name, suppressWarnings = suppressWarnings,
silent = silent, run = run)
95% confidence intervals: Likelihood-based statistic
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
AonAlpha 0.56280 NA 0.53270 0.59303 NA NA
ConAlpha 0.60522 NA 0.57524 0.63540 NA NA
EonBeta 0.78141 NA 0.71843 0.85503 NA NA
ESonAlpha 0.71920 NA 0.68859 0.75039 NA NA
IonBeta 0.55137 NA 0.49979 0.60272 NA NA
AlphawithBeta 0.36268 NA 0.31850 0.40662 NA NA
Goodness-of-fit indices:
Value
Sample size 4496.0000
Chi-square of target model 65.4526
DF of target model 4.0000
p value of target model 0.0000
Number of constraints imposed on "Smatrix" 0.0000
DF manually adjusted 0.0000
Chi-square of independence model 3112.7591
DF of independence model 10.0000
RMSEA 0.0585
RMSEA lower 95% CI 0.0465
RMSEA upper 95% CI 0.0713
SRMR 0.0284
TLI 0.9505
CFI 0.9802
AIC 57.4526
BIC 31.8088
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values indicate problems.)
plot(fixed2)
There are 4 types of sample characteristics in the original
cluster
. We may group them into either younger or older
sample.
#### Display the frequencies of "cluster"
table(Digman97$cluster)
Adolescents Children Mature adults Young adults
1 4 6 3
#### Fixed-effects TSSEM with several clusters
#### Create a variable for different cluster
#### Younger participants: Children and Adolescents
#### Older participants: others
clusters <- ifelse(Digman97$cluster %in% c("Children","Adolescents"),
yes="Younger participants", no="Older participants")
#### Show the clusters
clusters
[1] "Younger participants" "Younger participants" "Younger participants"
[4] "Younger participants" "Younger participants" "Older participants"
[7] "Older participants" "Older participants" "Older participants"
[10] "Older participants" "Older participants" "Older participants"
[13] "Older participants" "Older participants"
cluster=clusters
argument. Fixed-effects TSSEM will be
conducted according to the labels in the clusters
. The
goodness-of-fit indices of the Stage 1 analysis for the older and
younger participants were \(\chi^2(80,
N=3,658) = 823.88, p < .001\), CFI=0.7437, RMSEA=0.1513 and
SRMR=0.1528, and \(\chi^2(40, N=838) = 344.18,
p < .001\), CFI=0.7845, RMSEA=0.2131 and SRMR=0.1508,
respectively.## Example of Fixed-effects TSSEM with several clusters
cluster1 <- tssem1(Digman97$data, Digman97$n, method="FEM",
cluster=clusters)
summary(cluster1)
$`Older participants`
Call:
tssem1FEM(Cov = data.cluster[[i]], n = n.cluster[[i]], cor.analysis = cor.analysis,
model.name = model.name, suppressWarnings = suppressWarnings)
Coefficients:
Estimate Std.Error z value Pr(>|z|)
S[1,2] 0.297471 0.015436 19.2716 < 2.2e-16 ***
S[1,3] 0.370248 0.014532 25.4774 < 2.2e-16 ***
S[1,4] 0.137694 0.016403 8.3944 < 2.2e-16 ***
S[1,5] 0.098061 0.016724 5.8637 4.528e-09 ***
S[2,3] 0.393692 0.014146 27.8306 < 2.2e-16 ***
S[2,4] 0.183045 0.016055 11.4009 < 2.2e-16 ***
S[2,5] 0.092774 0.016643 5.5743 2.485e-08 ***
S[3,4] 0.260753 0.015554 16.7645 < 2.2e-16 ***
S[3,5] 0.096141 0.016573 5.8009 6.597e-09 ***
S[4,5] 0.411756 0.013900 29.6224 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Goodness-of-fit indices:
Value
Sample size 3658.0000
Chi-square of target model 825.9826
DF of target model 80.0000
p value of target model 0.0000
Chi-square of independence model 3000.9731
DF of independence model 90.0000
RMSEA 0.1515
RMSEA lower 95% CI 0.1424
RMSEA upper 95% CI 0.1611
SRMR 0.1459
TLI 0.7117
CFI 0.7437
AIC 665.9826
BIC 169.6088
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
$`Younger participants`
Call:
tssem1FEM(Cov = data.cluster[[i]], n = n.cluster[[i]], cor.analysis = cor.analysis,
model.name = model.name, suppressWarnings = suppressWarnings)
Coefficients:
Estimate Std.Error z value Pr(>|z|)
S[1,2] 0.604330 0.022125 27.3142 < 2.2e-16 ***
S[1,3] 0.465536 0.027493 16.9327 < 2.2e-16 ***
S[1,4] -0.031381 0.035940 -0.8732 0.38258
S[1,5] 0.061508 0.034547 1.7804 0.07500 .
S[2,3] 0.501432 0.026348 19.0311 < 2.2e-16 ***
S[2,4] -0.060678 0.034557 -1.7559 0.07911 .
S[2,5] 0.320987 0.031064 10.3330 < 2.2e-16 ***
S[3,4] 0.175437 0.033675 5.2097 1.891e-07 ***
S[3,5] 0.305149 0.031586 9.6609 < 2.2e-16 ***
S[4,5] 0.478640 0.026883 17.8045 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Goodness-of-fit indices:
Value
Sample size 838.0000
Chi-square of target model 346.2810
DF of target model 40.0000
p value of target model 0.0000
Chi-square of independence model 1470.4511
DF of independence model 50.0000
RMSEA 0.2139
RMSEA lower 95% CI 0.1939
RMSEA upper 95% CI 0.2355
SRMR 0.1411
TLI 0.7305
CFI 0.7844
AIC 266.2810
BIC 77.0402
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
coef()
command.coef(cluster1)
$`Older participants`
A C ES E I
A 1.00000000 0.29747123 0.37024803 0.1376942 0.09806125
C 0.29747123 1.00000000 0.39369157 0.1830450 0.09277411
ES 0.37024803 0.39369157 1.00000000 0.2607530 0.09614072
E 0.13769424 0.18304500 0.26075304 1.0000000 0.41175622
I 0.09806125 0.09277411 0.09614072 0.4117562 1.00000000
$`Younger participants`
A C ES E I
A 1.00000000 0.6043300 0.4655359 -0.0313810 0.06150839
C 0.60433002 1.0000000 0.5014319 -0.0606784 0.32098713
ES 0.46553592 0.5014319 1.0000000 0.1754367 0.30514853
E -0.03138100 -0.0606784 0.1754367 1.0000000 0.47864004
I 0.06150839 0.3209871 0.3051485 0.4786400 1.00000000
The goodness-of-fit indices of the Stage 2 analysis for the older and younger participants were \(\chi^2(4, N=3,658) = 21.92, p < .001\), CFI=0.9921, RMSEA=0.0350 and SRMR=0.0160, and \(\chi^2(4, N=838) = 144.87, p < .001\), CFI=0.9427, RMSEA=0.2051 and SRMR=0.1051, respectively.
cluster2 <- tssem2(cluster1, RAM=RAM1, intervals.type="z")
#### Please note that the estimates for the younger participants are problematic.
summary(cluster2)
$`Older participants`
Call:
wls(Cov = coef.tssem1FEM(tssem1.obj), aCov = vcov.tssem1FEM(tssem1.obj),
n = sum(tssem1.obj$n), RAM = RAM, Amatrix = Amatrix, Smatrix = Smatrix,
Fmatrix = Fmatrix, diag.constraints = diag.constraints, cor.analysis = tssem1.obj$cor.analysis,
intervals.type = intervals.type, mx.algebras = mx.algebras,
mxModel.Args = mxModel.Args, subset.variables = subset.variables,
model.name = model.name, suppressWarnings = suppressWarnings,
silent = silent, run = run)
95% confidence intervals: z statistic approximation
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
AonAlpha 0.512656 0.018206 0.476973 0.548340 28.158 < 2.2e-16 ***
ConAlpha 0.549967 0.017945 0.514795 0.585140 30.647 < 2.2e-16 ***
EonBeta 0.967136 0.058751 0.851986 1.082287 16.462 < 2.2e-16 ***
ESonAlpha 0.732174 0.018929 0.695074 0.769273 38.680 < 2.2e-16 ***
IonBeta 0.430649 0.029634 0.372568 0.488730 14.532 < 2.2e-16 ***
AlphawithBeta 0.349236 0.028118 0.294125 0.404346 12.420 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Goodness-of-fit indices:
Value
Sample size 3658.0000
Chi-square of target model 21.9954
DF of target model 4.0000
p value of target model 0.0002
Number of constraints imposed on "Smatrix" 0.0000
DF manually adjusted 0.0000
Chi-square of independence model 2273.3179
DF of independence model 10.0000
RMSEA 0.0351
RMSEA lower 95% CI 0.0217
RMSEA upper 95% CI 0.0500
SRMR 0.0160
TLI 0.9801
CFI 0.9920
AIC 13.9954
BIC -10.8233
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values indicate problems.)
$`Younger participants`
Call:
wls(Cov = coef.tssem1FEM(tssem1.obj), aCov = vcov.tssem1FEM(tssem1.obj),
n = sum(tssem1.obj$n), RAM = RAM, Amatrix = Amatrix, Smatrix = Smatrix,
Fmatrix = Fmatrix, diag.constraints = diag.constraints, cor.analysis = tssem1.obj$cor.analysis,
intervals.type = intervals.type, mx.algebras = mx.algebras,
mxModel.Args = mxModel.Args, subset.variables = subset.variables,
model.name = model.name, suppressWarnings = suppressWarnings,
silent = silent, run = run)
95% confidence intervals: z statistic approximation
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
AonAlpha 0.747647 0.023880 0.700842 0.794451 31.3081 <2e-16 ***
ConAlpha 0.911705 0.019864 0.872772 0.950638 45.8969 <2e-16 ***
EonBeta 0.152563 0.159128 -0.159322 0.464448 0.9587 0.3377
ESonAlpha 0.677435 0.025864 0.626743 0.728126 26.1926 <2e-16 ***
IonBeta 3.283839 3.363262 -3.308033 9.875711 0.9764 0.3289
AlphawithBeta 0.117257 0.125421 -0.128565 0.363078 0.9349 0.3498
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Goodness-of-fit indices:
Value
Sample size 838.0000
Chi-square of target model 145.6167
DF of target model 4.0000
p value of target model 0.0000
Number of constraints imposed on "Smatrix" 0.0000
DF manually adjusted 0.0000
Chi-square of independence model 2480.2403
DF of independence model 10.0000
RMSEA 0.2057
RMSEA lower 95% CI 0.1778
RMSEA upper 95% CI 0.2350
SRMR 0.1051
TLI 0.8567
CFI 0.9427
AIC 137.6167
BIC 118.6926
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values indicate problems.)
We may also plot the parameter estimates of these two groups.
library(semPlot)
## Convert the model to semPlotModel object with 2 plots
my.plots <- lapply(X=cluster2, FUN=meta2semPlot, latNames=c("Alpha","Beta"))
## Setup two plots
layout(t(1:2))
semPaths(my.plots[[1]], whatLabels="est", nCharNodes=10, color="green")
title("Younger")
semPaths(my.plots[[2]], whatLabels="est", nCharNodes=10, color="yellow")
title("Older")
RE.type="Diag"
argument. The range
of \(I^2\) indices, the percentage of
total variance that can be explained by the between study effect, are
from .84 to .95.#### Random-effects TSSEM with random effects on the diagonals
random1 <- tssem1(Digman97$data, Digman97$n, method="REM", RE.type="Diag")
summary(random1)
Call:
meta(y = ES, v = acovR, RE.constraints = Diag(paste0(RE.startvalues,
"*Tau2_", 1:no.es, "_", 1:no.es)), RE.lbound = RE.lbound,
I2 = I2, model.name = model.name, suppressWarnings = TRUE,
silent = silent, run = run)
95% confidence intervals: z statistic approximation (robust=FALSE)
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
Intercept1 0.38971908 0.05429256 0.28330762 0.49613054 7.1781 7.068e-13
Intercept2 0.43265881 0.04145136 0.35141563 0.51390198 10.4377 < 2.2e-16
Intercept3 0.04945631 0.06071079 -0.06953466 0.16844728 0.8146 0.41529
Intercept4 0.09603708 0.04478711 0.00825595 0.18381822 2.1443 0.03201
Intercept5 0.42724244 0.03911620 0.35057609 0.50390878 10.9224 < 2.2e-16
Intercept6 0.11929318 0.04106203 0.03881309 0.19977328 2.9052 0.00367
Intercept7 0.19292424 0.04757962 0.09966990 0.28617858 4.0548 5.018e-05
Intercept8 0.22690164 0.03240892 0.16338132 0.29042196 7.0012 2.538e-12
Intercept9 0.18105567 0.04258855 0.09758363 0.26452770 4.2513 2.126e-05
Intercept10 0.43614968 0.03205960 0.37331402 0.49898535 13.6043 < 2.2e-16
Tau2_1_1 0.03648372 0.01513055 0.00682839 0.06613905 2.4113 0.01590
Tau2_2_2 0.01963098 0.00859789 0.00277942 0.03648253 2.2832 0.02242
Tau2_3_3 0.04571438 0.01952285 0.00745030 0.08397846 2.3416 0.01920
Tau2_4_4 0.02236122 0.00995083 0.00285794 0.04186449 2.2472 0.02463
Tau2_5_5 0.01729072 0.00796404 0.00168149 0.03289995 2.1711 0.02992
Tau2_6_6 0.01815481 0.00895896 0.00059557 0.03571405 2.0264 0.04272
Tau2_7_7 0.02604881 0.01130266 0.00389602 0.04820161 2.3047 0.02119
Tau2_8_8 0.00988761 0.00513713 -0.00018098 0.01995619 1.9247 0.05426
Tau2_9_9 0.01988244 0.00895053 0.00233973 0.03742515 2.2214 0.02633
Tau2_10_10 0.01049222 0.00501578 0.00066148 0.02032296 2.0918 0.03645
Intercept1 ***
Intercept2 ***
Intercept3
Intercept4 *
Intercept5 ***
Intercept6 **
Intercept7 ***
Intercept8 ***
Intercept9 ***
Intercept10 ***
Tau2_1_1 *
Tau2_2_2 *
Tau2_3_3 *
Tau2_4_4 *
Tau2_5_5 *
Tau2_6_6 *
Tau2_7_7 *
Tau2_8_8 .
Tau2_9_9 *
Tau2_10_10 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Q statistic on the homogeneity of effect sizes: 1220.334
Degrees of freedom of the Q statistic: 130
P value of the Q statistic: 0
Heterogeneity indices (based on the estimated Tau2):
Estimate
Intercept1: I2 (Q statistic) 0.9326
Intercept2: I2 (Q statistic) 0.8872
Intercept3: I2 (Q statistic) 0.9325
Intercept4: I2 (Q statistic) 0.8703
Intercept5: I2 (Q statistic) 0.8797
Intercept6: I2 (Q statistic) 0.8480
Intercept7: I2 (Q statistic) 0.8887
Intercept8: I2 (Q statistic) 0.7669
Intercept9: I2 (Q statistic) 0.8590
Intercept10: I2 (Q statistic) 0.8193
Number of studies (or clusters): 14
Number of observed statistics: 140
Number of estimated parameters: 20
Degrees of freedom: 120
-2 log likelihood: -112.4196
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
coef()
command via the select
argument.## Fixed effects
coef(random1, select="fixed")
Intercept1 Intercept2 Intercept3 Intercept4 Intercept5 Intercept6
0.38971908 0.43265881 0.04945631 0.09603708 0.42724244 0.11929318
Intercept7 Intercept8 Intercept9 Intercept10
0.19292424 0.22690164 0.18105567 0.43614968
## Random effects
coef(random1, select="random")
Tau2_1_1 Tau2_2_2 Tau2_3_3 Tau2_4_4 Tau2_5_5 Tau2_6_6
0.036483717 0.019630976 0.045714378 0.022361217 0.017290719 0.018154811
Tau2_7_7 Tau2_8_8 Tau2_9_9 Tau2_10_10
0.026048815 0.009887609 0.019882440 0.010492217
random2 <- tssem2(random1, RAM=RAM1, intervals="LB")
summary(random2)
Call:
wls(Cov = pooledS, aCov = aCov, n = tssem1.obj$total.n, RAM = RAM,
Amatrix = Amatrix, Smatrix = Smatrix, Fmatrix = Fmatrix,
diag.constraints = diag.constraints, cor.analysis = cor.analysis,
intervals.type = intervals.type, mx.algebras = mx.algebras,
mxModel.Args = mxModel.Args, subset.variables = subset.variables,
model.name = model.name, suppressWarnings = suppressWarnings,
silent = silent, run = run)
95% confidence intervals: Likelihood-based statistic
Coefficients:
Estimate Std.Error lbound ubound z value Pr(>|z|)
AonAlpha 0.56944 NA 0.46898 0.67544 NA NA
ConAlpha 0.59063 NA 0.48949 0.69754 NA NA
EonBeta 0.67996 NA 0.54613 NA NA NA
ESonAlpha 0.76045 NA 0.64835 0.89695 NA NA
IonBeta 0.64184 NA 0.50430 0.74764 NA NA
AlphawithBeta 0.37769 NA 0.28670 0.47396 NA NA
Goodness-of-fit indices:
Value
Sample size 4496.0000
Chi-square of target model 7.8204
DF of target model 4.0000
p value of target model 0.0984
Number of constraints imposed on "Smatrix" 0.0000
DF manually adjusted 0.0000
Chi-square of independence model 501.6769
DF of independence model 10.0000
RMSEA 0.0146
RMSEA lower 95% CI 0.0000
RMSEA upper 95% CI 0.0297
SRMR 0.0436
TLI 0.9806
CFI 0.9922
AIC -0.1796
BIC -25.8234
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values indicate problems.)
## Plot the parameter estimates
plot(random2, color="green")
head()
command.#### Load the metaSEM library for TSSEM
library(metaSEM)
#### Inspect the data for inspection (not required for the analysis)
head(Becker94$data)
$`Becker (1978) Females`
Math Spatial Verbal
Math 1.00 0.47 -0.21
Spatial 0.47 1.00 -0.15
Verbal -0.21 -0.15 1.00
$`Becker (1978) Males`
Math Spatial Verbal
Math 1.00 0.28 0.19
Spatial 0.28 1.00 0.18
Verbal 0.19 0.18 1.00
$`Berry (1957) Females`
Math Spatial Verbal
Math 1.00 0.48 0.41
Spatial 0.48 1.00 0.26
Verbal 0.41 0.26 1.00
$`Berry (1957) Males`
Math Spatial Verbal
Math 1.00 0.37 0.40
Spatial 0.37 1.00 0.27
Verbal 0.40 0.27 1.00
$`Rosenberg (1981) Females`
Math Spatial Verbal
Math 1.00 0.42 0.48
Spatial 0.42 1.00 0.23
Verbal 0.48 0.23 1.00
$`Rosenberg (1981) Males`
Math Spatial Verbal
Math 1.00 0.41 0.74
Spatial 0.41 1.00 0.44
Verbal 0.74 0.44 1.00
head(Becker94$n)
[1] 74 153 48 55 51 18
#### Fixed-effects model
## Stage 1 analysis
fixed1 <- tssem1(Becker94$data, Becker94$n, method="FEM")
summary(fixed1)
Call:
tssem1FEM(Cov = Cov, n = n, cor.analysis = cor.analysis, model.name = model.name,
cluster = cluster, suppressWarnings = suppressWarnings, silent = silent,
run = run)
Coefficients:
Estimate Std.Error z value Pr(>|z|)
S[1,2] 0.379961 0.037123 10.2351 < 2.2e-16 ***
S[1,3] 0.334562 0.039947 8.3751 < 2.2e-16 ***
S[2,3] 0.176461 0.042334 4.1683 3.069e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Goodness-of-fit indices:
Value
Sample size 538.0000
Chi-square of target model 63.6553
DF of target model 27.0000
p value of target model 0.0001
Chi-square of independence model 207.7894
DF of independence model 30.0000
RMSEA 0.1590
RMSEA lower 95% CI 0.1096
RMSEA upper 95% CI 0.2117
SRMR 0.1586
TLI 0.7709
CFI 0.7938
AIC 9.6553
BIC -106.1169
OpenMx status1: 0 ("0" or "1": The optimization is considered fine.
Other values may indicate problems.)
coef(fixed1)
Math Spatial Verbal
Math 1.0000000 0.3799605 0.334562
Spatial 0.3799605 1.0000000 0.176461
Verbal 0.3345620 0.1764610 1.000000
We may specify the model via the RAM formulation. If all variables are observed, there is no need to specify the F matrix. Since the df of the regression model is 0, the proposed model always fits the data perfectly.
#### Prepare models for stage 2 analysis
model2 <- "## Math is modeled by Spatial and Verbal
Math ~ Spatial2Math*Spatial + Verbal2Math*Verbal
## Variances of predictors are fixed at 1
Spatial ~~ 1*Spatial
Verbal ~~ 1*Verbal
## Correlation between the predictors
Spatial ~~ SpatialCorVerbal*Verbal
## Error variance
Math ~~ ErrorVarMath*Math"
plot(model2)
RAM2 <- lavaan2RAM(model2)
RAM2
$A
Math Spatial Verbal
Math "0" "0.1*Spatial2Math" "0.1*Verbal2Math"
Spatial "0" "0" "0"
Verbal "0" "0" "0"
$S
Math Spatial Verbal
Math "0.5*ErrorVarMath" "0" "0"
Spatial "0" "1" "0*SpatialCorVerbal"
Verbal "0" "0*SpatialCorVerbal" "1"
$F
Math Spatial Verbal
Math 1 0 0
Spatial 0 1 0
Verbal 0 0 1
$M
Math Spatial Verbal
1 "0*Mathmean" "0*Spatialmean" "0*Verbalmean"
## Stage 2 analysis
fixed2 <- tssem2(fixed1, RAM=RAM2, intervals="LB")
summary(fixed2)
Call:
wls(Cov = coef.tssem1FEM(tssem1.obj), aCov = vcov.tssem1FEM(tssem1.obj),
n = sum(tssem1.obj$n), RAM = RAM, Amatrix = Amatrix, Smatrix = Smatrix,
Fmatrix = Fmatrix, diag.constraints = diag.constraints, cor.analysis = tssem1.obj$cor.analysis,
intervals.type = intervals.type, mx.algebras = mx.algebras,
mxModel.Args = mxModel.Args, subset.variables = subset.variables,
model.