Amelie Anota (1), Caroline Bascoul-Mollevi (2), Franck Bonnetain (1)

(1) Quality of Life in Oncology clinical research Platform and Methodology and Quality of Life in Oncology Unit (EA 3181), University Hospital of Besancon, France

(2) Biostatistics Unit, Montpellier Cancer Institute, Montpellier, France

See also: UMQVC web site

Scoring the EORTC HRQoL questionnaires

The first application of the QoLR package is the estimation of the scores of most of the EORTC health-related quality of life (HRQOL) questionnaires, such as the QLQ-C30 cancer specific questionnaire (Aaronson et al. 1993). The method to calculate the scores of the EORTC HRQOL questionnaire is defined in the EORTC scoring manual (Fayers et al. 1999). All the modules implemented in the QoLR package are described in the next Table 1.

Functions Arguments Description
scoring.QLQC30 (data, id, time) Scoring of the EORTC QLQ-C30 questionnaire for cancer patients
scoring.QLQC15PAL (data, id, time) Scoring of the EORTC QLQ-C15-PAL questionnaire for palliative care
scoring.QLQBN20 (data, id, time) Scoring of the EORTC QLQ-BN20 brain cancer module
scoring.QLQBR23 (data, id, time) Scoring of the EORTC QLQ-BR23 breast cancer module
scoring.QLQCR29 (data, id, time) Scoring of the EORTC QLQ-CR29 colorectal module
scoring.QLQCX24 (data, id, time) Scoring of the EORTC QLQ-CX24 cervical cancer module
scoring.QLQELD14 (data, id, time) Scoring of the EORTC QLQ-ELD14 module for elderly cancer patients
scoring.QLQEN24 (data, id, time) Scoring of the EORTC QLQ-EN24 endometrial cancer module
scoring.QLQHCC18 (data, id, time) Scoring of the EORTC QLQ-HCC18 hepatocellular carcinoma module
scoring.QLQHN35 (data, id, time) Scoring of the EORTC QLQ-H&N35 head and neck cancer module
scoring.QLQINFO25 (data, id, time) Scoring of the EORTC QLQ-INFO25 information module
scoring.QLQLC13 (data, id, time) Scoring of the EORTC QLQ-LC13 lung cancer module
scoring.QLQLMC21 (data, id, time) Scoring of the EORTC QLQ-LMC21 liver metastases in colorectal cancer module
scoring.QLQMY20 (data, id, time) Scoring of the EORTC QLQ-MY20 myeloma module
scoring.QLQOES18 (data, id, time) Scoring of the EORTC QLQ-OES18 oesophageal cancer module
scoring.QLQOG25 (data, id, time) Scoring of the EORTC QLQ-OG25 oesophago-gastric module
scoring.QLQOV28 (data, id, time) Scoring of the EORTC QLQ-OV28 ovarian module
scoring.QLQPR25 (data, id, time) Scoring of the EORTC QLQ-PR25 prostate cancer module
scoring.QLQSTO22 (data, id, time) Scoring of the EORTC QLQ-STO22 gastric module
scoring.INPATSAT32 (data, id, time) Scoring of the EORTC IN-PATSAT32 satisfaction with care questionnaire

Table 1: Summary of the functions in the QoLR package for the scoring of the EORTC questionnaires

The first argument of the function scoring.QLQC30 and other functions for scoring is the name of the dataset with the items comprising the answers to the questionnaire (X parameter). The patient's identification number can be specified in id parameter. A time identification number can also be specified in time parameter in case of a longitudinal HRQOL assessment. The items must be named q1 to qi for the QLQ-C30 (i=30), QLQ-C15-PAL (i=15) and IN-PATSAT32 (i=32) questionnaire. For all other supplementary modules, items must be named q31 to qi, because these modules have to be administered in conjunction to the QLQ-C30 core questionnaire. Moreover, the order of the items in the dataset has to be respected.

