For Loop pour tracer la courbe de survie dans Shiny

I am using the diabetic data set from the survival package in R. Within that dataset, is the column age. If I were to plot time-to-event curves comparing the patients' age, I would have way too many survival curves. I want it so that when I select the "age" button for my input, it splits the age column into 4 groups, so that when I plot the survival curve, I only have 4 curves. I keep getting an error though. Am I writing the loop correctly?

ui <- navbarPage(title = "Diabetic Retinopathy",
### Page 1 ###
tabPanel(title = "Survival Curves",
sidebarLayout(
sidebarPanel(
radioButtons(inputId = "comparison",
label = "Select variable you wish to compare",
choices = c("laser", "age", "eye", "risk"),
selected = "laser")
),
mainPanel(
tabsetPanel(
tabPanel(title = "Plot",
plotOutput(outputId = "curve")),
tabPanel(title = "Summary",
verbatimTextOutput(outputId = "details"))
)
)
)
)
)
server <- function(input, output, session) {
### Page 1 ###
fit <- reactive(
surv_fit(as.formula(paste("Surv(time, status) ~ ",
if(input$comparison == "age") {
for(i in diabetic$age) {
if(i < 15) {
diabetic$age[i] <- "lessthan15"
} else if(i >= 15 & i < 30) {
diabetic$age[i]<- "fifteento30"
} else if(i >= 30 & i < 45) {
diabetic$age[i] <- "thirtyto45"
} else {diabetic$age[i] <- "fortyfiveplus"}
}
} else {return(input$comparison)})), data = diabetic)
)

output$curve <- renderPlot(
ggsurvplot(fit())
)
}
shinyApp(ui, server)

Image du message d'erreur ici


Solution du problème

dans surv_fit(as.formula(paste("Surv(time, status) ~ ",etc., deux choses se sont mélangées :

  • coller le prédicteur (laser, âge,...) à partir de la valeur deinput$comparison

  • manipuler la colonne d' âge de dataframe diabetic - qui ne renvoie cependant aucun terme de formule significatif

  • Vous pouvez ajouter une colonne age_class à vos données dès le début et l'utiliser comme option pour votre sélecteur de comparaison.

    PS : pour convertir le numérique (age) en facteur (age_class) sans if-else-skyscrapers :

    df$age_class <- cut(df$age, 
    breaks=c(-Inf, 15, 30, 45, Inf),
    labels=c("lessthan15","fifteento30",
    "thirtyto45","fortyfiveplus")
    )

    Commentaires

    Posts les plus consultés de ce blog

    Comment signer la connexion OKEx API version 5 avec websockets ?

    La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

    Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"