using runmlwin for Meta Analysis of longitudinal studies

Welcome to the forum for runmlwin users. Feel free to post your question about runmlwin here. The Centre for Multilevel Modelling take no responsibility for the accuracy of these posts, we are unable to monitor them closely. Do go ahead and post your question and thank you in advance if you find the time to post any answers!

Go to runmlwin: Running MLwiN from within Stata >> http://www.bristol.ac.uk/cmm/software/runmlwin/
Post Reply
drsatpalsandhu
Posts: 7
Joined: Tue Oct 29, 2013 12:14 pm

using runmlwin for Meta Analysis of longitudinal studies

Post by drsatpalsandhu »

Hi
I am doing a meta analysis of longitudinal studies involving continuous outcome response. Out of total 10 eligible studies, 8 studies provided individual participant data (IPD) whereas aggregate summary statistics (effect size and standard error) is available from two other 2 studies. For IPD alone meta analysis, i can undertake multilevel (three level) analysis as data if of thee level hierarchical structure wherein repeated measures (level 1) are nested in individuals (level 2), which are further nested in studies (level 3). However, i was just wondering as how to combine IPD (8 studies) and aggregate summary statistics (2 studies) in the same analysis so that i can utilize the advantage of IPD for estimating the unknown parameters (within study variance-covariance structure). Actually an article has described this methodology for conventional continuous outcome measures (Riley RD, Lambert PC, Staessen JA, Wang J, Gueyffier F, Thijs L, Boutitie F. Meta-analysis of continuous outcomes combining individual patient data and aggregate data. Statistics in Medicine 2008;27:1870-93.) using SAS software. How can we extend this to multiple outcome and runmlwin command.
Thanks
Regards
Dr. Satpal sandhu
GeorgeLeckie
Site Admin
Posts: 432
Joined: Fri Apr 01, 2011 2:14 pm

Re: using runmlwin for Meta Analysis of longitudinal studies

Post by GeorgeLeckie »

Hi Satpal,

In terms of the models specified in Riley et al. (2008), and I should say that I have only had a quick scan, I think you could probably specify many of these using runmlwin. If you can get the data they use, you could set about replicating each model in turn using runmlwin.

In terms of extending the methods developed for two-level data presented in Riley et al. (2008) to your case of three-level data, this is more a statistical modelling question rather than a runmlwin-specific question.

Best wishes

George
drsatpalsandhu
Posts: 7
Joined: Tue Oct 29, 2013 12:14 pm

Re: using runmlwin for Meta Analysis of longitudinal studies

Post by drsatpalsandhu »

Dear George,
I would like to first apologies for my delayed response to your post. Actually I was figuring out as how to constraint the within trial variance for studies which provided only aggregate data. In case of proc mixed procedure of SAS software, we can use parms statement with hold/eqcons option to constraint the within trial matrix. Is there a way to use similar step in case of runmlwin? Or we have to manually define the constraint for each value.
The data used in the Riley (2008) article is not available. can I send the data from few studies (IPD and aggregate data combined in the sane dataset) as an example dataset.
You are right, the only difference in my case as compared to the Riley (2008) example is that my data is of three levels as compared two level data structure used by Riley et al. I can use runmlwin to fit three level structures. The only confusion I have is regarding the constraint.
Regards
Satpal Sandhu
GeorgeLeckie
Site Admin
Posts: 432
Joined: Fri Apr 01, 2011 2:14 pm

Re: using runmlwin for Meta Analysis of longitudinal studies

Post by GeorgeLeckie »

Dear Satpal,

I hope the following helps

Best wishes

George

Consider the meta analysis example provided by Raudenbush and Bryk (2002), pages 210-213.

Syntax:

Code: Select all

* Drop all data from memory
clear all

* Set number of studies
set obs 19

* Generate study ID
generate study = _n

* Enter the effect size estimateimates and standard errors 
generate estimate = .
replace estimate =  0.03  in 1
replace estimate =  0.12  in 2
replace estimate = -0.14  in 3
replace estimate =  1.18  in 4
replace estimate =  0.26  in 5
replace estimate = -0.06  in 6
replace estimate = -0.02  in 7
replace estimate = -0.32  in 8
replace estimate =  0.27  in 9
replace estimate =  0.80  in 10
replace estimate =  0.54  in 11
replace estimate =  0.18  in 12
replace estimate = -0.02  in 13
replace estimate =  0.23  in 14
replace estimate = -0.18  in 15
replace estimate = -0.06  in 16
replace estimate =  0.30  in 17
replace estimate =  0.07  in 18
replace estimate = -0.07  in 19
generate stderr = .
replace stderr   =  0.125 in 1
replace stderr   =  0.147 in 2
replace stderr   =  0.167 in 3
replace stderr   =  0.373 in 4
replace stderr   =  0.369 in 5
replace stderr   =  0.103 in 6
replace stderr   =  0.103 in 7
replace stderr   =  0.220 in 8
replace stderr   =  0.164 in 9
replace stderr   =  0.251 in 10
replace stderr   =  0.302 in 11
replace stderr   =  0.223 in 12
replace stderr   =  0.289 in 13
replace stderr   =  0.290 in 14
replace stderr   =  0.159 in 15
replace stderr   =  0.167 in 16
replace stderr   =  0.139 in 17
replace stderr   =  0.094 in 18
replace stderr   =  0.174 in 19
generate variance = stderr^2