For example, the dataqol dataset includes in the QoLR package contains the answers to the 30 items of the QLQ-C30, named q1 to q30, for 40 patients with a longitudinal HRQOL assessment. A sample of the dataqol dataset is given below.

library(QoLR)
## Loading required package: survival
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
data(dataqol)
head(dataqol)
##   Id Arm time date q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16
## 1  1   2    0    0  1  2 NA  2  1  2  1  1  2   2   3   2   1   3   3   2
## 2  1   2    1   43  3  4  3  3  1  2  2  2  1   4   2   4   3   3   3   3
## 3  1   2    2   92  2  2  1  2  1  2  2  1  2   2   2   3   3   2   2   2
## 4  2   2    0    0  1  1  1  1  1  1  1  1  2   3   4   3   4   1   1   4
## 5  2   2    1   55  2  3  2  2  1  1  1  1 NA   3   3   3   3   1   1   4
## 6  2   2    2  149  2  3  2  2  2  1  1  2  2   3   3   4   3   1   1   4
##   q17 q18 q19 q20 q21 q22 q23 q24 q25 q26 q27 q28 q29 q30 death
## 1   2   2   2   1   2   4   2   3   1   2   2   1   5   4    NA
## 2   3   4   3   2   3   3   3   3   1   1   4   1   3   3    NA
## 3   2   2   2   2   3   3   2   3   1   2   3   2   4   4    NA
## 4   1   3   2   1   2   3   3   3   1   1   2   1   4   4   271
## 5   1   3   1   2   1   3   3   2   1   1   3   1   4   5   271
## 6   1   3   2   2   2   3   3   2   1   1   3   1   4   4   271

The scoring.QLQC30 function can thus be applied to estimate the HRQoL scores. The result is a data frame: each variable corresponds to a HRQOL score. The name of the scores are the same as those used in the EORTC scoring manual (Fayers et al. 1999). If a patient's identification number and/or a time's identification number was (were) specified in the id parameter and time parameter respectively, then this (these) variable(s) is (are) replicated in the data frame obtained.

score_dataqol=scoring.QLQC30(dataqol,id="Id", time="time")
head(round(score_dataqol))
##   Id time QL  PF  RF EF  CF SF  FA NV PA DY  SL  AP  CO DI FI
## 1  1    0 58  83  83 42 100 67  33 67 33  0  67   0  33 33  0
## 2  1    1 33  40  67 33  83 50 100 67 33 33  33  67  67 67  0
## 3  1    2 50  80  67 42  83 50  44 33 33  0  33  67  33 33 33
## 4  2    0 50 100 100 42 100 83  67  0 33  0 100 100 100  0  0
## 5  2    1 58  67 100 58  83 67  67  0  0  0  67  67 100  0  0
## 6  2    2 50  60 100 50  83 67  78  0 33 33  67  67 100  0  0

Time to HRQoL score deterioration

The second application of the QoLR package is the estimation of the time to HRQoL score deterioration (Anota et al. 2015). Both time to first deterioration (Hamidou et al. 2011) and time until definitive deterioration (Bonnetain et al. 2010) were implemented.

Estimate the time to HRQoL score deterioration

Time to deterioration

The function TTD allows to estimate the time to first deterioration (Hamidou et al. 2011). Several definitions were implemented depending on the reference score, the minimal clinically important difference, including or not patients with no baseline score and/or no follow-up score as an event, including or not death as an event.

To apply this function, the dataset must respect a general structure. The dataset X must be in long format with the following variables in this order:

  1. Patient identification number;
  2. Variable identifying the HRQOL assessment number;
  3. Date of HRQOL measure;
  4. HRQOL scores;
  5. Other variables, such as the date of death or the treatment arm.

The dataset must also be sorted by patient's identification number and HRQOL measurement time. Dates must be in Julian format (i.e., number of days since a reference time point).

