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

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

    Détecter les appuis sur les touches fléchées en JavaScript

    Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"