Page 1 of 1
using runmlwin for Meta Analysis of longitudinal studies
Posted: Thu Jun 12, 2014 7:51 am
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
Re: using runmlwin for Meta Analysis of longitudinal studies
Posted: Wed Jun 18, 2014 1:29 pm
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
Re: using runmlwin for Meta Analysis of longitudinal studies
Posted: Thu Jun 26, 2014 4:45 pm
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
Re: using runmlwin for Meta Analysis of longitudinal studies
Posted: Fri Jun 27, 2014 2:27 pm
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
------------------------------------------------------------------------------
Re: using runmlwin for Meta Analysis of longitudinal studies
Posted: Mon Jun 30, 2014 4:33 am
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
Re: using runmlwin for Meta Analysis of longitudinal studies
Posted: Mon Jun 30, 2014 2:12 pm
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
Re: using runmlwin for Meta Analysis of longitudinal studies
Posted: Mon Jun 30, 2014 4:32 pm
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
Re: using runmlwin for Meta Analysis of longitudinal studies
Posted: Fri Jul 04, 2014 6:19 am
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