Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vertex (turning point) uncertainty after dose-response meta-analysis

    Dear colleagues,

    I conducted a dose-response meta analysis DR-MA (Y axis = Standardized Mean Differences from individual studies, X axis=Dose of medication).
    After conducting DR-MA using cubic splines, it seems that I have a parabolic relationship. The response variable starts at 0 (since its a standardized mean difference) and as the dose medication increases, Y decreases until its vertex (turning point), then Y starts to increase after a certain dose.

    I am interested in estimating the uncertainty in the turning point. I see that other colleagues have estimated the uncertainty of turning point for individual level data, but I unfortunately can't figure out how to estimate the turning point and a 95% CI using dose-response meta-analysis data. Each observation on the Y/X cartesian plane corresponds to a SMD taken from a study thus, each point on the scatter point has a weight.

    I am hoping for some help solving this problem. It would be great to measure the uncertainty of turning points of meta-analyzed dose response relationships.

    Thanks very much for any thoughts,

    José


  • #2
    José--Here's one simplistic thought. (I'd note in advance that I've never used splines to fit a relationship.) My idea, though, is that -bootstrap- can just about always yield a defensible confidence interval. I would suggest that you create a little wrapper program around your analysis that estimates the model and calculates the inflection point, and make it return as an r-class result your inflection point estimate. I presume each observation in your data set is a study and its results, right, so -bootstrap- would just be resampling the studies. If you haven't done something like that before, if you show some of your code, it would be easy enough to help you create a wrapper program for this purpose. (I think.) Hope this helps.

    Comment


    • #3
      Dear Mike,

      Thank you for your help! That's absolutely a satisfactory solution. As you might imagine, when a physician prescribes a medication, we first start to see relief of symptoms with increasing doses but then the dose is too high and get start to observe adverse effects. The parabolic shape of the data is accurate, there is a turning point or a vertex. Bootstrapping is an excellent solution because our data are rare (as you figured, an entire study is a data point). So it is essential to measure the uncertainty of the turning point as this changes clinical practice with meta-analysis level evidence.

      I have not done something like this before unfortunately and would love your input. Our data indicate that we have to make a clinical decision to stop increasing the dose. This study affects many children. Let me put together the code, a graph and see if you or someone can help me. But thank you in advance for your advice. I was thinking about bootstrapping but have not done it with dose response meta analysis.

      I will get back to you shortly, thanks so much!

      José

      Comment


      • #4
        If you can show the code by which you estimate/calculate one inflection point, that should be enough to create what you need for -bootstrap-. I'll be interested to see what you have.

        Comment


        • #5
          Hi Mike,

          this is the code that produces the initial output:

          . drmeta smd max_d dosesq if age==1, se(se) data(n sd) id(ID) type(type_smd)

          One-stage fixed-effect dose-response model Number of studies = 26
          Optimization = gls Number of obs = 39
          AIC = 190.43 Model chi2(2) = 522.89
          Log likelihood = -93.213583 Prob > chi2 = 0.0000
          ------------------------------------------------------------------------------
          smd | Coef. Std. Err. z P>|z| [95% Conf. Interval]
          -------------+----------------------------------------------------------------
          max_d | -.0291442 .0026643 -10.94 0.000 -.034366 -.0239223
          dosesq | .0002636 .0000437 6.03 0.000 .0001779 .0003494
          ------------------------------------------------------------------------------



          drmeta_graph , d(0(1)100) ref(0) eq(d d^2) ///
          ytitle("Standardized Mean Difference") ///
          xtitle("Dose") xlab(0(10)100) title("Pediatric Studies") ///
          ylab(0(.2)-1) scheme(s1mono) ylabel(0(.5)-2) ///
          yline(-0.80556, lcolor(red) lpattern(dash)) ///
          xline(55.28110, lcolor(red) lpattern(dash)) ///
          xline(96.58797, lcolor(blue)) xline(34.23340, ///
          lcolor(green))


          Then graph strongly suggest a parabolic shape with a turning point. FYI as SMD decreases, symptoms improve.. After a while SMD starts to go up signaling a turning point

          Using drmeta I can calculate a vertex but not the 95% CI of the turning point.
          Attached Files
          Last edited by Jose Flores MDPhD; 18 Jul 2020, 09:09.

          Comment


          • #6
            José is using the user-written module -drmeta- , which is available at ssc. -drmeta- is a meta-analysis program, and returns regression results in e(b), from which the inflection point for the quadratic function can be calculated in an apparently straightforward manner. I found a bootstrap solution to the confidence interval on this estimate, but it requires something of a trick, so I'd like someone else's perspective on it. If I'm right, this simple trick might be useful to others. The difficulty requiring the trick is that this estimation command fails when certain kinds of duplications occur in the data set, which of course is common with -bootstrap-. Here's my explanation, culminating in the proposed solution:

            We don't have José's original data, but we have something likely just as good, namely one of the data examples referenced in the help for -drmeta-. His situation and use of the-drmeta- command is very similar to this example (right, José?)

            Code:
            // Illustration of estimating a quadratic function and its inflection point.
            ssc install drmeta
            // example data and command  from -help drmeta-
            use http://www.stats4life.se/data/aripanss, clear
            drmeta md dose dosesq , se(se_md) data(n sd) id(id) type(type_md)
            mat B = e(b)
            // slope with respect to dose = b1 + 2 * b2 * dose. Inflection point
            // occurs where slope = 0, so:
            di "Dose where slope = 0: " -B[1,1]/(2*B[1,2])
            drmeta_graph ,  d(0(1)30) ref(0) eq(d d^2) ytitle("Mean difference") xtitle("Ariprazole (mg/day)")
            Note that the calculation agrees with an eyeballing of the graph. I started by naively creating a simple wrapper for the inflection point estimate, but as we'll see, there are problems with that approach.
            Code:
            cap prog drop wrapper
            prog wrapper, rclass
               // naive approach that works on the observed data but fails with -bootstrap-
                drmeta md dose dosesq , se(se_md) data(n sd) id(id) type(type_md)
                tempname B
                mat `B' = e(b)
                local doseslope0 = -`B'[1,1]/(2*`B'[1,2])
                display _newline "Dose for inflection point = `doseslope0'"
                return scalar doseslope0 = `doseslope0'
            end
            // Test with observed data.
            wrapper // this works
            ret list
            -bootstrap- fails on every replication sample. As near as I can tell, this is because -drmeta- needs there to be only one instance of any given combination of the id and dose variables.
            Code:
            bootstrap ds0 = r(doseslope0), seed(1357) cluster(id) noisily reps(3): wrapper
            My solution, on which I'd like some input from others, was to create a new id variable at each replication so that any duplicated combinations of id/dose produced by the normal operation of bootstrap resampling have a distinct id. Perhaps there is some non-klugy way to get -bootstrap- to do this, but I can't figure it out.

            Code:
            cap prog drop wrappernew
            prog wrappernew, rclass
               syntax, idvar(varlist) dosevar(varlist)
               // Create a new id variable so that multiple occurrences of a combination
               // of id and dose are distinct.
               tempvar newid
               bysort `idvar' `dosevar': gen `newid' = 100 * `idvar' + _n
               // use that newid
                drmeta md dose dosesq , se(se_md) data(n sd) id(`newid') type(type_md)
                tempname B
                mat `B' = e(b)
                local doseslope0 = -`B'[1,1]/(2*`B'[1,2])
                display _newline "Dose for inflection point = `doseslope0'"
                return scalar doseslope0 = `doseslope0'
            end
            // check
            wrappernew, idvar(id) dosevar(dose)
            //
            bootstrap ds0 = r(doseslope0), seed(1357) cluster(id) reps(1000): ///
               wrappernew, idvar(id) dosevar(dose)
            // I probably would not trust the normal-based CIs here, so look at others.
            estat bootstrap, all



            Last edited by Mike Lacy; 19 Jul 2020, 11:48.

            Comment


            • #7
              Hi Mike and colleagues,

              The wrapper program is working in many of the datasets.
              The datasets with fewer papers have problems.

              I will be posting some data and some code to see if this helps find the problem or if we are reaching the limits of the data.

              There is another way of thinking about this problem which is thinking of the turning point as the point C where two slopes meet (we would create splines before and after the parabolic vertex).

              The example of how UCLA finds point C and a 95% CI is give here:
              https://stats.idre.ucla.edu/stata/fa...se-regression/

              I can still use the linear terms of the drmeta command. Since I don't care about the shape of the curve (that has already been determined by drmeta), any program that allows me to calculate a decent 95% CI of the turning point is satisfactory. The problem is that either approach fails if the number of studies is low.

              I will post data and code shortly,

              Thanks so much,

              José

              Comment

              Working...
              X