Fragilità in PS

Caratteristiche generali del campione

Rapporto tra % di accessi e % ricoveri sul totale, per gruppi di età

df %>% 
  group_by(age.gr,) %>% 
  summarise(accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  mutate(p.ricovero = ricoveri/sum(ricoveri),
         p.accessi = accessi/sum(accessi)) %>% 
  pivot_longer(-c(age.gr, accessi, ricoveri), values_to = "prop", names_to = "tipo") %>% 
  ggplot(aes(x = age.gr, y = prop, col = tipo)) +
  geom_point(size = 1.5) + geom_line(aes(x = as.numeric(age.gr)), size = 1.1)+
  xlab("Età")+
  ylab("% Totale")+
  theme_light()+
  scale_y_continuous(labels = scales::percent_format())+
  theme(text=element_text(size=14),
         axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  scale_color_discrete(name = "", labels = c("Accessi", "Ricoveri"))

Percentuale di ricovero per classi di età

df %>% 
  group_by(age.gr,) %>% 
  summarise(accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  mutate(p.ricovero = ricoveri/accessi,
         p.accessi = accessi/sum(accessi)) %>% 
  ggplot(aes(x = age.gr, y = p.ricovero)) +
  geom_bar(stat = "identity", col = "black", fill = "lightblue", linewidth = 1.2) +
  theme_light()+
  xlab("Età")+
  ylab("% Ricoverati")+
  scale_y_continuous(labels = scales::percent_format())+
  theme(text=element_text(size=14),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

Percentuale di ricovero per presa in carico, per età (solo 65+, esclusi ROSSI)

df %>% 
  filter(ETÀ >= 65 & (TRIAGE_INGRESSO != "ROSSO" | TRIAGE_INGRESSO != "1 - EMERGENZA")) %>% 
  group_by(age.gr) %>% 
  summarise(accessi = n(),
            argento = sum(frag),
            ricoveri = sum(ESITO == "Ricoverato"),
            ric.argento= sum(ESITO == "Ricoverato" & frag == 1),
            ric.NA = sum(ESITO == "Ricoverato" & frag == 0)) %>% 
  mutate(p.accesso = accessi/sum(accessi),
         p.argento = argento/sum(argento))%>% 
  select(age.gr, p.accesso, p.argento) %>% 
  pivot_longer(-age.gr, values_to = "p", names_to = "t") %>% 
  ggplot(aes(x = age.gr, y = p, fill = t))+
  geom_bar(stat = "identity", position = "dodge", col = "black", linewidth = 1.2)+
   xlab("Età")+
  ylab("% Accessi")+
  scale_y_continuous(labels = scales::percent_format())+
  theme(text=element_text(size=14),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  theme_light()+
  scale_fill_discrete(name = "Presa in carico", labels = c("Ordinaria", "Geriatra"))

Percentuale di ricovero per presa in carico, per età (solo 65+, esclusi ROSSI)

df %>% 
  filter(ETÀ >= 65 & (TRIAGE_INGRESSO != "ROSSO" | TRIAGE_INGRESSO != "1 - EMERGENZA")) %>% 
  group_by(age.gr) %>% 
  summarise(accessi = n(),
            argento = sum(frag),
            ricoveri = sum(ESITO == "Ricoverato"),
            ric.argento= sum(ESITO == "Ricoverato" & frag == 1),
            ric.NA = sum(ESITO == "Ricoverato" & frag == 0)) %>% 
  mutate(p.r.arg = ric.argento/argento,
         p.r.NA = ric.NA/(accessi-argento)) %>% 
  select(age.gr, p.r.arg, p.r.NA) %>% 
  pivot_longer(-age.gr, values_to = "p", names_to = "t") %>%
  mutate(t.2 = as.numeric(as.factor(t))*-1) %>% 
  ggplot(aes(x = age.gr, y = p, fill = factor(t.2)))+
  geom_bar(stat = "identity", position = "dodge", col = "black", linewidth = 1.2)+
   xlab("Età")+
  ylab("% Ricoverati")+
  scale_y_continuous(labels = scales::percent_format())+
  theme_light()+
  theme(text=element_text(size=14),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
  scale_fill_discrete(name = "Presa in carico", labels = c("Ordinaria", "Geriatra"))

#I geriatri ricoverano meno over 65 verdi o gialli?

df$triage.2 <- ifelse(df$TRIAGE_INGRESSO == "1 - EMERGENZA", "ROSSO",
                      ifelse(df$TRIAGE_INGRESSO == "2 - URGENZA" | df$TRIAGE_INGRESSO == "3 - URGENZA DIFFERIBILE", "GIALLO",
                             ifelse(df$TRIAGE_INGRESSO == "4 - URGENZA MINORE", "VERDE",
                                    ifelse(df$TRIAGE_INGRESSO == "5 - NON URGENZA", "BIANCO", df$TRIAGE_INGRESSO))))
df$triage.2 <- factor(df$triage.2, levels = c("BIANCO","VERDE","GIALLO","ROSSO"))

df %>% 
  filter(ETÀ >= 65 & (triage.2 == "VERDE" | triage.2 == "GIALLO")) %>% 
  group_by(frag) %>% 
  summarise(accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  mutate(p.ricovero = ricoveri/accessi,
         se = sqrt((p.ricovero * (1-p.ricovero)) / accessi),
         l.b = p.ricovero - 1.96*se,
         u.b = p.ricovero + 1.96*se)
# A tibble: 2 × 7
   frag accessi ricoveri p.ricovero      se    l.b   u.b
  <dbl>   <int>    <int>      <dbl>   <dbl>  <dbl> <dbl>
1     0    3549     1339      0.377 0.00814 0.361  0.393
2     1     156       16      0.103 0.0243  0.0550 0.150

#I geriatri ricoverano in modo diverso gli over65 verdi o gialli??

  df %>% 
  filter(ETÀ >= 65 & (triage.2 == "VERDE" | triage.2 == "GIALLO")) %>% 
  group_by(frag, age.gr) %>% 
  summarise(accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  mutate(p.ricovero = ricoveri/accessi,
         se = sqrt((p.ricovero*(1-p.ricovero))/accessi),
         l.b = p.ricovero - 1.96*se,
         u.b = p.ricovero + 1.96*se)
# A tibble: 12 × 8
# Groups:   frag [2]
    frag age.gr accessi ricoveri p.ricovero     se      l.b   u.b
   <dbl> <fct>    <int>    <int>      <dbl>  <dbl>    <dbl> <dbl>
 1     0 65-69      578      131     0.227  0.0174  0.193   0.261
 2     0 70-74      639      181     0.283  0.0178  0.248   0.318
 3     0 75-79      681      226     0.332  0.0180  0.296   0.367
 4     0 80-84      794      351     0.442  0.0176  0.408   0.477
 5     0 85-89      497      241     0.485  0.0224  0.441   0.529
 6     0 90+        360      209     0.581  0.0260  0.530   0.632
 7     1 65-69        2        1     0.5    0.354  -0.193   1.19 
 8     1 70-74       14        0     0      0       0       0    
 9     1 75-79       25        3     0.12   0.0650 -0.00738 0.247
10     1 80-84       50        5     0.1    0.0424  0.0168  0.183
11     1 85-89       36        5     0.139  0.0576  0.0259  0.252
12     1 90+         29        2     0.0690 0.0471 -0.0233  0.161
df %>% 
  filter(ETÀ >= 65 & (triage.2 == "VERDE" | triage.2 == "GIALLO"))%>% 
  group_by(frag, age.gr) %>% 
  summarise(accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  mutate(p.ricovero = ricoveri/accessi,
         se = sqrt((p.ricovero*(1-p.ricovero))/accessi),
         l.b = p.ricovero - 1.96*se,
         u.b = p.ricovero + 1.96*se) %>% 
  ggplot(aes(x = age.gr, y = p.ricovero, col = factor(frag)))+
  geom_point(size = 1.5)+
  geom_errorbar(aes(ymin = l.b, ymax = u.b), width = .2, size = 1.1, alpha = .7)+
  theme_light() +
  scale_color_discrete(name = "Presa in carico", labels = c("Ordinaria", "Geriatrica"))+
  xlab("Età")+
  ylab("Ricoverati")+
  scale_y_continuous(labels = scales::percent_format())+
  theme(text=element_text(size=14),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

#Si ricovera meno quando ci sono i geriatri?

  df %>% 
  group_by(date) %>% 
  summarise(geriatra = ifelse(sum(frag) >0 ,1,0),
            accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  group_by(geriatra) %>% 
  summarise(tot.acc = sum(accessi),
            tot.ric = sum(ricoveri)) %>% 
  mutate(p.ric = tot.ric/tot.acc,
         se = sqrt((p.ric * (1-p.ric)) / tot.acc),
         l.b = p.ric - 1.96*se,
         u.b = p.ric + 1.96*se)
# A tibble: 2 × 7
  geriatra tot.acc tot.ric p.ric      se   l.b   u.b
     <dbl>   <int>   <int> <dbl>   <dbl> <dbl> <dbl>
1        0    6968    1400 0.201 0.00480 0.192 0.210
2        1    4658     901 0.193 0.00579 0.182 0.205

#Si ricovera in modo diverso nei giorni in cui è presente il geriatra in PS?

  df %>% 
  group_by(date, age.gr) %>% 
  summarise(geriatra = ifelse(sum(frag) >0 ,1,0),
            accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  group_by(geriatra, age.gr) %>% 
  summarise(tot.acc = sum(accessi),
            tot.ric = sum(ricoveri)) %>% 
  mutate(p.ric = tot.ric/tot.acc,
         se = sqrt((p.ric * (1-p.ric)) / tot.acc),
         l.b = p.ric - 1.96*se,
         u.b = p.ric + 1.96*se) %>% 
  ggplot(aes(x = age.gr, y = p.ric, col = factor(geriatra)))+
  geom_point(size = 1.5)+
  geom_errorbar(aes(ymin = l.b, ymax = u.b), width = .2, size = 1.1, alpha = .7)+
  theme_light() +
  scale_color_discrete(name = "Geriatra", labels = c("Assente", "Presente"))+
  xlab("Età")+
  ylab("Ricoverati")+
  scale_y_continuous(labels = scales::percent_format())+
  theme(text=element_text(size=14),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

  df %>% 
    filter(triage.2 != "ARGENTO") %>% 
  group_by(date, triage.2) %>% 
  summarise(geriatra = ifelse(sum(frag) >0 ,1,0),
            accessi = n(),
            ricoveri = sum(ESITO == "Ricoverato")) %>% 
  group_by(geriatra, triage.2) %>% 
  summarise(tot.acc = sum(accessi),
            tot.ric = sum(ricoveri)) %>% 
  mutate(p.ric = tot.ric/tot.acc,
         se = sqrt((p.ric * (1-p.ric)) / tot.acc),
         l.b = p.ric - 1.96*se,
         u.b = p.ric + 1.96*se) %>% 
  ggplot(aes(x = triage.2, y = p.ric, col = factor(geriatra)))+
  geom_point(size = 1.5)+
  geom_errorbar(aes(ymin = l.b, ymax = u.b), width = .2, size = 1.1, alpha = .7)+
  theme_light() +
  scale_color_discrete(name = "Geriatra", labels = c("Assente", "Presente"))+
  xlab("Età")+
  ylab("Ricoverati")+
  scale_y_continuous(labels = scales::percent_format())+
  theme(text=element_text(size=14),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

#divisione per codice

df %>% 
  filter(ETÀ >= 65 & !is.na(triage.2)) %>% 
  group_by(frag, triage.2) %>% 
  summarise(n.accessi = n(),
            n.ricovero = sum(ESITO == "Ricoverato")) %>% 
  mutate(p.ricovero = n.ricovero/n.accessi)
# A tibble: 6 × 5
# Groups:   frag [2]
   frag triage.2 n.accessi n.ricovero p.ricovero
  <dbl> <fct>        <int>      <int>      <dbl>
1     0 BIANCO         107          3     0.0280
2     0 VERDE         2028        452     0.223 
3     0 GIALLO        1521        887     0.583 
4     0 ROSSO          176        146     0.830 
5     1 VERDE          100         11     0.11  
6     1 GIALLO          56          5     0.0893
glm(ifelse(ESITO == "Ricoverato",1,0) ~
      frag + ETÀ + triage.2, data = df, binomial("logit")) %>% broom::tidy(.,exponentiate = TRUE, conf.int = TRUE)
# A tibble: 6 × 7
  term             estimate std.error statistic   p.value   conf.low conf.high
  <chr>               <dbl>     <dbl>     <dbl>     <dbl>      <dbl>     <dbl>
1 (Intercept)      0.000945   0.458      -15.2  2.76e- 52   0.000334   0.00209
2 frag             0.149      0.277       -6.88 5.83e- 12   0.0835     0.249  
3 ETÀ              1.04       0.00139     29.6  5.12e-193   1.04       1.04   
4 triage.2VERDE   11.1        0.452        5.32 1.02e-  7   5.10      31.1    
5 triage.2GIALLO  56.8        0.452        8.94 3.84e- 19  26.1      160.     
6 triage.2ROSSO  236.         0.475       11.5  1.24e- 30 103.       687.     
glm(ifelse(ESITO == "Ricoverato",1,0) ~
      frag + ETÀ + triage.2, data = df, binomial("logit")) -> fit

df.synt <- expand.grid(seq(65,100), c(0,1), c("BIANCO","VERDE","GIALLO","ROSSO") ) %>%  as.data.frame

names(df.synt) <- c("ETÀ", "frag", "triage.2")

df.synt$pred.p <- predict(fit, type = "response", newdata = df.synt)

df.synt %>% 
  ggplot(aes(x = ETÀ, y = pred.p, col = triage.2, shape = factor(frag))) +
  geom_point() + geom_line()+
  theme_light()