Antonello Preti
2015-Apr-13 19:46 UTC
[R] metafor - Cochrane on change score in pre-post design
Hi, this is another quesite related to the use of 'metafor' for calculation of standardized mean change in pre-post design studies. Essentially, my aim is to compare different method to arrive at the same conclusion: Does the treatment work? The Cochrane manual advise not to calculate change score: "9.4.5.2 Meta-analysis of change scores In some circumstances an analysis based on changes from baseline will be more efficient and powerful than comparison of final values, as it removes a component of between-person variability from the analysis. However, calculation of a change score requires measurement of the outcome twice and in practice may be less efficient for outcomes which are unstable or difficult to measure precisely, where the measurement error may be larger than true between-person baseline variability. Change-from-baseline outcomes may also be preferred if they have a less skewed distribution than final measurement outcomes. Although sometimes used as a device to ?correct? for unlucky randomization, this practice is not recommended. The preferred statistical approach to accounting for baseline measurements of the outcome variable is to include the baseline outcome measurements as a covariate in a regression model or analysis of covariance (ANCOVA)". My question is: how do include both baseline (experimental and control group) in the analysis as a covariate in 'metafor'? So, far, this is what I did. I kinly request some help tp add the baseline as covariate to comply with the Cochrane suggestion- How can I add the baseline mean in both groups? Should I consider baseline standard deviation, and if yes, how? Should I take into account dropouts? I mean, in some sample at baseline n 30 and 35 and at end of treatment n was 28 and 29... Thank you in advance, Antonello Preti This is my dataset (with imputed r = 0.70 for pre-post correlation, put in the 'ri' variable): ##### the data dat <- structure(list(study = structure(c(11L, 8L, 7L, 12L, 13L, 4L, 5L, 1L, 10L, 3L, 6L, 9L, 2L), .Label = c("Study A, 2012", "Study B, 2013", "Study C, 2013", "Study D, 2010", "Study E, 2012", "Study F, 2013", "Study G, 2006", "Study H, 2005", "Study I, 2013", "Study L, 2012", "Study M, 2003", "Study N, 2007", "Study P, 2007" ), class = "factor"), c_pre_mean = c(4.9, 15.18, 19.01, 5.1, 16.5, 27.35, 18.1, 2.4, 14.23, 0.08, 21.26, 21.5, 21.73), c_pre_sd = c(2.6, 2.21, 7.1, 1.5, 7.2, 13.92, 5.4, 0.13, 4.89, 0.94, 7.65, 5.22, 8.43), c_post_mean = c(6.1, 13.98, 18.5, 4.53, 15.9, 23, 16.9, 2.2, 16.58, -0.02, 16, 16.84, 23.54), c_post_sd = c(2.06, 3.24, 7, 2.06, 6.8, 12.06, 3.8, 0.13, 6.35, 0.88, 4.69, 4.64, 6.74), c_sample = c(14, 13, 19, 15, 34, 20, 24, 35, 31, 26, 49, 21, 22), e_pre_mean = c(4.6, 13.81, 19.9, 5.3, 18.7, 22.71, 19.2, 2.7, 15.97, -0.22, 20.9, 20.43, 21.94), e_pre_sd = c(2.1, 6.64, 8.1, 2.9, 7.3, 7.82, 4.1, 0.13, 6.73, 0.93, 5.18, 4.87, 7.02), e_post_mean = c(4.64, 15.86, 18.1, 4.33, 17.2, 24.89, 17.6, 2.8, 13.6, 0.06, 17.41, 16.05, 19.29), e_post_sd = c(2.34, 7.76, 7.8, 2.26, 7.4, 11.89, 3.7, 0.13, 5.79, 1.12, 5.16, 4.17, 6.58), e_sample = c(14, 18, 16, 16, 33, 28, 29, 36, 38, 27, 43, 25, 17), ri = c(.70, .70,.70,.70,.70,.70,.70,.70,.70,.70,.70,.70,.70)), .Names = c("study", "c_pre_mean", "c_pre_sd", "c_post_mean", "c_post_sd", "c_sample", "e_pre_mean", "e_pre_sd", "e_post_mean", "e_post_sd", "e_sample", "ri"), class = "data.frame", row.names = c(NA, -13L)) ### check the data dim(dat) head(dat) str(dat) attach(dat) #### yes, I know, do'nt do this.... # call the library library(metafor) # Computing Standardized Mean Difference (Hedges' g) for Each Group (experimental and control) at post treatment # use "SMD" for the standardized mean difference using raw score standardization datT <- escalc(measure="SMD", m1i=e_post_mean, sd1i=e_post_sd, n1i=e_sample, m2i=c_post_mean, sd2i=c_post_sd, n2i=c_sample, vtype="UB", data=dat, append=TRUE) # Extract the effect size ( Standardized Mean Difference (Hedges' g)) and its variance yi <- datT$yi vi <- datT$vi ############################################### # # fixed-effects model # ############################################### model.FE <- rma(yi, vi, method="FE", digits=2) summary(model.FE) # plot globale plot(model.FE, slab=paste(study)) [[alternative HTML version deleted]]
Michael Dewey
2015-Apr-14 08:34 UTC
[R] metafor - Cochrane on change score in pre-post design
Comment below On 13/04/2015 20:46, Antonello Preti wrote:> Hi, this is another quesite related to the use of 'metafor' for calculation > of standardized mean change in pre-post design studies. > Essentially, my aim is to compare different method to arrive at the same > conclusion: Does the treatment work? > > The Cochrane manual advise not to calculate change score: > > "9.4.5.2 Meta-analysis of change scores > > In some circumstances an analysis based on changes from baseline will be > more efficient and powerful than comparison of final values, > as it removes a component of between-person variability from the analysis. > However, calculation of a change score requires measurement of the outcome > twice > and in practice may be less efficient for outcomes which are unstable or > difficult to measure precisely, > where the measurement error may be larger than true between-person baseline > variability. > Change-from-baseline outcomes may also be preferred if they have a less > skewed distribution than final measurement outcomes. > Although sometimes used as a device to ?correct? for unlucky randomization, > this practice is not recommended. > > The preferred statistical approach to accounting for baseline measurements > of the outcome variable > is to include the baseline outcome measurements as a covariate in a > regression model or analysis of covariance (ANCOVA)". >As I read Cochrane this is a comment about which data you should extract from the primary studies if you have a choice. It is not a recommendation to you the meta-analyst about how you subsequently conduct the meta-analysis of the extracted data.> My question is: how do include both baseline (experimental and control > group) in the analysis as a covariate in 'metafor'? > So, far, this is what I did. > I kinly request some help tp add the baseline as covariate to comply with > the Cochrane suggestion- > How can I add the baseline mean in both groups? > Should I consider baseline standard deviation, and if yes, how? > Should I take into account dropouts? I mean, in some sample at baseline n > 30 and 35 and at end of treatment n was 28 and 29... > > > > Thank you in advance, > Antonello Preti > > > > > This is my dataset (with imputed r = 0.70 for pre-post correlation, put in > the 'ri' variable): > > ##### the data > > dat <- structure(list(study = structure(c(11L, 8L, 7L, 12L, 13L, 4L, > 5L, 1L, 10L, 3L, 6L, 9L, 2L), .Label = c("Study A, 2012", > "Study B, 2013", "Study C, 2013", "Study D, 2010", > "Study E, 2012", "Study F, 2013", "Study G, 2006", > "Study H, 2005", "Study I, 2013", "Study L, 2012", > "Study M, 2003", "Study N, 2007", "Study P, 2007" > ), class = "factor"), c_pre_mean = c(4.9, 15.18, 19.01, 5.1, > 16.5, 27.35, 18.1, 2.4, 14.23, 0.08, 21.26, 21.5, 21.73), c_pre_sd = c(2.6, > 2.21, 7.1, 1.5, 7.2, 13.92, 5.4, 0.13, 4.89, 0.94, 7.65, 5.22, > 8.43), c_post_mean = c(6.1, 13.98, 18.5, 4.53, 15.9, 23, 16.9, > 2.2, 16.58, -0.02, 16, 16.84, 23.54), c_post_sd = c(2.06, 3.24, > 7, 2.06, 6.8, 12.06, 3.8, 0.13, 6.35, 0.88, 4.69, 4.64, 6.74), > c_sample = c(14, 13, 19, 15, 34, 20, 24, 35, 31, 26, 49, > 21, 22), e_pre_mean = c(4.6, 13.81, 19.9, 5.3, 18.7, 22.71, > 19.2, 2.7, 15.97, -0.22, 20.9, 20.43, 21.94), e_pre_sd = c(2.1, > 6.64, 8.1, 2.9, 7.3, 7.82, 4.1, 0.13, 6.73, 0.93, 5.18, 4.87, > 7.02), e_post_mean = c(4.64, 15.86, 18.1, 4.33, 17.2, 24.89, > 17.6, 2.8, 13.6, 0.06, 17.41, 16.05, 19.29), e_post_sd = c(2.34, > 7.76, 7.8, 2.26, 7.4, 11.89, 3.7, 0.13, 5.79, 1.12, 5.16, > 4.17, 6.58), e_sample = c(14, 18, 16, 16, 33, 28, 29, 36, > 38, 27, 43, 25, 17), ri = c(.70, > .70,.70,.70,.70,.70,.70,.70,.70,.70,.70,.70,.70)), .Names = c("study", > "c_pre_mean", "c_pre_sd", > "c_post_mean", "c_post_sd", "c_sample", "e_pre_mean", "e_pre_sd", > "e_post_mean", "e_post_sd", "e_sample", "ri"), class = "data.frame", > row.names = c(NA, > -13L)) > > > ### check the data > > dim(dat) > head(dat) > str(dat) > > attach(dat) #### yes, I know, do'nt do this.... > > # call the library > > library(metafor) > > > # Computing Standardized Mean Difference (Hedges' g) for Each Group > (experimental and control) at post treatment > # use "SMD" for the standardized mean difference using raw score > standardization > > datT <- escalc(measure="SMD", m1i=e_post_mean, sd1i=e_post_sd, > n1i=e_sample, m2i=c_post_mean, sd2i=c_post_sd, n2i=c_sample, vtype="UB", > data=dat, append=TRUE) > > > # Extract the effect size ( Standardized Mean Difference (Hedges' g)) and > its variance > > yi <- datT$yi > vi <- datT$vi > > > > ############################################### > # > # fixed-effects model > # > ############################################### > > model.FE <- rma(yi, vi, method="FE", digits=2) > > summary(model.FE) > > # plot globale > > plot(model.FE, slab=paste(study)) > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Michael http://www.dewey.myzen.co.uk/home.html