J'essaye de changer un petit peu ma façon de programmer en utilisant tidyverse et notamment la possibilité de "nester" des data.frame ou des list dans une colonne d'un data.frame. L’intérêt et de pouvoir garder ensemble toutes les étapes d'un développement. Par exemple en utilisant le jeu de données factice suivant :
Code : Tout sélectionner
library(tidyverse)
library(survival)
d <- data.frame(delai = runif(n = 1000, min = 1, max = 100),
status = sample(c(0,1), size = 1000, replace = TRUE),
var_a = sample(c("A", "B"), size = 1000, replace = TRUE),
var_b = sample(c("C", "D"), size = 1000, replace = TRUE)
)
Nous voulons faire l'analyse de plusieurs (en vrai > 10) modèles différents qui peuvent dans le vrai exemple contenir plusieurs variables. On crée donc un tibble qui contient le nom du modèle et la formule que l'on va utiliser pour la survie :
Code : Tout sélectionner
tout <- tibble(variable = c("var_a", "var_b"))
tout <- tout %>% mutate(formule = map_chr(variable, ~ paste("Surv(delai, status) ~", .)))
Ce qui donne :
Code : Tout sélectionner
# A tibble: 2 x 2
variable formule
<chr> <chr>
1 var_a Surv(delai, status) ~ var_a
2 var_b Surv(delai, status) ~ var_b
On ne transforme pas tout de suite l'expression en formule car après c'est plus difficile de travailler avec car le tibble reconnait la formule comme une liste...
Ensuite on fait le survfit dessus :
Code : Tout sélectionner
tout <- tout %>% mutate(survie = map(formule, ~ survfit(as.formula(.), data = d)))
Ce qui donne :
Code : Tout sélectionner
# A tibble: 2 x 3
variable formule survie
<chr> <chr> <list>
1 var_a Surv(delai, status) ~ var_a <S3: survfit>
2 var_b Surv(delai, status) ~ var_b <S3: survfit>
Jusque là tout va bien. Le problème provient du fait que le "call" à la fonction survfit ne contient pas la formule que nous avons crée mais :
Code : Tout sélectionner
> tout$survie[[1]]$call
survfit(formula = as.formula(.), data = d)
Alors que l'on aimerait obtenir la vrai formule (le résultat) à la place de "as.formula(.)"
Ceci devient problématique par la suite car quand on essaye de les plotter via survminer::ggsurvival() la fonction ne retrouve pas (à juste titre) la formule qui doit être utilisée.
Il y a-t-il un moyen de remplacer le as.formula(.) dans le call par la valeur à laquelle il correspond ? Je pensais avoir déjà vu quelque chose de similaire avec substitute() sans réussir à le refaire....
Évidemment on peut le faire facilement avec lapply mais on trouve les avantages de tout mettre dans un tibble non négligeable...
Merci par avance de vos lumières