Table 2 summarizes the arguments of this function and their possible values.

Arguments Values
X matrix or data frame
score vector
MCID scalar
ref.init = "baseline" (default)/= "best" /= "previous"
order = 1 (default) /= 2
no_baseline = "censored" (default)/= "event" /= "excluded"
no_follow = "censored" (default)/= "event"
death = NA (default) or vector
sensitivity = FALSE (default)/= TRUE

Table 2: Arguments of the TTD function

The result of this function is a data frame with:

Since both variables event and time are created for each score treated and each definition of TTD, we added the name of the corresponding score as a suffix. As example, if score = c("score1","score2"), then four variables are created: event.score1, time.score1, event.score2 and time.score2.

Moreover, if sensitivity == TRUE, then added variables event and time are created:

To apply the TTD function on the data from dataqol, we have to first modify the scoring_dataqol dataframe in order to respect the requested format of the TTD function.

The date of HRQOL assessment as well as the treatment arm and date of death are available in the dataqol dataset. We thus merged the score_dataqol dataframe with the important variables of the dataqol dataframe as follows:

info=dataqol[,c("Id","time","date","death","Arm")]
dataqol_final=merge(score_dataqol,info,by=c("Id","time"))

Then we reorganized the obtained dataqol_final dataset in order that the date variable appeared in third position:

dataqol_final=dataqol_final[,c(1:2,18,3:17,19:20)]
head(round(dataqol_final))
##   Id time date QL PF RF EF  CF SF  FA NV PA DY SL  AP  CO  DI FI death Arm
## 1  1    0    0 58 83 83 42 100 67  33 67 33  0 67   0  33  33  0    NA   2
## 2  1    1   43 33 40 67 33  83 50 100 67 33 33 33  67  67  67  0    NA   2
## 3  1    2   92 50 80 67 42  83 50  44 33 33  0 33  67  33  33 33    NA   2
## 4 10    0    0 25 50 67 42   0 17 100 50 67  0  0 100 100   0 67    NA   1
## 5 10    1   56 17 33 67 25  67 17 100 67 83  0 67 100   0 100 67    NA   1
## 6 11    3  150 67 80 83 75 100 67  33 17 33  0  0  33   0   0 33   273   2

Finally, the dataset has to be sorted by patient's identification number (Id) and HRQoL measures (time):

dataqol_final=dataqol_final[order(dataqol_final$time),]
dataqol_final=dataqol_final[order(dataqol_final$Id),]
head(round(dataqol_final))
##    Id time date QL  PF  RF EF  CF SF  FA NV PA DY  SL  AP  CO DI FI death
## 1   1    0    0 58  83  83 42 100 67  33 67 33  0  67   0  33 33  0    NA
## 2   1    1   43 33  40  67 33  83 50 100 67 33 33  33  67  67 67  0    NA
## 3   1    2   92 50  80  67 42  83 50  44 33 33  0  33  67  33 33 33    NA
## 25  2    0    0 50 100 100 42 100 83  67  0 33  0 100 100 100  0  0   271
## 26  2    1   55 58  67 100 58  83 67  67  0  0  0  67  67 100  0  0   271
## 27  2    2  149 50  60 100 50  83 67  78  0 33 33  67  67 100  0  0   271
##    Arm
## 1    2
## 2    2
## 3    2
## 25   2
## 26   2
## 27   2

To begin, we can study the time to deterioration as compared to the baseline QL score (ref.init = "baseline") with at least 5-point MCID (MCID = 5) and considering patients with no baseline or with no follow-up measure censoring at baseline or just after baseline (no_baseline = "censored" and no_follow = "censored").

The score QL corresponds to a measure of global HRQOL with a high score represents a high global HRQoL level. In this way, a deterioration corresponds to a decrease of the score (order = 1).

Since the values of these parameters are the default values except for the MCID, we do not need to specify their values and the function can be applied as follows:

