raportowanie EU-TIRADS przez ośrodki

Dane dotyczące raportowania EU-TIRADS przez ośrodki zgłaszające operacje tarczycy do rejestru EUROCRINE.

Piotr Wiśniewski
2023-09-11
hide
tar_load(df_unfiltered)

reporting_by_sites <- df_unfiltered %>%
    group_by(country_id,site_id) %>%
    summarize(oper_count = n(), prop_eutirads_reported = mean(as.integer(eutirads_reported))) %>%
  ungroup()

Data used

W tym raporcie wykorzystano wszystkie rekordy uzyskane z rejestru Eurocrine, n=32008, 03.2020-03.2022.

hide
cat("liczba krajów:", length(unique(df_unfiltered$country_id)))
liczba krajów: 10
hide
cat("liczba ośrodków:", length(unique(df_unfiltered$site_id)))
liczba ośrodków: 113
hide
cat("całkowita liczba operacji:", nrow(df_unfiltered))
całkowita liczba operacji: 32008
hide
cat("całkowita liczba pacjentów:",  length(unique(df_unfiltered$patient_id)))
całkowita liczba pacjentów: 31703

Overall characteristics

Całkowita liczba zgłoszeń TIRADS oraz liczebności dla poszczególnych kategorii - zob. raport 02a. opis zbioru - wszyscy

Characteristics per country

hide
df_unfiltered %>%
  count(country_id, site_id) %>% 
  count(country_id) %>%
  select(
    n
  ) %>%
  mutate(
  ) %>%
  tbl_summary(
    label = list(),
    statistic = list(
      all_continuous() ~ "{median} ({min}/{p25}/{p75}/{max})", 
      all_categorical() ~ "{n} ({p}%)"
    )
  )  %>%
  modify_caption("**Table. number of sites per country**") 
Table 1: Table. number of sites per country
Characteristic N = 101
n 7 (1/4/18/36)
1 Median (Minimum/25%/75%/Maximum)
hide
df_unfiltered %>%
  count(country_id, site_id) %>%
  select(
    country_id, -site_id, -n
  ) %>%
  mutate(
  ) %>%
  tbl_summary(
    label = list()
  )  %>%
  modify_caption("**Table. number of sites per country**") 
Table 2: Table. number of sites per country
Characteristic N = 1131
country_id
    1 36 (32%)
    10 20 (18%)
    11 5 (4.4%)
    13 6 (5.3%)
    2 3 (2.7%)
    4 13 (12%)
    5 8 (7.1%)
    6 2 (1.8%)
    8 19 (17%)
    9 1 (0.9%)
1 n (%)
hide
df_unfiltered %>%
  count(country_id)%>% 
  select(
    n
  ) %>%
  mutate(
  ) %>%
  tbl_summary(
    label = list(),
    statistic = list(
      all_continuous() ~ "{median} ({min}/{p25}/{p75}/{max})", 
      all_categorical() ~ "{n} ({p}%)"
    )
  )  %>%
  modify_caption("**Table. number of operations per country**") 
Table 3: Table. number of operations per country
Characteristic N = 101
n 2,627 (100/621/4,023/12,474)
1 Median (Minimum/25%/75%/Maximum)
hide
df_unfiltered %>%
  select(
    country_id, 
  ) %>%
  mutate(
  ) %>%
  tbl_summary(
    label = list()
  )  %>%
  modify_caption("**Table. number of operations per country**") 
Table 4: Table. number of operations per country
Characteristic N = 32,0081
country_id
    1 4,246 (13%)
    10 12,474 (39%)
    11 590 (1.8%)
    13 2,794 (8.7%)
    2 712 (2.2%)
    4 4,801 (15%)
    5 2,460 (7.7%)
    6 479 (1.5%)
    8 3,352 (10%)
    9 100 (0.3%)
1 n (%)
hide
df_unfiltered %>% 
  select(country_id,eutirads_reported) %>% 
  tbl_cross(row=country_id,col=eutirads_reported, percent = "row") %>%
  modify_caption("**Table. number of valid EU-TIRADS reported per country**")
Table 5: Table. number of valid EU-TIRADS reported per country
eutirads_reported Total
FALSE TRUE
country_id
    1 1,789 (42%) 2,457 (58%) 4,246 (100%)
    10 1,609 (13%) 10,865 (87%) 12,474 (100%)
    11 256 (43%) 334 (57%) 590 (100%)
    13 2,404 (86%) 390 (14%) 2,794 (100%)
    2 199 (28%) 513 (72%) 712 (100%)
    4 1,973 (41%) 2,828 (59%) 4,801 (100%)
    5 395 (16%) 2,065 (84%) 2,460 (100%)
    6 382 (80%) 97 (20%) 479 (100%)
    8 1,070 (32%) 2,282 (68%) 3,352 (100%)
    9 6 (6.0%) 94 (94%) 100 (100%)
