This document contains the algorithms necessary to code all the outcomes which measure “substance use reduction”. We only include outcomes which result in a single value per subject. These outcomes are:
Group | Endpoint | Class | Reference | Definition | Missing is |
---|---|---|---|---|---|
Reduction | Rate of negative UOS | ratio | Comer et al., 2006 | Percentage of negative UOS during 8 weeks of treatment | Positive |
Reduction | Opioid use rate | ratio | Eissenberg et al., 1997 | subject retained in study at least 17 weeks AND subject showed 4 consecutive negative UDS between weeks 1-17 | Imputed |
Reduction | Rate of negative UOS | ratio | Fiellin et al., 2006 | Percentage of negative UOS | Positive |
Reduction | Rate of negative UOS | ratio | Fudala et al., 2003 | Percentage of negative UOS | Missing |
Reduction | Rate of negative UOS | ratio | Haight et al., 2019 | Percentage of negative UOS from week 5 to week 24 | Positive |
Reduction | Rate of negative UOS | ratio | Jaffe et al., 1972 | Percentage of treatment weeks characterized by negative UOS for patients who completed ≥8 weeks of the study | Imputed |
Reduction | Rate of negative UOS | ratio | Johnson et al., 1992 | Average percentage of negative UOS | Positive |
Reduction | Rate of negative UOS | logical | Kosten et al., 1993 | ≥70% negative UOS during the 24-week trial period | Missing/not imputed |
Reduction | Rate of negative UOS | ratio | Ling et al., 1998 | Mean percentage negative UOS | Missing/not imputed |
Reduction | Rate of negative UOS | integer | Ling et al., 1998 | no. of negative UOS (“treatment effectiveness score”) | Missing/not imputed |
Reduction | Rate of negative UOS | ratio | Ling et al., 2010 | Percentage of negative UOS during weeks 1-16 of the trial | Positive |
Reduction | Opioid use rate | ratio | Ling, Charuvastra, Kaim, & Klett, 1976 | Index of illicit morphine use ([0, 120]) | Positive |
Reduction | Rate of negative UOS | ratio | Lofwall et al., 2018 | Mean percentage of negative UOS for weeks 1 to 24 | Positive |
Reduction | Rate of negative UOS | ratio | Mattick et al., 2003 | “Percentage of clean urines (PCU)”: Rate of negative UOS for the time that the patient remained in the study | Missing/not imputed |
Reduction | Rate of negative UOS | ratio | Mattick et al., 2003 | “treatment effectiveness percentage (TEP)”: Rate of negative UOS for the full 13‐week study (ITT) | Missing/not imputed |
Reduction | Rate of negative UOS | ratio | Pani, Maremmani, Pirastu, Tagliamonte, & Gessa, 2000 | PCC: Percentage ratio of negative UOS and the total number of UOS carried out for each patient during the period of treatment | Positive |
Reduction | Rate of negative UOS | ratio | Pani, Maremmani, Pirastu, Tagliamonte, & Gessa, 2000 | TEC: Percentage ratio between the number of negative UOS and the number of UOS as per protocol | Positive |
Reduction | Opioid use rate | ratio | Petitjean et al., 2001 | Weekly proportion of positive UOS (intent-to-treat and completer analysis) | Positive |
Reduction | Rate of negative UOS | ratio | Preston, Umbricht, & Epstein, 2000 | “Mean intervention percent negative”: Percentage of negative UOS in the treatment phase | Positive |
Reduction | Rate of negative UOS | ratio | Schottenfeld et al., 2005 | Proportion of negative UOS | Missing |
Reduction | Opioid use rate | integer | Schwartz et al., 2006 | Number of positive UOS at 120-day follow-up | Missing/not imputed |
Reduction | Opioid use rate | ratio | Shufman et al., 1994 | Percentage of positive UOS | Missing |
Reduction | Opioid use rate | ratio | Soyka, Zingg, Koller, & Kuefner, 2008 | Monthly rates of positive UOS | Missing/not imputed |
Reduction | Opioid use rate | ratio | Strain, Bigelow, Liebson, & Stitzer, 1999 | Percentage of positive UOS | Missing/not imputed |
Reduction | Opioid use rate | ratio | Strain, Stitzer, Liebson, & Bigelow, 1993 | Rate of positive UOS through the end of the stable dosing period | Not defined |
Reduction | Opioid use rate | ratio | Strain, Stitzer, Liebson, & Bigelow, 1994 | Overall rate of positive UOS | Missing/not imputed |
Reduction | Opioid use rate | ratio | Strain, Stitzer, Liebson, & Bigelow, 1996 | Percentage of positive UOS – Overall AND summarized in consecutive 2-week blocks | Missing/not imputed |
Reduction | Rate of negative UOS | logical | Strang et al., 2010 | ≥50% negative UOS during weeks 14-26 | Positive |
Reduction | Rate of negative UOS | ratio | Strang et al., 2019 | Proportion of negative UOS at the end of the 12‐week post-randomization time point | Positive |
Reduction | Rate of negative UOS | NA | Tanum et al., 2017 | Rate of negative UOS: Number of negative UOS divided by the total number of attended tests (group proportion) | Positive |
Reduction | Rate of negative UOS | ratio | Wolstein et al., 2009 | Number of negative UOS per number of weeks of study participation | Unknown |
Reduction | Opioid use rate | ratio | Woody et al., 2008 | Percentage of positive UOS at weeks 4, 8, and 12 | Imputed |
Reduction | Opioid use rate | integer | Zaks, Fink, & Freedman, 1972 | Number of positive UOS | Not defined |
We will use the table of participant opioid use patterns from the
ctn0094DataExtra
package to calculate these endpoints (we
have a copy of the endpoints in the dataset
outcomesCTN0094
). Importantly, if you wish to apply these
algorithms to calculate endpoints for your data, the participants’
substance use patterns must be stored in the “substance use pattern
word” format shown here. We also show a subset of the data to visualize
a variety of different real substance use patterns.
We first define the following five-value legend:
### Full Data ###
<-
udsOutcomes_df ::outcomesCTN0094 %>%
CTNoteselect(who, usePatternUDS)
# Make a copy
<- udsOutcomes_df
outcomesRed_df
### Examples ###
<- c(1, 163, 210, 242, 4, 17, 13, 1103, 233, 2089)
examplePeople_int %>%
outcomesRed_df filter(who %in% examplePeople_int)
## # A tibble: 10 × 2
## who usePatternUDS
## <dbl> <chr>
## 1 1 ooooooooooooooo
## 2 4 -------------------o-o-o
## 3 13 ------------o-oooooooooo
## 4 17 --++*++++++-++++++-+++-
## 5 163 -o---o---o--o+----------
## 6 210 -++++++++-+++-----------
## 7 233 *+++++++++++o++++++++++o
## 8 242 -----------------------
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o
## 10 2089 ++++---+--------------o-
For example, participant 1 has a use pattern
ooooooooooooooo
(all missing UDS), which means that they
dropped out of the study. In contrast, participant 233 has a use pattern
*+++++++++++o++++++++++o
(nearly all positive UDS): they
did not drop out of the study, but the treatment was completely
ineffective for them. Participant 2089 started the study in a rough
patch, but greatly improved in treatment over time
(++++---+--------------o-
).
Definition: Percentage of negative UOS during 8 weeks of treatment
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
comer2006_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# first 8 weeks of treatment
start = 1, end = 8,
proportion = TRUE
)%>%
) select(who, comer2006_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, comer2006_red)
## # A tibble: 10 × 3
## who usePatternUDS comer2006_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.312
## 5 163 -o---o---o--o+---------- 0.75
## 6 210 -++++++++-+++----------- 0.125
## 7 233 *+++++++++++o++++++++++o 0.0625
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.5
## 10 2089 ++++---+--------------o- 0.375
Definition: Percentage of negative UOS
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
fiellin2006_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, fiellin2006_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, fiellin2006_red)
## # A tibble: 10 × 3
## who usePatternUDS fiellin2006_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 0.875
## 3 13 ------------o-oooooooooo 0.542
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.792
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0208
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.571
## 10 2089 ++++---+--------------o- 0.75
Definition: Percentage of negative UOS; they exclude missing values.
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Drop weeks with missing UDS
mutate(
usePatternPresent = recode_missing_visits(
usePatternUDS,missing_becomes = ""
)%>%
) mutate(
fudala2003_red = count_matches(
use_pattern = usePatternPresent,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, fudala2003_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, fudala2003_red)
## # A tibble: 10 × 3
## who usePatternUDS fudala2003_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.95
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0227
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.769
## 10 2089 ++++---+--------------o- 0.783
Definition: Percentage of negative UOS from week 5 to week 24
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
haight2019_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# The end-of-protocol for our trials is 15-16 weeks
start = 5, end = 15,
proportion = TRUE
)%>%
) select(who, haight2019_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, haight2019_red)
## # A tibble: 10 × 3
## who usePatternUDS haight2019_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 0.818
## 4 17 --++*++++++-++++++-+++- 0.136
## 5 163 -o---o---o--o+---------- 0.636
## 6 210 -++++++++-+++----------- 0.273
## 7 233 *+++++++++++o++++++++++o 0
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.545
## 10 2089 ++++---+--------------o- 0.909
Definition: Percentage of treatment weeks characterized by negative UOS for patients who completed ≥8 weeks of the study; and missing values were imputed to the mode for each participant.
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Mark if participants completed 8 weeks of treatment; remove those who do not
# (but we will add them back in at the end)
mutate(lastWeek_idx = measure_retention(use_pattern = usePatternUDS)) %>%
filter(lastWeek_idx >= 8) %>%
# For participants who stayed in the trials at least 8 weeks, impute their
# missing weeks to their personal most common UDS result; in the event of a
# tie between a negative and a positive result for the mode, the tiebreaker
# is a positive result.
mutate(
usePatternImputed = impute_missing_visits(
use_pattern = usePatternUDS,
method = "mode"
)%>%
) mutate(
jaffe1972_red = count_matches(
usePatternImputed,match_is = "-",
mixed_results_are = "*",
mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, jaffe1972_red) %>%
left_join(outcomesRed_df, ., by = "who") %>%
# Lots of NAs from the participants who did not make it to week 8; replace
# these NAs with 0
replace_na(list(jaffe1972_red = 0))
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, jaffe1972_red)
## # A tibble: 10 × 3
## who usePatternUDS jaffe1972_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.958
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0208
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.829
## 10 2089 ++++---+--------------o- 0.792
Definitions: Average percentage of negative UOS
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
johnson1992_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, johnson1992_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, johnson1992_red)
## # A tibble: 10 × 3
## who usePatternUDS johnson1992_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 0.875
## 3 13 ------------o-oooooooooo 0.542
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.792
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0208
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.571
## 10 2089 ++++---+--------------o- 0.75
Definition: ≥70% negative UOS during the 24-week trial period; missing UDS are excluded
Note: there are multiple definitions of treatment failure in this paper; we provide an algorithm for the definition which results in a single value for each participant.
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Exclude missing visits
mutate(
usePatternPresent = recode_missing_visits(
usePatternUDS,missing_becomes = ""
)%>%
) mutate(
kosten1993B_prop = count_matches(
use_pattern = usePatternPresent,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
start = 1,
end = 15,
proportion = TRUE
)%>%
) mutate(kosten1993B_red = kosten1993B_prop >= 0.7) %>%
select(who, kosten1993B_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, kosten1993B_red)
## # A tibble: 10 × 3
## who usePatternUDS kosten1993B_red
## <dbl> <chr> <lgl>
## 1 1 ooooooooooooooo FALSE
## 2 4 -------------------o-o-o TRUE
## 3 13 ------------o-oooooooooo TRUE
## 4 17 --++*++++++-++++++-+++- FALSE
## 5 163 -o---o---o--o+---------- TRUE
## 6 210 -++++++++-+++----------- FALSE
## 7 233 *+++++++++++o++++++++++o FALSE
## 8 242 ----------------------- TRUE
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o TRUE
## 10 2089 ++++---+--------------o- FALSE
There are two definitions from this paper which we include in the reduction section our library: Mean percentage negative UOS and no. of negative UOS (“treatment effectiveness score”). Both of these outcome definitions exclude missing UDS. We also include an abstinence endpoint from this paper in our “abstinence and relapse endpoints” section.
Definition: Mean percentage negative UOS
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Exclude missing UDS
mutate(
usePatternPresent = recode_missing_visits(
usePatternUDS,missing_becomes = ""
)%>%
) mutate(
ling1998A_red = count_matches(
use_pattern = usePatternPresent,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
start = 1, end = 15,
proportion = TRUE
)%>%
) select(who, ling1998A_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, ling1998A_red)
## # A tibble: 10 × 3
## who usePatternUDS ling1998A_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.233
## 5 163 -o---o---o--o+---------- 0.933
## 6 210 -++++++++-+++----------- 0.267
## 7 233 *+++++++++++o++++++++++o 0.0333
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.733
## 10 2089 ++++---+--------------o- 0.667
Definition: no. of negative UOS (“treatment effectiveness score”)
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
ling1998C_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
end = 15,
mixed_results_are = "*",
mixed_weight = 0.5
)%>%
) select(who, ling1998C_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, ling1998C_red)
## # A tibble: 10 × 3
## who usePatternUDS ling1998C_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 15
## 3 13 ------------o-oooooooooo 13
## 4 17 --++*++++++-++++++-+++- 3.5
## 5 163 -o---o---o--o+---------- 10
## 6 210 -++++++++-+++----------- 4
## 7 233 *+++++++++++o++++++++++o 0.5
## 8 242 ----------------------- 15
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 8
## 10 2089 ++++---+--------------o- 10
Definition: Percentage of negative UOS during weeks 1-16 of the trial
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
ling2010_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# We only have 15 weeks of data from some arms
start = 1, end = 15,
proportion = TRUE
)%>%
) select(who, ling2010_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, ling2010_red)
## # A tibble: 10 × 3
## who usePatternUDS ling2010_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 0.867
## 4 17 --++*++++++-++++++-+++- 0.233
## 5 163 -o---o---o--o+---------- 0.667
## 6 210 -++++++++-+++----------- 0.267
## 7 233 *+++++++++++o++++++++++o 0.0333
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.533
## 10 2089 ++++---+--------------o- 0.667
Definition: Index of illicit morphine use ([0, 120])
The definition in this paper is quite complex, but very well thought out. It is one of our favorite MOUD treatment endpoints because of its flexibility.
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Rule 1: mark induction failures
# The Ling et al. protocol lasted 40 weeks while requiring 7 weeks of data for
# the subjects to be counted as "estimable participants"; our 3 studies each
# lasted at least 15 weeks. Therefore, we should require at least
# (7/40) * 15) ~= 3 weeks of data to consider a participant "estimable"
mutate(
inductFail = measure_retention(usePatternUDS) <= 3
%>%
) mutate(
usePatternTrunc = str_sub(usePatternUDS, end = 15)
%>%
) # Rules 2-4: weighting and scaling visits. The flexibility here is amazing.
# If we think that dropout is worse than positive, then we can reflect that
# in the weights. Ling et al. counted a missing visit as 0.22 of a positive;
# and they use a step function to increase the penalty of a positive UDS
# over time.
mutate(
ling1976o22_use = weight_positive_visits(
use_pattern = usePatternTrunc,
weights_num = c(`+` = 1.0, `*` = 0.5, `o` = 0.22, `-` = 0),
posPenalty_num = rep(1:5, each = 3) # step function for 15 weeks
)%>%
) mutate(
ling1976o22_use = case_when(
~ 120,
inductFail !inductFail ~ ling1976o22_use
),ling1976o22_abs = 120 - ling1976o22_use
%>%
) select(who, ling1976o22_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, ling1976o22_abs)
## # A tibble: 10 × 3
## who usePatternUDS ling1976o22_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 120
## 3 13 ------------o-oooooooooo 119.
## 4 17 --++*++++++-++++++-+++- 18.7
## 5 163 -o---o---o--o+---------- 104.
## 6 210 -++++++++-+++----------- 40
## 7 233 *+++++++++++o++++++++++o 14.1
## 8 242 ----------------------- 120
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 88.9
## 10 2089 ++++---+--------------o- 98.7
We also include a variant of this definition which includes a greater penalty for missing values and a smooth function to increase weights of positive UDS.
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
inductFail = measure_retention(usePatternUDS) <= 3
%>%
) mutate(
usePatternTrunc = str_sub(usePatternUDS, end = 15)
%>%
) mutate(
ling1976o100_use = weight_positive_visits(
use_pattern = usePatternTrunc,
# Higher weight for missing values
weights_num = c(`+` = 0.8, `*` = 0.4, `o` = 1.0, `-` = 0),
# Smooth penalty function for increasing positive UDS
posPenalty_num = seq(
from = 1, to = 5, length.out = str_length(usePatternTrunc)
)
)%>%
) mutate(
ling1976o100_use = case_when(
~ 120,
inductFail !inductFail ~ ling1976o100_use
),ling1976o100_abs = 120 - ling1976o100_use
%>%
) select(who, ling1976o100_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, ling1976o100_abs)
## # A tibble: 10 × 3
## who usePatternUDS ling1976o100_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 120
## 3 13 ------------o-oooooooooo 113.
## 4 17 --++*++++++-++++++-+++- 20.6
## 5 163 -o---o---o--o+---------- 94.2
## 6 210 -++++++++-+++----------- 38.5
## 7 233 *+++++++++++o++++++++++o 10.4
## 8 242 ----------------------- 120
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 82.0
## 10 2089 ++++---+--------------o- 96.9
Definition: Mean percentage of negative UOS for weeks 1 to 24; but urine screens are collected each week for the first 12 weeks, then every other week for weeks 13-24. We project this onto a 15-16 week protocol by requiring UDS each week for the first 7 weeks, then every other week for the next 8. Then, we impute the skipped weeks to be whatever the value of the UDS was from the last visit.
### Define a Visit Pattern (Lattice) ###
<- collapse_lattice(
lofwallLattice_char lattice_patterns = c("o", "_o"),
# For the lattice as defined over 24 weeks, you need 12 weeks of weekly visits
# and 6 sets of alternating "no visit" and "visit" week pairs, or c(12, 6).
# For us, we want 7 weeks straight of weekly visits followed by 4 pairs of
# alternating visits (8 weeks) for a total of 15 weeks.
times = c(7, 4)
) lofwallLattice_char
## [1] "ooooooo_o_o_o_o"
### Calculate the Endpoint ###
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Mark all missing UDS as positive
mutate(
udsPattern = recode_missing_visits(usePatternUDS)
%>%
) # View the current use pattern "through" the Lofwall protocol
mutate(
udsLattice = view_by_lattice(
use_pattern = udsPattern,
lattice_pattern = str_sub(lofwallLattice_char, end = 15) # first 15 weeks
)%>%
) # Impute the visits from the "unobserved" weeks to the last observed week
mutate(
udsLatticeLOCF = impute_missing_visits(
use_pattern = udsLattice,
method = "locf",
# This is only imputing values that we wouldn't have seen because of the
# protocol ("_" means missing by design; "o" means missing)
missing_is = "_",
quietly = TRUE
)%>%
) mutate(
lofwall2018_red = count_matches(
use_pattern = udsLatticeLOCF,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
start = 1, end = 15, # first 15 weeks
proportion = TRUE
)%>%
) select(who, lofwall2018_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, lofwall2018_red)
## # A tibble: 10 × 3
## who usePatternUDS lofwall2018_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 0.8
## 4 17 --++*++++++-++++++-+++- 0.167
## 5 163 -o---o---o--o+---------- 0.733
## 6 210 -++++++++-+++----------- 0.133
## 7 233 *+++++++++++o++++++++++o 0.0333
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.333
## 10 2089 ++++---+--------------o- 0.733
There are also two definitions from this paper included in our library.
Definition: “Percentage of clean urines (PCU)”: Rate of negative UOS for the time that the patient remained in the study
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Find out how long the participant stayed in the study
mutate(lastWeek_idx = measure_retention(use_pattern = usePatternUDS)) %>%
mutate(
mattick2003A_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# Measure proportion of negative UDS only during study participation
start = 1, end = lastWeek_idx,
proportion = TRUE
)%>%
) select(who, mattick2003A_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, mattick2003A_red)
## # A tibble: 10 × 3
## who usePatternUDS mattick2003A_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 0.913
## 3 13 ------------o-oooooooooo 0.929
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.792
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0217
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.588
## 10 2089 ++++---+--------------o- 0.75
Definition: “treatment effectiveness percentage (TEP)”: Rate of negative UOS for the full 13‐week study (ITT)
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
mattick2003B_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# They used a 13-week protocol
start = 1, end = 13,
proportion = TRUE
)%>%
) select(who, mattick2003B_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, mattick2003B_red)
## # A tibble: 10 × 3
## who usePatternUDS mattick2003B_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 0.923
## 4 17 --++*++++++-++++++-+++- 0.269
## 5 163 -o---o---o--o+---------- 0.692
## 6 210 -++++++++-+++----------- 0.154
## 7 233 *+++++++++++o++++++++++o 0.0385
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.462
## 10 2089 ++++---+--------------o- 0.615
There are also two definitions from this paper included in our library.
Definition: PCC: Percentage ratio of negative UOS and the total number of UOS carried out for each patient during the period of treatment
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Remove weeks where participant failed to provide UDS
mutate(
usePatternPresent = recode_missing_visits(
usePatternUDS,missing_becomes = ""
)%>%
) mutate(
pani2000A_red = count_matches(
use_pattern = usePatternPresent,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, pani2000A_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, pani2000A_red)
## # A tibble: 10 × 3
## who usePatternUDS pani2000A_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.95
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0227
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.769
## 10 2089 ++++---+--------------o- 0.783
Definition: TEC: Percentage ratio between the number of negative UOS and the number of UOS as per protocol
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
pani2000B_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, pani2000B_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, pani2000B_red)
## # A tibble: 10 × 3
## who usePatternUDS pani2000B_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 0.875
## 3 13 ------------o-oooooooooo 0.542
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.792
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0208
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.571
## 10 2089 ++++---+--------------o- 0.75
Definition: Weekly proportion of positive UOS (intent-to-treat and completer analysis)
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
udsPattern = recode_missing_visits(usePatternUDS)
%>%
) mutate(
petitjean2001_use = count_matches(
use_pattern = udsPattern,
match_is = "+",
mixed_results_are = "*",
proportion = TRUE
)%>%
) mutate(
petitjean2001_abs = 1 - petitjean2001_use
%>%
) select(who, petitjean2001_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, petitjean2001_abs)
## # A tibble: 10 × 3
## who usePatternUDS petitjean2001_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 0.875
## 3 13 ------------o-oooooooooo 0.542
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.792
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0208
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.571
## 10 2089 ++++---+--------------o- 0.75
Definition: “Mean intervention percent negative”: Percentage of negative UOS in the treatment phase
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
preston2000_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# 13-week protocol used
end = 13,
proportion = TRUE
)%>%
) select(who, preston2000_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, preston2000_red)
## # A tibble: 10 × 3
## who usePatternUDS preston2000_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 0.923
## 4 17 --++*++++++-++++++-+++- 0.269
## 5 163 -o---o---o--o+---------- 0.692
## 6 210 -++++++++-+++----------- 0.154
## 7 233 *+++++++++++o++++++++++o 0.0385
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.462
## 10 2089 ++++---+--------------o- 0.615
Definition: Proportion of negative UOS; exclude missing UDS
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Exclude missing
mutate(
usePatternPresent = recode_missing_visits(
usePatternUDS,missing_becomes = ""
)%>%
) # Count negative
mutate(
schottenfeld2005_red = count_matches(
use_pattern = usePatternPresent,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, schottenfeld2005_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, schottenfeld2005_red)
## # A tibble: 10 × 3
## who usePatternUDS schottenfeld2005_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.95
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0227
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.769
## 10 2089 ++++---+--------------o- 0.783
Definition: Number of positive UOS at 120-day follow-up
This definition is a cohort-level definition, not an individual definition. The individual endpoint would be “was this participant abstinent from the substance of interest at the 120-day follow-up? (17 weeks from randomization). Our participants do not uniformly have 17 weeks of data, so we will assess them at week 15 instead.
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
schwartz2006_abs = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
start = 15, end = 15,
mixed_results_are = "*"
)%>%
) ungroup() %>%
mutate(
schwartz2006_isAbs = schwartz2006_abs == 1
%>%
) select(who, schwartz2006_isAbs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, schwartz2006_isAbs)
## # A tibble: 10 × 3
## who usePatternUDS schwartz2006_isAbs
## <dbl> <chr> <lgl>
## 1 1 ooooooooooooooo FALSE
## 2 4 -------------------o-o-o TRUE
## 3 13 ------------o-oooooooooo FALSE
## 4 17 --++*++++++-++++++-+++- FALSE
## 5 163 -o---o---o--o+---------- TRUE
## 6 210 -++++++++-+++----------- TRUE
## 7 233 *+++++++++++o++++++++++o FALSE
## 8 242 ----------------------- TRUE
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o TRUE
## 10 2089 ++++---+--------------o- TRUE
Definition: Percentage of positive UOS; missing is ignored
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Count "+" UDS; 0 could be complete dropout or all negative
mutate(
shufman1994_useP = count_matches(
use_pattern = usePatternUDS,
match_is = "+",
mixed_results_are = "*",
proportion = TRUE
)%>%
) mutate(shufman1994_absP = 1 - shufman1994_useP) %>%
select(who, shufman1994_absP) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, schwartz2006_isAbs)
## # A tibble: 10 × 3
## who usePatternUDS schwartz2006_isAbs
## <dbl> <chr> <lgl>
## 1 1 ooooooooooooooo FALSE
## 2 4 -------------------o-o-o TRUE
## 3 13 ------------o-oooooooooo FALSE
## 4 17 --++*++++++-++++++-+++- FALSE
## 5 163 -o---o---o--o+---------- TRUE
## 6 210 -++++++++-+++----------- TRUE
## 7 233 *+++++++++++o++++++++++o FALSE
## 8 242 ----------------------- TRUE
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o TRUE
## 10 2089 ++++---+--------------o- TRUE
Definition: Monthly rates of positive UOS; missing is ignored
The paper is here.
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Ignore missing UDS
mutate(
udsPattern = recode_missing_visits(
use_pattern = usePatternUDS,
missing_becomes = ""
)%>%
) # Count "+" UDS; 0 could be complete dropout or all negative
mutate(
soyka2008_use = count_matches(
use_pattern = udsPattern,
match_is = "+",
mixed_results_are = "*",
mixed_weight = 0.5,
proportion = TRUE
)%>%
) mutate(soyka2008_abs = 1 - soyka2008_use) %>%
ungroup() %>%
select(who, soyka2008_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, soyka2008_abs)
## # A tibble: 10 × 3
## who usePatternUDS soyka2008_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 1
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.95
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0227
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.769
## 10 2089 ++++---+--------------o- 0.783
Definition: Rate of positive UOS through the end of the stable dosing period; missing is not defined
Paper here
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Count "+" UDS; 0 could be complete dropout or all negative
mutate(
strain1993_use = count_matches(
use_pattern = usePatternUDS,
match_is = "+",
# The stable dosing period began in week 6
start = 6, end = 15,
mixed_results_are = "*"
)%>%
) mutate(strain1993_abs = 1 - strain1993_use) %>%
select(who, strain1993_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, strain1993_abs)
## # A tibble: 10 × 3
## who usePatternUDS strain1993_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 1
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- -8
## 5 163 -o---o---o--o+---------- 0
## 6 210 -++++++++-+++----------- -6
## 7 233 *+++++++++++o++++++++++o -8
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o -1
## 10 2089 ++++---+--------------o- 0
Definition: Overall rate of positive UOS; missing is ignored
Paper here
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Ignore missing
mutate(
udsPattern = recode_missing_visits(
use_pattern = usePatternUDS,
missing_becomes = ""
)%>%
) # Count "+" UDS; 0 could be complete dropout or all negative
mutate(
strain1994_use = count_matches(
use_pattern = usePatternUDS,
match_is = "+",
mixed_results_are = "*",
proportion = TRUE
)%>%
) mutate(strain1994_abs = 1 - strain1994_use) %>%
select(who, strain1994_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, strain1994_abs)
## # A tibble: 10 × 3
## who usePatternUDS strain1994_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 1
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.958
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.104
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.829
## 10 2089 ++++---+--------------o- 0.792
Definition: Percentage of positive UOS – Overall AND summarized in consecutive 2-week blocks; missing is ignored
Because the “two-weeks blocks” definition results in more than one value per participant, we do not provide it in our library. This definition is now identical to that of Strain, Stitzer, Liebson, & Bigelow (1994).
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Ignore missing
mutate(
udsPattern = recode_missing_visits(
use_pattern = usePatternUDS,
missing_becomes = ""
)%>%
) # Count "+" UDS; 0 could be complete dropout or all negative
mutate(
strain1996_use = count_matches(
use_pattern = udsPattern,
match_is = "+",
mixed_results_are = "*",
proportion = TRUE
)%>%
) mutate(strain1996_abs = 1 - strain1996_use) %>%
select(who, strain1996_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, strain1996_abs)
## # A tibble: 10 × 3
## who usePatternUDS strain1996_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 1
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.95
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0227
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.769
## 10 2089 ++++---+--------------o- 0.783
Definition: Percentage of positive UOS
This paper gave no commentary on how the missing values would be processed, only that the statistical software SAS was capable of handling missing values. SAS, by default, excludes missing values from analyses. Therefore, this definition will also be identical to that of Strain, Stitzer, Liebson, & Bigelow (1994).
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Ignore missing
mutate(
udsPattern = recode_missing_visits(
use_pattern = usePatternUDS,
missing_becomes = ""
)%>%
) # Count "+" UDS; 0 could be complete dropout or all negative
mutate(
strain1999_use = count_matches(
use_pattern = usePatternUDS,
match_is = "+",
mixed_results_are = "*",
proportion = TRUE
)%>%
) mutate(strain1999_abs = 1 - strain1999_use) %>%
select(who, strain1999_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, strain1999_abs)
## # A tibble: 10 × 3
## who usePatternUDS strain1999_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 1
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.958
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.104
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.829
## 10 2089 ++++---+--------------o- 0.792
Definitions: ≥50% negative UOS during weeks 14-26
Our protocols do not uniformly contain 26 weeks of data, so we apply this definition as “the last 12 weeks of the protocol.”
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
cleanProp = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# Syntax to select the LAST visits uses a negative sign; this means "12
# weeks before the end of the data" to "the last week of the data"
start = -12, end = -1,
proportion = TRUE
)%>%
) mutate(strang2010_hasRed = cleanProp >= 0.5) %>%
ungroup() %>%
select(who, strang2010_hasRed) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, strang2010_hasRed)
## # A tibble: 10 × 3
## who usePatternUDS strang2010_hasRed
## <dbl> <chr> <lgl>
## 1 1 ooooooooooooooo FALSE
## 2 4 -------------------o-o-o TRUE
## 3 13 ------------o-oooooooooo FALSE
## 4 17 --++*++++++-++++++-+++- FALSE
## 5 163 -o---o---o--o+---------- TRUE
## 6 210 -++++++++-+++----------- TRUE
## 7 233 *+++++++++++o++++++++++o FALSE
## 8 242 ----------------------- TRUE
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o FALSE
## 10 2089 ++++---+--------------o- TRUE
Definition: Proportion of negative UOS at the end of the 12‐week post-randomization time point
Paper here
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
mutate(
strang2019_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
# Only look at the first 12 weeks after randomization
start = 1, end = 12,
proportion = TRUE
)%>%
) select(who, strang2019_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, strang2019_red)
## # A tibble: 10 × 3
## who usePatternUDS strang2019_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.292
## 5 163 -o---o---o--o+---------- 0.75
## 6 210 -++++++++-+++----------- 0.167
## 7 233 *+++++++++++o++++++++++o 0.0417
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.5
## 10 2089 ++++---+--------------o- 0.583
Definition: Rate of negative UOS: Number of negative UOS divided by the total number of attended tests (group proportion)
Note that this definition as written is a group outcome, not a participant outcome. Therefore, we calculate this for each subject as the “rate of negative UOS for the time that the patient remained in the study.”
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# How long was each subject retained?
mutate(lastWeek_idx = measure_retention(use_pattern = usePatternUDS)) %>%
mutate(
tanum2017_red = count_matches(
use_pattern = usePatternUDS,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
start = 1, end = lastWeek_idx,
proportion = TRUE
)%>%
) select(who, tanum2017_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, tanum2017_red)
## # A tibble: 10 × 3
## who usePatternUDS tanum2017_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 0.913
## 3 13 ------------o-oooooooooo 0.929
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.792
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0217
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.588
## 10 2089 ++++---+--------------o- 0.75
Definition: Number of negative UOS per number of weeks of study participation
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Because we are measuring outcomes only while "participating", remove missing
# weeks from the use pattern
mutate(
usePatternPresent = recode_missing_visits(
usePatternUDS,missing_becomes = ""
)%>%
) mutate(
wolstein2009_red = count_matches(
use_pattern = usePatternPresent,
match_is = "-",
# Mixed results weeks count as half of a negative week
mixed_results_are = "*", mixed_weight = 0.5,
proportion = TRUE
)%>%
) select(who, wolstein2009_red) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, wolstein2009_red)
## # A tibble: 10 × 3
## who usePatternUDS wolstein2009_red
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.239
## 5 163 -o---o---o--o+---------- 0.95
## 6 210 -++++++++-+++----------- 0.542
## 7 233 *+++++++++++o++++++++++o 0.0227
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 0.769
## 10 2089 ++++---+--------------o- 0.783
Definition: Percentage of positive UOS at weeks 4, 8, and 12
This paper contains rather exotic methods for missing value imputation, but the authors remark that setting “missing is positive” did not change their final results. We may include their imputation method in future versions of this code library.
### Define a Visit Pattern (Lattice) ###
<- collapse_lattice(lattice_patterns = "___o", times = 3)
woodyLattice_char woodyLattice_char
## [1] "___o___o___o"
### Calculate the Endpoint ###
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Only observe scheduled UDS
mutate(
udsLattice = view_by_lattice(
use_pattern = usePatternUDS,
lattice_pattern = woodyLattice_char
)%>%
) # Remove the non-protocol weeks
mutate(
udsLattice2 = recode_missing_visits(
use_pattern = udsLattice,
missing_is = "_",
missing_becomes = ""
)%>%
) # Mark missing UDS as "+"
mutate(
udsLattice3 = recode_missing_visits(use_pattern = udsLattice2)
%>%
) # Count "+" UDS; 0 could be complete dropout or all negative
mutate(
woody2008_use = count_matches(
use_pattern = udsLattice3,
match_is = "+",
mixed_results_are = "*",
proportion = TRUE
)%>%
) mutate(woody2008_abs = 1 - woody2008_use) %>%
select(who, woody2008_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, woody2008_abs)
## # A tibble: 10 × 3
## who usePatternUDS woody2008_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 1
## 3 13 ------------o-oooooooooo 1
## 4 17 --++*++++++-++++++-+++- 0.333
## 5 163 -o---o---o--o+---------- 1
## 6 210 -++++++++-+++----------- 0
## 7 233 *+++++++++++o++++++++++o 0
## 8 242 ----------------------- 1
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 1
## 10 2089 ++++---+--------------o- 0.333
Definition: Number of positive UOS; missing is ignored
<-
outcomesRed_df %>%
outcomesRed_df rowwise() %>%
# Ignore missing
mutate(
udsPattern = recode_missing_visits(
use_pattern = usePatternUDS,
missing_becomes = ""
)%>%
) # Count "+" UDS; 0 could be complete dropout or all negative
mutate(
zaks1972_use = count_matches(
use_pattern = udsPattern,
match_is = "+",
mixed_results_are = "*"
)%>%
) ungroup() %>%
# For each participant, the "abstinent" metric is the number of total weeks
# of study participation - the number of positive weeks
mutate(zaks1972_abs = str_length(udsPattern) - zaks1972_use) %>%
select(who, zaks1972_abs) %>%
left_join(outcomesRed_df, ., by = "who")
%>%
outcomesRed_df filter(who %in% examplePeople_int) %>%
select(who, usePatternUDS, zaks1972_abs)
## # A tibble: 10 × 3
## who usePatternUDS zaks1972_abs
## <dbl> <chr> <dbl>
## 1 1 ooooooooooooooo 0
## 2 4 -------------------o-o-o 21
## 3 13 ------------o-oooooooooo 13
## 4 17 --++*++++++-++++++-+++- 5.5
## 5 163 -o---o---o--o+---------- 19
## 6 210 -++++++++-+++----------- 13
## 7 233 *+++++++++++o++++++++++o 0.5
## 8 242 ----------------------- 23
## 9 1103 ++--oo--o-+-+--o----------o-o-oo++o 20
## 10 2089 ++++---+--------------o- 18
Here is the information concerning the system configuration, packages, and their versions used in this computation:
sessionInfo()
## R version 4.2.0 (2022-04-22)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur/Monterey 10.16
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
##
## locale:
## [1] C/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] forcats_0.5.1 stringr_1.4.0 dplyr_1.0.9 purrr_0.3.4
## [5] readr_2.1.2 tidyr_1.2.0 tibble_3.1.8 ggplot2_3.3.6
## [9] tidyverse_1.3.2 kableExtra_1.3.4 readxl_1.4.0 CTNote_0.1.0
##
## loaded via a namespace (and not attached):
## [1] lattice_0.20-45 svglite_2.1.0 lubridate_1.8.0
## [4] assertthat_0.2.1 digest_0.6.29 utf8_1.2.2
## [7] R6_2.5.1 cellranger_1.1.0 backports_1.4.1
## [10] reprex_2.0.1 evaluate_0.16 highr_0.9
## [13] httr_1.4.3 pillar_1.8.0 rlang_1.0.4
## [16] googlesheets4_1.0.0 rstudioapi_0.13 jquerylib_0.1.4
## [19] Matrix_1.4-1 rmarkdown_2.14 splines_4.2.0
## [22] webshot_0.5.3 googledrive_2.0.0 munsell_0.5.0
## [25] broom_1.0.0 compiler_4.2.0 modelr_0.1.8
## [28] xfun_0.32 pkgconfig_2.0.3 systemfonts_1.0.4
## [31] htmltools_0.5.3 tidyselect_1.1.2 fansi_1.0.3
## [34] viridisLite_0.4.0 crayon_1.5.1 withr_2.5.0
## [37] tzdb_0.3.0 dbplyr_2.2.1 grid_4.2.0
## [40] jsonlite_1.8.0 gtable_0.3.0 lifecycle_1.0.1
## [43] DBI_1.1.3 magrittr_2.0.3 scales_1.2.0
## [46] cli_3.3.0 stringi_1.7.8 cachem_1.0.6
## [49] fs_1.5.2 xml2_1.3.3 bslib_0.4.0
## [52] ellipsis_0.3.2 generics_0.1.3 vctrs_0.4.1
## [55] tools_4.2.0 glue_1.6.2 hms_1.1.1
## [58] survival_3.3-1 fastmap_1.1.0 yaml_2.3.5
## [61] colorspace_2.0-3 gargle_1.2.0 rvest_1.0.2
## [64] knitr_1.39 haven_2.5.0 sass_0.4.2