ttd1=TTD(dataqol_final, score="QL", MCID=5)
head(ttd1)
##   Id event.QL    time.QL
## 1  1        1 1.41273101
## 2  2        0 4.89527721
## 3  3        1 1.77412731
## 4  4        0 0.03285421
## 5  5        0 0.00000000
## 6  6        1 1.70841889

The result is a data frame with the identification number of patients (Id), the time to deterioration or to censoring in months (time.QL) and a dummy variable (event.QL) indicating whether the patient is deteriorated (event.QL =1) or not (event.QL =0). The suffix “QL” corresponds to the name of the treated score.

If we want to consider patients with no baseline or no follow up as events, we have to fix the parameters no_baseline and no_follow to "event" as follows:

ttd2=TTD(dataqol_final, score="QL", order=1, MCID=5, no_baseline="event",no_follow="event")
head(ttd2)
##   Id event.QL    time.QL
## 1  1        1 1.41273101
## 2  2        0 4.89527721
## 3  3        1 1.77412731
## 4  4        1 0.03285421
## 5  5        1 0.00000000
## 6  6        1 1.70841889

To consider death as an event, we have to specify the value of the death parameter:

ttd3=TTD(dataqol_final, score="QL", MCID=5, death="death")
head(ttd3)
##   Id event.QL  time.QL
## 1  1        1 1.412731
## 2  2        1 8.903491
## 3  3        1 1.774127
## 4  4        1 1.018480
## 5  5        0 0.000000
## 6  6        1 1.708419

You can obtain directly all the sensitivity analyses along with the primary analysis in one application of the function TTD by specify sensitivity = TRUE:

ttd4=TTD(dataqol_final, score="QL", MCID=5, death="death", sensitivity=TRUE)
head(ttd4)
##   Id event.QL    time.QL event.SA1.QL event.SA2.QL time.SA2.QL
## 1  1        1 1.41273101            1            1    1.412731
## 2  2        0 4.89527721            0            1    8.903491
## 3  3        1 1.77412731            1            1    1.774127
## 4  4        0 0.03285421            1            1    1.018480
## 5  5        0 0.00000000            1            0    0.000000
## 6  6        1 1.70841889            1            1    1.708419
##   event.SA3.QL
## 1            1
## 2            1
## 3            1
## 4            1
## 5            1
## 6            1

You can also change the reference score considering the best previous HRQOL score or the previous score (i.e., immediately preceding score) as reference score by specifying ref.init="best" or ref.init="previous" respectively.

In the following example, the reference score is the best previous QL score:

ttd5=TTD(dataqol_final, score="QL", MCID=5, ref.init ="best")
head(ttd5)
##   Id event.QL    time.QL
## 1  1        1 1.41273101
## 2  2        1 4.89527721
## 3  3        1 1.77412731
## 4  4        0 0.03285421
## 5  5        0 1.34702259
## 6  6        1 1.70841889

The functionTTD() can handle simultaneously many scores, functional and/or symptomatic scores. You have to define the name of the studied scores in the score parameter and the order to considered (decrease or increase): order = 1 for the global health status or functional scale and order = 2 for the symptomatic scales. Variables event and time are then created for each score with the score name as a suffix.

The following example represents the application of the TTD function as compared to the baseline score with a 5-point MCID for QL, PF (with order = 1 for both scores) and FA (with order = 2):

ttd6=TTD(dataqol_final, score=c("QL","PF","FA"), order=c(1,1,2), MCID=5)
head(ttd6)
##   Id event.QL    time.QL event.PF    time.PF event.FA    time.FA
## 1  1        1 1.41273101        1 1.41273101        1 1.41273101
## 2  2        0 4.89527721        1 1.80698152        1 4.89527721
## 3  3        1 1.77412731        0 5.15811088        0 5.15811088
## 4  4        0 0.03285421        0 0.03285421        0 0.03285421
## 5  5        0 0.00000000        0 1.34702259        0 0.00000000
## 6  6        1 1.70841889        1 1.70841889        1 1.70841889

