2017-08-25 4 views
4

J'essaye de tracer la courbe de Kaplan-Meyer en utilisant ggsurvplot du paquet de survminer. Je suis incapable de tracer quand je passe un objet survfit enregistré dans une liste. Permettez-moi d'utiliser un jeu de données sur les poumons à titre d'exemple. Tout fonctionne ci-dessous:impossible de tracer la courbe kaplan-meier avec l'objet survfit d'une liste en utilisant ggsurvplot

library("survival") 
library("survminer") 
fit <- survfit(Surv(time, status) ~ sex, data = lung) 
ggsurvplot(fit, 
      conf.int = TRUE, 
      risk.table.col = "strata", 
      palette = c("#E7B800", "#2E9FDF"), 
      xlim = c(0, 600)) 

Maintenant, je fais surviter sur deux variables et enregistrer le résultat du modèle dans une liste. Puis essayé de faire un tracé de KM avec ggsurvplot.

vars <- c('sex', 'ph.ecog') 
l<- map (vars, ~survfit(Surv(time, status)~ get(.x),data = lung)) 
l<- set_names(l, vars) 
ggsurvplot(l$sex, 
      conf.int = TRUE, 
      risk.table.col = "strata", 
      palette = c("#E7B800", "#2E9FDF"), 
      xlim = c(0, 600)) 

J'ai obtenu un message d'erreur comme ceci:

Error in eval(inp, data, env) : object '.x' not found 

Est-ce que quelqu'un sait pourquoi? Comment puis-je résoudre ce problème? Merci beaucoup!

Répondre

0

Premièrement, il faudrait charger le paquet ou les paquets nécessaires. Je suppose que ces jours-ci de nombreux utilisateurs pensent que le fait de courir R signifie que tout le monde est supposé avoir le Tidyverse en place, mais ce n'est pas vrai.

library(tidyverse) 
# run both your code segments, since you will need a small piece of first one 
str(l$sex) 
List of 14 
$ n  : int [1:2] 138 90 
$ time  : num [1:206] 11 12 13 15 26 30 31 53 54 59 ... 
$ n.risk : num [1:206] 138 135 134 132 131 130 129 128 126 125 ... 
$ n.event : num [1:206] 3 1 2 1 1 1 1 2 1 1 ... 
$ n.censor : num [1:206] 0 0 0 0 0 0 0 0 0 0 ... 
$ surv  : num [1:206] 0.978 0.971 0.957 0.949 0.942 ... 
$ type  : chr "right" 
$ strata : Named int [1:2] 119 87 
    ..- attr(*, "names")= chr [1:2] "get(.x)=1" "get(.x)=2" 
$ std.err : num [1:206] 0.0127 0.0147 0.0181 0.0197 0.0211 ... 
$ upper : num [1:206] 1 0.999 0.991 0.987 0.982 ... 
$ lower : num [1:206] 0.954 0.943 0.923 0.913 0.904 ... 
$ conf.type: chr "log" 
$ conf.int : num 0.95 
$ call  : language survfit(formula = Surv(time, status) ~ get(.x), data = lung) 
- attr(*, "class")= chr "survfit" 

Alors, quand vous voyez que strata « noms » -attribut, il a un get( -call en elle et qui semble étouffer la logique de ggsurvplot. Utilisez attr<- pour le remplacer par quelque chose de plus informatif (et moins de "langue-y").

attr(l[['sex']][['strata']], "names") <- c("sex=1", "sex=2") 

Cette expression est dans le « appel » -leaf aussi bien, vous aurez donc besoin de le remplacer par quelque chose de plus traitables. Je pense que ce facile à faire en le remplaçant par le yoiu "call" leaf from the first fit` objet fait:

l$sex$call <- fit$call 
ggsurvplot(l$sex, 
      conf.int = TRUE, 
      risk.table.col = "strata", 
      palette = c("#E7B800", "#2E9FDF"), 
      xlim = c(0, 600)) 

enter image description here