Total 10,083 (32%) 21,925 (68%) 32,008 (100%)
hide
df_unfiltered %>% 
  count(country_id, eutirads_reported) %>% 
  pivot_wider(names_from = "eutirads_reported", values_from="n") %>% 
  mutate(
    country_total = `FALSE` + `TRUE`, 
    prop_true = `TRUE`/country_total, 
    prop_se = sqrt(prop_true*(1-prop_true)/country_total)
  ) %>% 
  select(prop_true) %>% 
  as_vector() %>% 
  quantile()
       0%       25%       50%       75%      100% 
0.1395848 0.5692418 0.6349158 0.8096996 0.9400000 

Characteristics per site

hide
reporting_by_sites %>%
 filter(oper_count >= 40) %>% 
ggplot(aes(prop_eutirads_reported)) + 
  geom_histogram(binwidth = 0.1) + geom_vline(xintercept = 0.63) + ylab("number of participants") + labs(title="EU-TIRADS reporting across participating sites", subtitle="sites with < 40 operations reported were excluded\n vertical line = median") 

hide
df_unfiltered %>%
  count(site_id) %>%
  select(
    n
  ) %>%
  mutate(
  ) %>%
  tbl_summary(
    label = list(n ~ "n operations"),
    statistic = list(all_continuous() ~ "{median} ({min}/{p25}/{p75}/{max})", all_categorical() ~ "{n} ({p}%)")
  )  %>%
    modify_caption("**Table. number of operations per site**") 
Table 6: Table. number of operations per site
Characteristic N = 1131
n operations 83 (1/43/284/7,506)
1 Median (Minimum/25%/75%/Maximum)
hide
df_unfiltered %>%
  count(site_id) %>%
  ggplot(aes(x=n)) + geom_histogram() + scale_x_continuous(trans="log10") +  labs(title="Number of operations per site")

hide
reporting_by_sites %>% 
  filter(oper_count >= 40) %>% 
  ggplot(aes(x=oper_count,y=prop_eutirads_reported)) + 
    scale_x_continuous(trans = "log10")  + 
    geom_point() + labs(title="EU-TIRADS reporting by low- and high volume sites", subtitle = "one point = one site, sites < 40 oper. were excluded") +
    xlab("Number of surgeries per site") +
    ylab("Proportion of surgeries with EU-TIRADS reported") +
    theme_classic() 

hide
reporting_by_sites %>%
   filter(oper_count >= 40) %>% 
  select(prop_eutirads_reported)%>% 
  tbl_summary(
        statistic = list(all_continuous() ~ "{median} ({min}/{p25}/{p75}/{max})", all_categorical() ~ "{n} ({p}%)")
    
  )%>%
    modify_caption("**Table. Proportion of operations with EU-TIRADS reported.** Sites with < 40 operations were excluded") 
Table 7: Table. Proportion of operations with EU-TIRADS reported. Sites with < 40 operations were excluded
Characteristic N = 891
prop_eutirads_reported 0.63 (0.01/0.25/0.87/0.99)
1 Median (Minimum/25%/75%/Maximum)

EU-TIRADS reporting by indication

hide
df_unfiltered %>% 
  tbl_cross(
    row = oper_indic, 
    col = eutirads_reported, 
    percent="row")
eutirads_reported Total
FALSE TRUE
oper_indic
    Excluding malignancy 3,521 (27%) 9,393 (73%) 12,914 (100%)
    Malignancy 1,128 (20%) 4,529 (80%) 5,657 (100%)
    Compression symptom 2,153 (32%) 4,490 (68%) 6,643 (100%)
    Thyreotoxicosis 2,481 (46%) 2,916 (54%) 5,397 (100%)
    Other 800 (57%) 597 (43%) 1,397 (100%)
Total 10,083 (32%) 21,925 (68%) 32,008 (100%)
hide
df_unfiltered %>% 
  filter(
    !eutirads %in% c("(Missing)","Not classified")
  ) %>%
  mutate(
    eutirads = fct_drop(eutirads)
  ) %>%
  tbl_cross(
    row = oper_indic, 
    col = eutirads, 
    percent="row")
eutirads Total
TR1 TR2 TR3 TR4 TR5
oper_indic
    Excluding malignancy 15 (0.2%) 234 (2.5%) 1,521 (16%) 5,264 (56%) 2,359 (25%) 9,393 (100%)
    Malignancy 25 (0.6%) 24 (0.5%) 143 (3.2%) 549 (12%) 3,788 (84%) 4,529 (100%)
    Compression symptom 40 (0.9%) 1,372 (31%) 1,980 (44%) 863 (19%) 235 (5.2%) 4,490 (100%)
    Thyreotoxicosis 1,015 (35%) 724 (25%) 664 (23%) 386 (13%) 127 (4.4%) 2,916 (100%)
    Other 194 (32%) 150 (25%) 120 (20%) 64 (11%) 69 (12%) 597 (100%)
Total 1,289 (5.9%) 2,504 (11%) 4,428 (20%) 7,126 (33%) 6,578 (30%) 21,925 (100%)