Time until definitive deterioration

The time until definitive deterioration is studied with the TUDD function, quite similar to the TTD function.

The next Table 3 summarizes the arguments of this function.

Arguments Values
X matrix or data frame
score vector
MCID vector
ref.init = "baseline" (default)/= "best" /= "previous"
ref.def = "def1" (default)/= "def2" /= "def3"
order = 1 (default) /= 2
no_baseline = "censored" (default)/= "event" /= "excluded"
no_follow = "censored" (default)/= "event"
death = NA (default) or vector
sensitivity = FALSE (default)/= TRUE

Table 3 Arguments of the TUDD function

Only one supplementary parameter as compared to TTD() function is available: the parameter ref.def in which you can specify the notion of “definitive deterioration” according to the proposed definitions :

Moreover, in this function, you can performed sensitivity analysis according to the MCID, thus the MCID parameter is a vector, not a scalar.

By default, the deterioration is defined as a deterioration with a k-point MCID as compared with the baseline score with no further improvement of of more than k points as compared to the baseline score (Bonnetain et al. 2010). The result of the application of this function is fairly similar to that of the TTD. However, for TUDD, the value of the MCID is also specified in the variable names time and event.

The result of the reference definition of TUDD is the following:

tudd1=TUDD(dataqol_final, score="QL", MCID=5)
head(tudd1)
##   Id event.5.QL   time.5.QL
## 1  1          1  1.41273101
## 2  2          0  4.89527721
## 3  3          1  1.77412731
## 4  4          0  0.03285421
## 5  5          0  0.00000000
## 6  6          0 11.49897331

The deterioration can also be definitive as compared to the deterioration observed, i.e., with no further improvement of 5-point MCID as compared to the score obtained at the time of the first deterioration. This definition is applied by setting the parameter ref.def to the value "def3":

tudd2=TUDD(dataqol_final, score = "QL", MCID = 5, ref.def = "def3")
head(tudd2)
##   Id event.5.QL   time.5.QL
## 1  1          1  3.02258727
## 2  2          0  4.89527721
## 3  3          0  5.15811088
## 4  4          0  0.03285421
## 5  5          0  0.00000000
## 6  6          0 11.49897331

As for the time to deterioration, all the sensitivity analyses can be performed simultaneously with the primary definition of TUDD. Moreover, many minimal clinically important difference (MCID) can be specified. An indicator of the MCID value is added as a suffix of the resulting parameters event and time:

tudd3=TUDD(dataqol_final, score="PF", MCID=c(5,10), sensitivity=T)
head(round(tudd3,2))
##   Id event.10.PF time.10.PF event.10.SA1.PF event.5.PF time.5.PF
## 1  1           1       1.41               1          1      1.41
## 2  2           1       1.81               1          1      1.81
## 3  3           0       5.16               0          0      5.16
## 4  4           0       0.03               1          0      0.03
## 5  5           0       1.35               0          0      1.35
## 6  6           0      11.50               0          1      1.71
##   event.5.SA1.PF
## 1              1
## 2              1
## 3              0
## 4              1
## 5              0
## 6              1

In this application, death has not been taken into account. Only two sensitivity analyses were performed: the first regarding patients with no baseline or no follow-up measure and the second on the MCID value.

Plot the Kaplan-Meier survival curve

The plotTTD function allows to obtain the time to deterioration curves estimated according to the Kaplan-Meier method for all patients or by treatment arm (only two groups are allowed). The time parameter is a vector equal to the time to deterioration or the time to censoring and the event parameter is a dummy vector equals to 1 if the patient is deteriorated and 0 if not.

Other information can also be added using options, e.g., at regular time point t for all patients or by treatment arm:

