Enhanced Interpersonal Therapy: Study of the adaptation of the IPT technique proposed by TELEPSI

Data analysis code

Authors
Affiliation

Bruno Braga Montezano

Ana Luiza da Silva Ache

Marcelo Fleck

Published

May 28, 2025

Intro

TODO.

Descriptive data

Code
df <- suppressWarnings(readxl::read_xlsx("./data/df_complete.xlsx"))

tip_df <- df |>
  dplyr::filter(RND_RAND_TTO == "TIP") |>
  dplyr::mutate(
    Sexo = table1::setLabel(Sexo, "Gender"),
    Idade = table1::setLabel(Idade, "Age"),
    Essenciais = table1::setLabel(Essenciais, "Occupational category"),
    G_NPS1 = table1::setLabel(
      G_NPS1,
      "How likely are you to recommend this treatment to a friend or colleague?"
    ),
    G_TRAT = table1::setLabel(
      G_TRAT,
      "How satisfied are you with the treatment?"
    ),
    G_PERC = table1::setLabel(
      G_PERC,
      paste0(
        "Considering your perception of your emotional state, how do you ",
        "feel today about starting treatment?"
      )
    ),
  )

table1::table1(
  ~ Sexo + Idade + Essenciais + G_NPS1 + G_TRAT + G_PERC,
  data = tip_df
)
Overall
(N=448)
Gender
1 Feminino 388 (86.6%)
2 Masculino 60 (13.4%)
Age
Mean (SD) 35.4 (9.03)
Median [Min, Max] 35.0 [19.0, 67.0]
Missing 15 (3.3%)
Occupational category
1 Profissional da Saúde 361 (80.6%)
2 Outro Profissional de Serviços Essenciais 32 (7.1%)
3 Professor(a) 38 (8.5%)
4 Outra categoria profissional 16 (3.6%)
Missing 1 (0.2%)
How likely are you to recommend this treatment to a friend or colleague?
Mean (SD) 9.65 (1.17)
Median [Min, Max] 10.0 [0, 10.0]
Missing 116 (25.9%)
How satisfied are you with the treatment?
1 Muito satisfeito 195 (43.5%)
2 Satisfeito 90 (20.1%)
3 Um pouco satisfeito 11 (2.5%)
4 Nem satisfeito, nem insatisfeito 5 (1.1%)
5 Um pouco insatisfeito 2 (0.4%)
6 Insatisfeito 5 (1.1%)
7 Muito insatisfeito 24 (5.4%)
Missing 116 (25.9%)
Considering your perception of your emotional state, how do you feel today about starting treatment?
2 Moderadamente pior 4 (0.9%)
3 Levemente pior 6 (1.3%)
4 Igual 16 (3.6%)
5 Levemente melhor 70 (15.6%)
6 Moderadamente melhor 135 (30.1%)
7 Muito melhor 101 (22.5%)
Missing 116 (25.9%)

PROMIS outcomes

Code
promis_df <- tip_df |>
  dplyr::select(
    ID,
    dplyr::matches("(B|G|H|I)_PROMIS_(DEP|ANX|IRR|SLEEP)$")
  ) |>
  tidyr::pivot_longer(
    cols = c(dplyr::everything(), -ID),
    names_pattern = "(.)_PROMIS_(.*)$",
    names_to = c("time", "outcome"),
    values_to = "score"
  ) |>
  dplyr::mutate(
    time = factor(time, levels = c("B", "G", "H", "I")),
    outcome = as.factor(outcome)
  )

Depression

All rows

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |> dplyr::filter(outcome == "DEP"),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 447 27.7       0.95       27.1       28.2
2    G 332 17.9       0.95       17.2       18.6
3    H 294 19.1       0.95       18.2       20.0
4    I 249 19.8       0.95       18.8       20.9

Complete rows (per-protocol)

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |>
    dplyr::filter(outcome == "DEP") |>
    dplyr::group_by(ID) |>
    dplyr::filter(all(!is.na(score))) |>
    dplyr::ungroup(),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 201 27.4       0.95       26.5       28.2
2    G 201 17.5       0.95       16.6       18.5
3    H 201 18.9       0.95       17.8       20.0
4    I 201 19.7       0.95       18.5       20.8

Anxiety

All rows

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |> dplyr::filter(outcome == "ANX"),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 447 34.7       0.95       34.4       35.1
2    G 332 23.9       0.95       23.1       24.7
3    H 294 25.6       0.95       24.7       26.5
4    I 249 25.5       0.95       24.4       26.5

Complete rows (per-protocol)

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |>
    dplyr::filter(outcome == "ANX") |>
    dplyr::group_by(ID) |>
    dplyr::filter(all(!is.na(score))) |>
    dplyr::ungroup(),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 201 34.4       0.95       33.9       34.9
2    G 201 23.8       0.95       22.8       24.7
3    H 201 25.3       0.95       24.2       26.5
4    I 201 25.5       0.95       24.4       26.7

Irritability

All rows

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |> dplyr::filter(outcome == "IRR"),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 447 18.9       0.95       18.5       19.2
2    G 332 12.3       0.95       11.8       12.9
3    H 294 14.0       0.95       13.4       14.6
4    I 249 13.8       0.95       13.2       14.5

Complete rows (per-protocol)

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |>
    dplyr::filter(outcome == "IRR") |>
    dplyr::group_by(ID) |>
    dplyr::filter(all(!is.na(score))) |>
    dplyr::ungroup(),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 201 18.4       0.95       17.8       18.9
2    G 201 12.3       0.95       11.6       12.9
3    H 201 13.9       0.95       13.1       14.6
4    I 201 13.7       0.95       13.0       14.4

Sleep

All rows

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |> dplyr::filter(outcome == "SLEEP"),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 447 29.0       0.95       28.4       29.5
2    G 332 22.8       0.95       22.1       23.6
3    H 294 24.4       0.95       23.5       25.2
4    I 249 24.3       0.95       23.4       25.2

Complete rows (per-protocol)

Code
rcompanion::groupwiseMean(
  score ~ time,
  data = promis_df |>
    dplyr::filter(outcome == "SLEEP") |>
    dplyr::group_by(ID) |>
    dplyr::filter(all(!is.na(score))) |>
    dplyr::ungroup(),
  na.rm = TRUE
)
  time   n Mean Conf.level Trad.lower Trad.upper
1    B 201 29.0       0.95       28.1       29.8
2    G 201 23.0       0.95       22.1       24.0
3    H 201 24.2       0.95       23.2       25.2
4    I 201 24.5       0.95       23.5       25.5