* List the data
list study estimate stderr

* Generate constant
generate cons = 1

* Constrain level-1 variance to equal 1
constraint define 1  [RP1]var(stderr) = 1

* Fit meta analysis model
runmlwin estimate cons, ///
  level2(study: cons) ///
  level1(study: stderr) ///
  constraints(1) ///  
  nopause rigls
Output:

Code: Select all

. * Drop all data from memory
. clear all

. 
. * Set number of studies
. set obs 19
obs was 0, now 19

. 
. * Generate study ID
. generate study = _n

. 
. * Enter the effect size estimateimates and standard errors 
. generate estimate = .
(19 missing values generated)

. replace estimate =  0.03  in 1
(1 real change made)

. replace estimate =  0.12  in 2
(1 real change made)

. replace estimate = -0.14  in 3
(1 real change made)

. replace estimate =  1.18  in 4
(1 real change made)

. replace estimate =  0.26  in 5
(1 real change made)

. replace estimate = -0.06  in 6
(1 real change made)

. replace estimate = -0.02  in 7
(1 real change made)

. replace estimate = -0.32  in 8
(1 real change made)

. replace estimate =  0.27  in 9
(1 real change made)

. replace estimate =  0.80  in 10
(1 real change made)

. replace estimate =  0.54  in 11
(1 real change made)

. replace estimate =  0.18  in 12
(1 real change made)

. replace estimate = -0.02  in 13
(1 real change made)

. replace estimate =  0.23  in 14
(1 real change made)

. replace estimate = -0.18  in 15
(1 real change made)

. replace estimate = -0.06  in 16
(1 real change made)

. replace estimate =  0.30  in 17
(1 real change made)

. replace estimate =  0.07  in 18
(1 real change made)

. replace estimate = -0.07  in 19
(1 real change made)

. generate stderr = .
(19 missing values generated)

. replace stderr   =  0.125 in 1
(1 real change made)

. replace stderr   =  0.147 in 2
(1 real change made)

. replace stderr   =  0.167 in 3
(1 real change made)

. replace stderr   =  0.373 in 4
(1 real change made)

. replace stderr   =  0.369 in 5
(1 real change made)

. replace stderr   =  0.103 in 6
(1 real change made)

. replace stderr   =  0.103 in 7
(1 real change made)

. replace stderr   =  0.220 in 8
(1 real change made)

. replace stderr   =  0.164 in 9
(1 real change made)

. replace stderr   =  0.251 in 10
(1 real change made)

. replace stderr   =  0.302 in 11
(1 real change made)

. replace stderr   =  0.223 in 12
(1 real change made)

. replace stderr   =  0.289 in 13
(1 real change made)

. replace stderr   =  0.290 in 14
(1 real change made)

. replace stderr   =  0.159 in 15
(1 real change made)

. replace stderr   =  0.167 in 16
(1 real change made)

. replace stderr   =  0.139 in 17
(1 real change made)

. replace stderr   =  0.094 in 18
(1 real change made)

. replace stderr   =  0.174 in 19
(1 real change made)

. generate variance = stderr^2

. 
. * List the data
. list study estimate stderr

     +---------------------------+
     | study   estimate   stderr |
     |---------------------------|
  1. |     1        .03     .125 |
  2. |     2        .12     .147 |
  3. |     3       -.14     .167 |
  4. |     4       1.18     .373 |
  5. |     5        .26     .369 |
     |---------------------------|
  6. |     6       -.06     .103 |
  7. |     7       -.02     .103 |
  8. |     8       -.32      .22 |
  9. |     9        .27     .164 |
 10. |    10         .8     .251 |
     |---------------------------|
 11. |    11        .54     .302 |
 12. |    12        .18     .223 |
 13. |    13       -.02     .289 |
 14. |    14        .23      .29 |
 15. |    15       -.18     .159 |
     |---------------------------|
 16. |    16       -.06     .167 |
 17. |    17         .3     .139 |
 18. |    18        .07     .094 |
 19. |    19       -.07     .174 |
     +---------------------------+

