PAaSO/DAP follow-up/longterm-outcome.R

102 lines
4 KiB
R
Raw Permalink Normal View History

2026-08-19 09:27:27 +02:00
library(REDCapR)
library(tidyverse)
readRenviron("/Users/au301842/PAaSO/.Renviron")
token <- Sys.getenv('STROKE_API')
ds <-
redcap_read(
token = token,
redcap_uri = "https://redcap.au.dk/api/",
fields = c(
"forloebid",
"ageforloeb_patiente",
"sex_patiente",
"forloebdato_patiente",
"forloebtid_patiente",
"ankomstdato_basisske",
"ankomsttid_basisske",
"mrsfoer_basisske",
"symptdebexactdato_basisske",
"symptdebexacttid_basisske",
"modtagetsomtrombolysekandidat_basisske",
"vaskdiag_basisske",
"diagnosecerebraltinfarkt_basisske",
"nihss_basisske",
"id_tromboly",
"ankomsttidtrombol_tromboly",
"id_trombekt",
"mdmrs3_tremdrop",
"ankomstdatotrombek_trombekt"
)
)$data
ds_filter <- ds |> filter(diagnosecerebraltinfarkt_basisske=="TRUE")
## Vector to correct arrival time
tid_a <- substr(as.character(ds_filter$forloebtid_patiente),12,19)==""
ds_mod <-
ds_filter |> mutate(mrsfoer_basisske=mrsfoer_basisske-2,
mdmrs3_tremdrop=mdmrs3_tremdrop-1) |>
transmute(onset=as_datetime(paste(substr(
as.character(ds_filter$symptdebexactdato_basisske), 1, 10
), substr(as.character(ds_filter$symptdebexacttid_basisske), 12, 19)
)),
arrival = as_datetime(paste(substr(
as.character(ds_filter$forloebdato_patiente), 1, 10
), ifelse(
tid_a,
substr(as.character(ds_filter$ankomsttid_basisske), 12, 19),
substr(as.character(ds_filter$forloebtid_patiente), 12, 19)
))),
sex=sex_patiente,
age=ageforloeb_patiente,
nihss=nihss_basisske,
ivt=!is.na(id_tromboly),
evt=!is.na(id_trombekt),
mrs_0=factor(ifelse(!mrsfoer_basisske %in% 0:5,NA,mrsfoer_basisske)),
mrs_3=factor(ifelse(!mdmrs3_tremdrop %in% 0:5,NA,mdmrs3_tremdrop)),
delay=as.numeric(difftime(arrival,onset,units="mins")),
# delay_group=cut(delay,breaks = c(0,90,270,420,max(delay)),include.lowest = TRUE,labels = c("<90","90-270","270-420",">420")),
year=as.numeric(substr(as.character(arrival),1,4))
) |>
filter(delay<1440, delay>0) # Only include ptt presenting within 1 day, positive delay
# FØR: 0=Uoplyst | 1=Ukendt | 2=0: Ingen symptomer | 3=1: Ingen synlig funktionsnedsættelse | 4=2: Nogen funktionsnedsættelse | 5=3: Moderat funktionsnesættelse | 6=4: Moderat-svær funktionsnedsættelse | 7=5: Svær funktionsnedsættelse
# EFTER: 0=Ingen symptomer | 1=Ingen synlig funktionsnedsættelse | 2=Nogen funktionsnedsættelse | 3=Moderat funktionsnesættelse | 4=Moderat-svær funktionsnedsættelse | 5=Svær funktionsnedsættelse | 6=Død | 7=Levende, ukendt Ranking score | 8=Ikke tilgængelig info
skimr::skim(ds_mod)
tbl <- table(mRS=ds_mod$mrs_3, Group=ds_mod$delay_group, Strata=ds_mod$adm_year)
rankinPlot::grottaBar(tbl, groupName = "Group", scoreName = "mRS",strataName = "Strata")
ds_sums <- ds_mod |> group_by(year) |> summarise(mrs_3_median=median(as.numeric(mrs_3)-1,na.rm=TRUE),
mrs_3_iqr=paste(quantile(as.numeric(mrs_3)-1,na.rm=TRUE),collapse = ", "),
nihss_median=median(nihss,na.rm=TRUE),
nihss_iqr=paste(quantile(nihss,na.rm=TRUE),collapse = ", "),
n=n(),
norm_days_frac=365.25/as.numeric(difftime(max(arrival),min(arrival),units = "days")),
n_norm=n*norm_days_frac,
ivt_n=sum(ivt),
ivt_f=sum(ivt)/n,
evt_n=sum(evt),
evt_f=sum(evt)/n)
library(ggplot2)
p1 <- ds_mod |> ggplot()+
geom_violin(aes(x=as.factor(year),y=as.numeric(mrs_3), fill = year))
p2 <- ds_sums |> ggplot(aes(x=as.factor(year)))+
geom_line(aes(y=n_norm, group=1))
ds_sums |> ggplot(aes(x=as.factor(year)))+
geom_line(aes(y=ivt_f, group=1))
ds_sums |> ggplot(aes(x=as.factor(year)))+
geom_line(aes(y=evt_f, group=1))