Using Stata Graphs to Visually Monitor the Progress of

Download Report

Transcript Using Stata Graphs to Visually Monitor the Progress of

Using Stata Graphs to
Visually Monitor the
Progress of Multi-centre
Randomized Clinical
Trials
Alexandra Whate & Glenn Jones
General Background
• Clinical trials are increasingly multi-centre
and global
• Routine meetings about trial status become
logistically difficult and expensive to hold
• Investigators have different levels of training
and motivation in carrying out clinical trials
• Monthly performance monitoring reports have
traditionally been text and table based adaptations need to be made
Our Context
• In 6 trials Investigators from over 30 countries
collect data and submit them to the DMC
• Monthly Performance Monitoring Reports are
created by the DMC and submitted to Investigators
and Technical Officers (TO)
• Used to evaluate investigator performance
• Used to monitor study progress
– Accrual, follow-up, survival, adverse events
– Provide investigators with the “big picture” to
encourage continued accrual, adherence to protocol
and patient follow-up
– Detection of emerging issues or bias
Principles to Optimize Monthly Reports:
• Visual – to overcome language barriers
• Relatively Simple – to match the level of
training of Investigators
• Discriminating – To easily identify those that
are adhering to protocol and those who are
not
• Efficient – Quick to read and understand
• Strategic – Motivating Investigators; minimize
bias; ensure patient safety
Applications of Stata
1. Monitoring Accrual
2. Monitoring Survival
3. Monitoring Clinical Trajectories
4. Monitoring Follow-up
1. Accrual
Accrual should be relatively rapid
All centres should participate in
adding patients to the study on a
regular basis
Using Stata To Monitor Accrual
• Line plots show total accrual over the time of
the study (standard)
• Bar graphs show monthly accrual
• Bar graphs can also be made ‘by centre’ to
show accrual for each centre involved
• These can demonstrate
– Trends in accrual
– Interruptions due to issues with staffing and
equipment
Total Accrual
140
120
100
80
60
40
20
0
12
11
9
6
Aug 2009
Sept 2009
June 2009
April 2009
2
March 2009
Jan 2009
July 2008
June 2008
May 2008
April 2008
March 2008
Feb 2008
6
July 2009
3
2
1
8
6
May 2009
5
6
Feb 2009
4
6
Dec 2008
Jan 2008
5
Nov 2008
Dec 2007
5
Oct 2008
3
6
Sept 2008
3
6
7
Aug 2008
3
Nov 2007
5
Oct 2007
14
12
10
8
6
4
2
0
Graph bar var, over(month var, label(angle(ver))) blabel(total) ytitle ylabel(0(2)14) ylabel(,angle(hor)) saving(graphstata)
twoway line var var, clwidth(medthick) ylabel(,angle(hor)) xlabel(,nolabel) xtitle("") saving(graphlinestata)
graph combine graphstata.gph graphlinestata.gph, col(1) title(“Total Accrual”)
0
Oct 2007
Nov 2007
Dec 2007
Jan 2008
Feb 2008
March 2008
April 2008
May 2008
June 2008
July 2008
Aug 2008
Sept 2008
Oct 2008
Nov 2008
Dec 2008
Jan 2009
Feb 2009
March 2009
April 2009
May 2009
June 2009
July 2009
Aug 2009
Sept 2009
Country 1
4
3
2
2
4
2
1
2
3
1
1
33 3
3
2
1
3
2
1
1
3
2
11
2
1111
1
1
11
1
2
Oct 2007
Nov 2007
Dec 2007
Jan 2008
Feb 2008
March 2008
April 2008
May 2008
June 2008
July 2008
Aug 2008
Sept 2008
Oct 2008
Nov 2008
Dec 2008
Jan 2009
Feb 2009
March 2009
April 2009
May 2009
June 2009
July 2009
Aug 2009
Sept 2009
2
Oct 2007
Nov 2007
Dec 2007
Jan 2008
Feb 2008
March 2008
April 2008
May 2008
June 2008
July 2008
Aug 2008
Sept 2008
Oct 2008
Nov 2008
Dec 2008
Jan 2009
Feb 2009
March 2009
April 2009
May 2009
June 2009
July 2009
Aug 2009
Sept 2009
6
Oct 2007
Nov 2007
Dec 2007
Jan 2008
Feb 2008
March 2008
April 2008
May 2008
June 2008
July 2008
Aug 2008
Sept 2008
Oct 2008
Nov 2008
Dec 2008
Jan 2009
Feb 2009
March 2009
April 2009
May 2009
June 2009
July 2009
Aug 2009
Sept 2009
0
Oct 2007
Nov 2007
Dec 2007
Jan 2008
Feb 2008
March 2008
April 2008
May 2008
June 2008
July 2008
Aug 2008
Sept 2008
Oct 2008
Nov 2008
Dec 2008
Jan 2009
Feb 2009
March 2009
April 2009
May 2009
June 2009
July 2009
Aug 2009
Sept 2009
4
Oct 2007
Nov 2007
Dec 2007
Jan 2008
Feb 2008
March 2008
April 2008
May 2008
June 2008
July 2008
Aug 2008
Sept 2008
Oct 2008
Nov 2008
Dec 2008
Jan 2009
Feb 2009
March 2009
April 2009
May 2009
June 2009
July 2009
Aug 2009
Sept 2009
Accrual by Centre
Country 2
Country 3
10
8
6
4
4
5
3
2 2
3
222
11
2 2
11 1 11
3
3
11
2
11
Graphs by centre
graph bar var, by(centre) over(month var, label(labsize(vsmall) angle(ver))) ytitle("number of patients
accrued") ylabel(0(2)10) ylabel(,angle(hor)) blabel(total, gap(.25)) title(“Accrual by Centre”)
1
Country 4
Country 5
Country 6
10
8
6
3
4
2
1
Monitoring Randomization
• We must ensure that randomization
processes are working
– Require by the end of accrual that there are
equal number of patients on each treatment
arm of the study
– Requires that patients are being placed at an
equal rate on the study arms – real time
randomization
Arm 1
bihist var, by(var)
Date of Randomization
Arm 2
01oct2009
01sep2009
01aug2009
01jul2009
01jun2009
01may2009
01apr2009
01mar2009
01feb2009
01jan2009
01dec2008
01nov2008
01oct2008
01sep2008
01aug2008
01jul2008
01jun2008
01may2008
01apr2008
01mar2008
01feb2008
01jan2008
01dec2007
01nov2007
01oct2007
8
6
4
2
0
2
4
6
8
Two-Arm Trial
Jul-05
Sep-05
Nov-05
Jan-06
Mar-06
May-06
Jul-06
Sep-06
Nov-06
Jan-07
Mar-07
May-07
Jul-07
Sep-07
Nov-07
Jan-08
Mar-08
May-08
Jul-08
Sep-08
Nov-08
Jan-09
Mar-09
May-09
Jul-09
Sep-09
Nov-09
Multi-Arm Trial
1
.8
.6
.4
.2
0
DOrand
Arm 1
Arm 2
Arm 3
cdfplot var, by(txarm) legend(col(4)) xlabel(,angle(ver))
Arm 4
2. Monitoring Survival
Ethical requirement to monitor patterns of
mortality over the span of the study
Monitoring Survival
• Kaplan-Meier plots allow us to estimate event
rates over time
– We create a “survival” variable with date of event or
last follow-up minus the date of randomization
gen SURV=date of last follow-up – date of randomization
stset SURV, failure(death==1)
• Stata allows for graphical demonstration of
survival estimates for different baseline groups
(different disease, stage of disease etc) especially
important for sample size
sts graph, cim censored(single)
risktable(,title(Risk)) ylabel(,angle(hor))
ylabel(#10) xlabel(#20) xtitle("days from
randomization")xlabel(,angle(ver))
Kaplan-Meier survival estimate
450
500
550
600
400
350
300
250
200
150
100
50
0
1
.9
.8
.7
.6
.5
.4
.3
.2
.1
0
6
3
1
0
days from randomization
Risk
110
88
62
41
32
25
95% CI
18
13
9
Survivor function
sts graph, cim censored(single)
risktable(,title(Risk)) ylabel(,angle(hor))
ylabel(#10) xlabel(#20) xtitle("days from
randomization")xlabel(,angle(ver))
Kaplan-Meier survival estimates
1.00
0.90
0.80
0.70
0.60
0.50
0.40
0.30
0.20
0.10
0.00
0
20
40
60
80
100
120
140
160
180
200
220
240
260
280
300
320
340
360
380
400
420
440
460
480
500
520
540
560
580
1
days from randomization
Risk
M0:
M1:
69 66 62 57 52 46 41 34 31 26 25 23 21 20 18 15 14 12 11 10 8
41 36 34 28 20 16 13 9 8 7 7 7 5 4 3 3 3 2 2 1 1
Disease 1
8
1
7
1
5
1
Disease 2
3
1
2
1
0
1
0
1
0
1
0
0
3. Clinical Trajectory
Demonstrates the extent to which
protocol-required activities are properly
ordered and on time
Demonstrates the homogeneity or patterns
in clinical trajectories and identifies clear
outliers (protocol violation, patient choice)
Clinical Trajectory
• In Stata, graphic representations of clinical
trajectories can be created by plotting dates of
interest:
1.
2.
3.
4.
5.
6.
Date of diagnosis
Dates of imaging/scans/biopsies
Date of surgery
Date of randomization
Dates of treatment
Dates of follow ups
• Plot deceased and living patients separately
Clinical Trajectories of Deceased Patients
Oct-09
Jul-09
Apr-09
Jan-09
Oct-08
Jul-08
Apr-08
Jan-08
Oct-07
Jun-09
May-09
Apr-09
Feb-09
Mar-09
Jan-09
Dec-08
Nov-08
Oct-08
Sep-08
Aug-08
Jul-08
Jun-08
May-08
Apr-08
Mar-08
Feb-08
Jan-08
Dec-07
Nov-07
Oct-07
Jul-07
date of randomization
Follow-up
2nd Treatment
CT scan
3rd Treatment
Biopsy
Randomization
1st Treatment
Death
twoway scatter var var var var var var var var if deathflag==1, xti("date of randomization")yti("") xlabel(,angle(ver))
ylabel(,angle(hor)) legend(col(4)) ti("Clinical Trajectories of Deceased Patients") || scatter var var if status==1,
msymbol(x) mcolor(gold) legend(lab(8 "Death")) xlabel(#20) ylabel(#10)
Country 1
Country 2
Country 3
Country 4
Country 5
Country 6
Oct-09
Jul-09
Apr-09
Jan-09
Oct-08
Jul-08
Apr-08
Jan-08
Oct-07
Jul-07
Oct-07
Nov-07
Dec-07
Jan-08
Feb-08
Mar-08
Apr-08
May-08
Jun-08
Jul-08
Aug-08
Sep-08
Oct-08
Nov-08
Dec-08
Jan-09
Feb-09
Mar-09
Apr-09
May-09
Jun-09
Oct-07
Nov-07
Dec-07
Jan-08
Feb-08
Mar-08
Apr-08
May-08
Jun-08
Jul-08
Aug-08
Sep-08
Oct-08
Nov-08
Dec-08
Jan-09
Feb-09
Mar-09
Apr-09
May-09
Jun-09
Oct-07
Nov-07
Dec-07
Jan-08
Feb-08
Mar-08
Apr-08
May-08
Jun-08
Jul-08
Aug-08
Sep-08
Oct-08
Nov-08
Dec-08
Jan-09
Feb-09
Mar-09
Apr-09
May-09
Jun-09
Oct-09
Jul-09
Apr-09
Jan-09
Oct-08
Jul-08
Apr-08
Jan-08
Oct-07
Jul-07
date of randomization
follow-up
treatment 1
randomization
treatment 2
CT scan
treatment 3
biopsy
death
Graphs by centre
twoway scatter var var var var var var var if death==1 , xti("date of randomization")yti("")
xlabel(,angle(ver)) ylabel(,angle(hor)) legend(col(4)) || scatter var var, msymbol(x) mcolor(gold)
legend(lab(8 “death")) xlabel(#20) ylabel(#10) by(centre)
Scatter Plots for Living Patients
Clinical Trajectories
Jan-08
Feb-08
Mar-08
Apr-08
May-08
Jun-08
Jul-08
Aug-08
Sep-08
Oct-08
Nov-08
Dec-08
Jan-09
Feb-09
Mar-09
Apr-09
May-09
Jun-09
Jul-09
Aug-09
Sep-09
Oct-09
Nov-09
Oct-09
Aug-09
Jun-09
Apr-09
Feb-09
Dec-08
Oct-08
Aug-08
Jun-08
Apr-08
Feb-08
Dec-07
Date of Randomization
Follow Up
CT scan
Treatment1
Biopsy
Treatment 2
Randomization
Treatment 3
twoway scatter var var var var var var var, msize(small) xti("Date of Randomization") xlabel(,angle(ver))
ylabel(,angle(hor)) legend(col(4) ti("Clinical Trajectories")yline(18048)xlabe(#25)ylabel(#10)
4. Tracking Follow-Up
Identify patients that are at risk of
being lost to follow-up
Follow-up is required by protocol in
specific intervals
Ensuring Regular Follow-Up
• Each month we are interested in monitoring
the date of last follow-up for each patient to
determine whether follow-up submission is up
to date
– We can use a strip plot separated by country to
show the date of last follow-up for each patient
– Dot plots can be used to isolate patients based on
follow-up date (mlabel)
– Goal is to inform Investigators about the specific
cases that are missing follow-up
• Allows synchronization of records
DOlfu
Country 1
Country 2
Country 3
Country 4
Country 5
Country 6
Country 7
Country 8
Country 9
stripplot var, over(var) xlabel(,angle(ver)) xline(18110) separate(centre) legend(col(3))
Oct-09
Sep-09
Aug-09
Jul-09
Jun-09
May-09
Apr-09
Feb-09
Mar-09
Jan-09
Dec-08
Nov-08
Oct-08
Sep-08
Aug-08
Jul-08
Jun-08
May-08
Apr-08
Mar-08
Feb-08
Jan-08
Dec-07
Nov-07
Oct-07
Strip Plot: Follow-Up
Dot Plots
SA030
CH034
Sep-09
IN040
CR015
SA027
CH006
SA023
CH032
CR011
CH010
CH012
CH030
CH019
CH017
CH031
CR013
CH020
SA025
CH028
CR003
CR007
CH027
CH025
CH033
SA031
SA026
SA033
SA028
SA032
SA034
SA029
CH008
TL005
CH026
TL006
Aug-09
CH029
IN038
IC003
SA015
IN037
IN036
IN039
Jul-09
IN035
IN034
IN031
IN032
IN033
IN030
CH001
IC002
CH021
Jun-09
IN027
INO16
IN029
IN018
IN012
May-09
IN015
IN024
CR010
CR012
CR009
IN025
dotplot var, ylabel(,angle(hor)) ylabel(#5) mlabel(patid) mlabsize(tiny) xscale(off) yline(18110)
Strategic Monitoring of Follow-up
• Scatter plots and strip plots give a visual clue
to the proportion of patients that are out of
date for follow-up
• A more sophisticated look at combined followup for the whole trial allows us to determine
the proportion exactly
– Plotting cumulative date of last follow-up with
CDF plots estimates permanent loss to follow-up
Ideal Cumulative Follow-up
Cumulative Follow-up
1
.9
.8
.7
.5
.4
.3
.2
.1
date of last follow-up
Sep-09
Aug-09
Jul-09
Jun-09
May-09
0
Apr-09
%
.6
CDF Plot - Cumulative Follow-up
Cumulative Follow-up
1
.9
.8
.7
%
.6
.5
.4
Line to denote
the time since
which follow-up
forms should
have been
received
.3
.2
.1
Nov-07
Dec-07
Jan-08
Feb-08
Mar-08
Apr-08
May-08
Jun-08
Jul-08
Aug-08
Sep-08
Oct-08
Nov-08
Dec-08
Jan-09
Feb-09
Mar-09
Apr-09
May-09
Jun-09
Jul-09
Aug-09
Sep-09
Oct-09
Nov-09
0
date of last follow-up
cdfplot var, ylabel(#10) xlabe(#5) xlabel(,angle(ver)) xline(18130) xtitle(date of last follow-up) ytitle (%) legend(col(3))
Determining Contribution
• CDF plots can be made by centre to show how
each centre is contributing to the global CDF
• Then scatter plots can also be modified to list
specific patients that are behind on follow-up
– We generate cumulative date variables
cumul var, gen(newvar)
and scatter these dates to create a “Scatter CDF
plot”
– By plotting only those patients that are overdue
for follow-up we can “zoom in” on the CDF plot to
identify the specific patients that are contributing
to sections 1 or 2 of the overall CDF plot.
Cumulative Follow-Up by Centre
Cumulative Follow-up
Nov-07
Dec-07
Jan-08
Feb-08
Mar-08
Apr-08
May-08
Jun-08
Jul-08
Aug-08
Sep-08
Oct-08
Nov-08
Dec-08
Jan-09
Feb-09
Mar-09
Apr-09
May-09
Jun-09
Jul-09
Aug-09
Sep-09
Oct-09
Nov-09
%
1
.9
.8
.7
.6
.5
.4
.3
.2
.1
0
date of last follow-up
Country 1
Country 3
Country 5
Country 7
Country 2
Country 4
Countrry 6
Country 8
Country 9
cdfplot var, by(centre) ylabel(#10) xlabe(#5) xlabel(,angle(ver)) xline(18110) xtitle(date of last follow-up) ytitle (%) legend(col(3))
Scatter CDF
.7
TL006
IN038
.65
SA015
IN036
IN039
IN035
.6
IN034
IN033
IN032
IN031
CH001
.55
IN027
CH021
IN030
INO16
IN029
IN018
.5
IN012
CR010
.45
IN037
CR012
CR009
IN015
IN024
IN025
Aug-09
Jul-09
Jun-09
May-09
Apr-09
.4
date of last follow-up
Country 1
Country 2
Country 3
Country 4
Country 5 Country 6
twoway (scatter cdf var if centre==1, mlabel(patid)) (scatter cdf var if centre==2, mlabel(patid)) (scatter cdf var if centre==3, mlabel(patid))
(scatter cdf var if centre==4, mlabel(patid)) (scatter cdf var if centre==5, mlabel(patid)) (scatter cdf var if centre==6, xlabel(,angle(ver))
legend(col(6)) xlabel(#5) ylabel(,angle(hor)) mlabel(patid))
Follow-Up Over Time
• We can merge serial .dta files (just key
variables) to enable simultaneous plotting of
each months CDF for dates of last follow-up in
patients that are/were alive
• This shows the structure of follow-up across
the months of the study
CDF Plot-Merged Over Time
Oct-09
Sep-09
Aug-09
Jul-09
Jun-09
May-09
Apr-09
Mar-09
Feb-09
Jan-09
Dec-08
Nov-08
Oct-08
Sep-08
Aug-08
Jul-08
Jun-08
May-08
1
.9
.8
.7
.6
.5
.4
.3
.2
.1
0
DOlfu
Jan 2009
Feb 2009
March 2009
April 2009
May 2009
June 2009
July 2009
Aug 2009
Sept 2009
Summary
• Stata’s graphing capabilities can be used to
monitor accrual, survival and follow-up status
and other aspects of protocol adherence
• The time interval between reports can be
short
– reports can be produced efficiently using do files
• Minimum Investigator training is required to
interpret reports about the whole study and
their own performance
• The trial can be visually monitored by TO’s and
the DMC
Summary
• Rapid identification of problems by centre and
patient can lead to more timely responses
• Different patterns of problems can be
detected for which different strategies for
resolution can be pursued – this can give
direction to Investigators as to how to solve
problems
• Using Stata to visually monitor trails helps to
improve patient safety and trial quality
Questions?