The Story of Forest Plots

A hand-out from a seminar about forest plots

Contents List


A.D. Events
  • "First Cycle" Breast Cancer Overview meeting - data processed in "the GALAXY environment" (cloned from astrophysics).
  • There is no such thing as a forest plot!
  • 1986
  • ODDS program emerges, producing the basic forest plot with horizontal 95% confidence interval lines (each with a vertical marker tick), at first without a grand total. 
  • Output typically from new-fangled Document Technology DL20 laser printer (DL20 language, via GHOST or GALAXY graphics), also biro plotting and worse.
  • Expression "forest of lines" coined; GAZEBO program is born.
  • 1987
    • Ticks become blobs; grand totals and subtotals appear. 
    • Convention set for 99% and 95% confidence intervals for trials and totals respectively (it puts a good spin on the logrank method [smiley image here]). 
    • Blobs become squares with area proportional to variance, to convey relative weight. 
    • Totals and subtotals become diamonds with a superposed square (soon relocated on the left margin) to denote variance; vertical dotted line appears.
    • Tests for heterogeneity and trend added. 
    • Forest plots are now virtually indistingishable from the present-day. Many program clones are already "out in the wild". 
    • Output typically from Canon LBP8-II laser printers (VDM language, via GALAXY graphics).
    • Sir Pat Forrest has leg pulled at "Second Cycle" Breast Cancer Overview meeting.
    • GALAXY expanded to include overviews of C.L.L., Colorectal Cancer, Hodgkin's Disease and others.
    • GALAXY expanded to include overviews of Anti-Platelet, Childhood A.L.L., Fibrinolytics, Hormonal Factors in Breast Cancer, Prostate Cancer and others.
    • GAZEBO cloned into APT, a "cafeteria" version with a well-defined data entry form for non-programmers to specify their plots detail by detail (for the Anti-Platelet Overview meeting).
    • Ruth Ripley clones from APT (and ABSEIL, for life-table curves), adds more options, builds in PostScript-only output etc. Species possibly extinct, but with descendants.
    • Output typically from HP LaserJet printers (PostScript language, via GALAXY graphics).
    • GALAXY programs now all run on Windows PCs as well as on the traditional VAX/VMS and Alpha/OpenVMS (and various dinosaurs). Some also run in Unix.
    • Ice Age.


    From a very early date, there have been three requirements:

    1. To produce forest plots with any choice of endpoint, stratification and treatment comparison from a GALAXY overview database with the fewest possible button-pushes, plus the ability to run huge overnight batches unattended.

    3. To produce forest plots quickly from tables of trial results or stratum summaries.
    4. Forest plots must be as near to publication quality as possible.
  • Years ago i suggested, now that computers were powerful enough to do useful amounts of factorials in real time, that we moved from using the logrank method to the exact solution, although this went down like a lead balloon. Perhaps we never shall.

  • Slides

    GAZEBO's Features

    Huh? gazebo ?
    Graunch begins:
     1: "steering-file endpoint stratification" descriptor
     2: -4: direct input, studies; -3: direct input, studies (compact); -2: direct input, categories; -1: direct input, overviews;
        0: no serial and ignore data flags; 1: serial (normal); 2: serial, include no-data entries; 3: show but don't use serial;
        4: show but don't use serial, and include no-data entries; 5: serial, include post-cutoff; 6: serial, include no-data and
     3: -9: add N0/N-/N+/N?, <40/40-49 (AN); -8: add N0/N-/N+/N?, <40/40-49, 50-59/60-69 (AN) or N0/N-/N+/N?, 50-59/60-69 (ANE); -7: add
        40-44/45-49, 50-54/55-59 (AE) or N0/N-/N+/N?, <40/40-49 (AN) or N0/N-/N+/N? (NE, ANE or ANE3) or N0/N-/N+/N?, ages, ER+/++
        (ANE2); -6: add A/B, discard D/other/? (DS) or add D/other (SS) or <40/40-44/45-49, 50-54/55-59 (AE) or <40/40-49 (A) or
        N0/N-/N+/N? (AN) or N0/N-/N+/N?, ER+/ER? (NE or ANE) or N0/N-/N+/N?, ages (ANE2); -5: add N0/N-, N1-3/N4+/N? (N) or ages (AN) or
        ER+/ER++/ER?, ages (E) or PR+/PR++/PR?, ages (P) or ER+/ER?, ages (NE) or PR+/PR?, ages (NP) or ER+/ER?, PR+/PR?, ages (EP) or
        40-44/45-49, 50-54/55-59, ER+/ER? (AE) or <40/40-49, 50-59/60-69 (A) or 50-59/60-69 (ANE) or ages and nodes, collapse ER (ANE2)
        or ages and nodes (ANL, ATN, ATN2 or ANG); -4: add ER+/ER++ (E) or PR+/PR++ (P) or <40/40-49, 60-69/70+ (A or AN) or 60-69/70+
        (M) or <40/40-44/45-49, 50-54/55-59, ER+/ER? (AE) or 50-59/60-69, ER+/ER? (ANE); -3: add 60-69/70+ (A) or ER+/ER++/ER? (E) or
        PR+/PR++/PR? (P) or ER+/ER? (AE or NE) or PR+/PR? (NP) or <40/40-49 (AN) or ER+/ER? (ANE) or ER+/ER++ (EA) or ages, M0/M? (AS);
        -2: add ages, re-order (N) or add ER+/ER++, ages (E) or PR+/PR++, ages (P) or <40/40-49, 60-69/70+ + (AE) or 60-69/70+ (AN) or
        stages (AS) or ER?/ER+/ER++ (EA) or N0/N-/N+/N? (ANM or AN3); -1: add ages (N, E, P, NN, PN, NE, NP, EP, AS, L or G); 0: strata
        as found; 1: add up frames; 2: add up frames and on-page strata
     4: 0: normal; 1: omit no-death-cause; 2: omit death-cause; 3: omit no-recurrence-site; 4: omit recurrence-site trials/strata; 5:
        show all junk numerators; 6: show tabular numerators
     5: 0: normal (0+); otherwise, year range, e.g. 0-0, 0-2, 2-4, 3, 5+ etc
     6: 0: normal; 1: larger characters in lines (default for 'direct input')
     7: 0: normal; 1: V5::UDV1:[RG]; 2: V1::UDV1:[RG] instuffing
     8: 0: normal; 1: outstuffing; 2: read vertical lock file; 3: write vertical lock file
     9: 0: normal; 1: double-size boxes; 2: quad-size boxes
    10: 0: normal; 1: no overall-doubling for imbalanced trials (indirect) / put heading `adjusted' (direct)
    11: -1: lock bottom of page; 0: normal (100%); otherwise, vertical scaling factor (range 1-100plus)
    12: 0: normal; 1: toggle presence of 'information' column; 2: wide 'information' column; 3: wider 'information' column
    13: 0: normal; 1: crude titles only; (2+: special options)
    14: 0: annual odds; 1: daily odds (default for PC; N.B: must tally with BLACKBOX setting); 2: crude odds; 3: unspecified
    15: 0: reductions, 'SE'; 1: reductions, '±'; 2: ratios, 'SE'; 3: ratios, '±'; 4: automatic, 'SE'; 5: automatic, '±'
    16: 0: normal; 1: omit subtotals; 2: omit grand total; 3: omit both
    17: 0: normal; 1: show actual p-values > 0·1
    18: 0: normal; 1: show heterogeneity for subtotals; 2: show trend for subtotals
    19: 0: normal; 1: show dotted lines for subtotals
    20: 0: normal; 1: show years only; 2: omit suffices to year codes
    21: 0: normal; 1: omit (O-E) and V columns; 2: omit events columns
    22: -1: abscissa scale logarithmic 0·1 - 10; 0: normal; 1: linear 0·25 - 1·75; 2: linear 0·5 - 1·5
    23: 0: normal; 1: show 1 d.p. for subtotal reductions
    24: 0: normal; 1: 95% intervals; 2: 99% intervals
    25: 0: normal; 1: toggle person-years
    26: 0: normal; 1: toggle presence of individual reductions/ratios
    27: 0: normal; 1: open boxes for the 'non-updated'
    28: 0: normal; 1: omit caption letters and underlining
    Output: descriptorX
    Video:  descriptorV
    Brain power .014 - unacceptable

    Jon Godwin
    [End of document, updated to 11 May 2001]