In the case of TTD curves by treatment arm you must give the name of the group variable in the group parameter and the label of each group as you would like it to print in the group.name parameter. The hazard ratio with 95% confidence interval and log-rank test can also be added on the graph (info = TRUE) at a determined position specified by the user (pos.info = c()}).

xlab and ylab correspond to the name of the horizontal and vertical axis respectively. The Table 4 summarizes the arguments of this function.

Arguments Values
time vector
event dummy vector
group = NULL (default)/ vector
nrisk = TRUE (default)/= FALSE
nevent = FALSE (default)/= TRUE
group.names = NULL/ vector
t vector
info = FALSE (default)/= TRUE
pos.info = NULL/ vector
xlab = character
ylab = character

Table 3 Arguments of the plotTTD function

AS example, the Figure 1 corresponds to the TUDD of QL score as compared to the baseline score with a 5-point MCID according treatment arm (Arm parameter). In this graph, we printed the number of patients still at risk at each time point according to treatment arm (nrisk=T). Moreover, the result of the log-rank test and the hazard ratio of Arm 2 vs. Arm 1 is also printed (info=T, pos.info=c(6,0.8)). The hazard ratio (Arm 2 vs. Arm 1) equals \(2.86\) with 95% confidence interval \((1.16-7.09)\) and the result of the log-rank test is \(p=0.018\).

tudd1=TUDD(dataqol_final, score="QL", MCID=5,ref.init="baseline",ref.def="def1")
ttd_1=merge(tudd1,unique(dataqol_final[,c("Id","Arm")]))
plotTTD(ttd_1$time.5.QL,ttd_1$event.5.QL,ttd_1$Arm,nrisk=T,nevent=F,
group.names=c("Arm 1","Arm 2"), t=seq(0,10,2),info=T,pos.info=c(6,0.8),
xlab="time (months)", ylab="probability (%)")

plot of chunk plotTTD

References

Neil K Aaronson, Sam Ahmedzai, Bengt Bergman, Monika Bullinger, Ann Cull, Nicole J Duez, Antonio Filiberti, et al. 1993. “The European Organization for Research and Treatment of Cancer QLQ-C30: A Quality-of-Life Instrument for Use in International Clinical Trials in Oncology.” Journal of the National Cancer Institute 85 (5). Oxford University Press: 365-76.

Amelie Anota, Zeinab Hamidou, Sophie Paget-Bailly, Benoist Chibaudel, Caroline Bascoul-Mollevi, Pascal Auquier, Virginie Westeel, Frederic Fiteni, Christophe Borg, and Franck Bonnetain. 2015. “Time to Health-Related Quality of Life Score Deterioration as a Modality of Longitudinal Analysis for Health-Related Quality of Life Studies in Oncology: Do We Need RECIST for Quality of Life to Achieve Standardization?” Quality of Life Research 24 (1). Springer-Verlag: 5-18.

Franck Bonnetain, Laetitia Dahan, Emilie Maillard, Marc Ychou, Emmanuel Mitry, Pascal Hammel, Jean-Louis Legoux, Philippe Rougier, Laurent Bedenne, and Jean-Francois Seitz. 2010. “Time Until Definitive Quality of Life Score Deterioration as a Means of Longitudinal Analysis for Treatment Trials in Patients with Metastatic Pancreatic Adenocarcinoma.” European Journal of Cancer 46 (15). Elsevier: 2753-62.

Peter M Fayers, Niel K Aaronson, Kristin Bjordal, D Curran, and Mogens Gronvold. 1999. EORTC QLQ-C30 Scoring Manual. EORTC.

Zeinab Hamidou, Tienhan S Dabakuyo, Mariette Mercier, Jean Fraisse, Sylvain Causeret, Herve Tixier, Marie-Martine Padeano, et al. 2011. “Time to Deterioration in Quality of Life Score as a Modality of Longitudinal Analysis in Patients with Breast Cancer.” The Oncologist 16 (10). AlphaMed Press: 1458-68.