. 
. * Generate constant
. generate cons = 1

. 
. * Constrain level-1 variance to equal 1
. constraint define 1  [RP1]var(stderr) = 1

. 
. * Fit meta analysis model
. runmlwin estimate cons, ///
>   level2(study: cons) ///
>   level1(study: stderr) ///
>   constraints(1) ///  
>   nopause rigls
 
 ( 1)  [RP1]var(stderr) = 1
MLwiN 2.30 multilevel model                     Number of obs      =        19
Normal response model
Estimation algorithm: RIGLS

-----------------------------------------------------------
                |   No. of       Observations per Group
 Level Variable |   Groups    Minimum    Average    Maximum
----------------+------------------------------------------
          study |       19          1        1.0          1
-----------------------------------------------------------

Run time (seconds)        =       2.18
Number of iterations      =         11
Log restricted-likelihood = -3.1667345
Restricted-deviance       =  6.3334689
------------------------------------------------------------------------------
    estimate |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
        cons |   .0838533   .0517674     1.62   0.105    -.0176089    .1853154
------------------------------------------------------------------------------

------------------------------------------------------------------------------
   Random-effects Parameters |   Estimate   Std. Err.     [95% Conf. Interval]
-----------------------------+------------------------------------------------
Level 2: study               |
                   var(cons) |    .019013   .0150184     -.0104224    .0484485
-----------------------------+------------------------------------------------
Level 1: study               |
                 var(stderr) |          1          0             1           1
------------------------------------------------------------------------------
drsatpalsandhu
Posts: 7
Joined: Tue Oct 29, 2013 12:14 pm

Re: using runmlwin for Meta Analysis of longitudinal studies

Post by drsatpalsandhu »

Dear George,
I used you example and replicated results as you shown by you. I think this is a good method for meta-analysis of aggregate data. However, my query is as how to use similar methodology for three level data structure and to constraint the within trial variance for only those studies which provided aggregate data (for follow up time periods) and let the within trial variance to be estimated during the analysis for studies which provided IPD data. we can identify the studies which provided IPD or AD by creating a dummy variable (as done by Riley et al) with value 1 for studies which provided IPD and 0 for those studies which provided AD. As i am modelling a nonlinear trend, therefore i am using multilevel linear spline regression analysis with time coded as linear splines. E.g. the coded looks like:
runmlwin vas sex s1-s6 cons , ///
> level3(study: s1-s6 cons) ///
> level2(id: s1-s6 cons) ///
> level1(occ: )

Best wishes
satpal
GeorgeLeckie
Site Admin
Posts: 432
Joined: Fri Apr 01, 2011 2:14 pm

Re: using runmlwin for Meta Analysis of longitudinal studies

Post by GeorgeLeckie »

Hi Satpal,

Forget the three-level version for now. First try to fit the standard two-level version which includes IPD and and AD data. Only once that is working, try to extend this to your particular three-level setting.

Best wishes

George
GeorgeLeckie
Site Admin
Posts: 432
Joined: Fri Apr 01, 2011 2:14 pm

Re: using runmlwin for Meta Analysis of longitudinal studies

Post by GeorgeLeckie »

Hi Satpal,

I do not have a suitable dataset to draw upon, but I would have thought you would want something like the following in the standard two-level case...

Best wishes

George

(1) Fit model to only the aggregate data (what we have already done):

Code: Select all

. constraint define 1 [RP1]var(stderr) = 1
. runmlwin y cons ad==1, level2(study: cons) level1(obs: stderr) constraint(1) nopause
where the study effects are stored in y and the associated standard errors are stored in stderr.

(2) Fit model to only the individual data:

Code: Select all

. runmlwin y cons treat if ipd==1, level2(study: cons) level1(obs: cons) nopause
where the individual outcome variable is stored in y and treat is the treatment dummy variable, the coefficient of which is the effect of interest.

(3) Fit joint model to both aggregate and individual data (what you want to do):

Code: Select all

. constraint define 1 [RP1]var(stderr) = 1
. runmlwin y ipd treat, level2(study: cons) level1(obs: stderr ipd) constraint(1) nopause
Here treat=1 if ad==1 and stderr=0 if ipd==1
drsatpalsandhu
Posts: 7
Joined: Tue Oct 29, 2013 12:14 pm

Re: using runmlwin for Meta Analysis of longitudinal studies

Post by drsatpalsandhu »

Hello George,
Thanks for providing insight and explanation in form of codes for undertaking meta-analysis of combined IPD and AD data structure. Now it is clear as how to define IPD and AD in the same data and to constraint the varinace of AD. Thanks once again.
Best wishes
satpal
Post Reply