Функция выживания с выпадающим меню для каждого гена - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь создать блестящее приложение, в котором вы можете выбрать разные miRNA в моем вводе, а затем построить кривую выживания, используя ggsurvplot. Что-то не так с функциями в fitSurv, но я не уверен, где я делаю это неправильно.

library(dplyr) 
require(survminer)
library(tidyverse)
require(reshape2)
library(shiny)
library(tidyr)
require(survival)

пример данных:

 df.miRNA.cpm <-     structure(list(`86` = c(5.57979757386892, 17.0240095264258, 4.28380151026145, 
13.0457611762755, 12.5531123449841), `175` = c(5.21619202802748, 
15.2849097474841, 2.46719979911461, 10.879496005461, 9.66416497290915
), `217` = c(5.42796072966512, 17.1413407297933, 5.15230233060323, 
12.2646127361351, 12.1031024927547), `394` = c(-1.1390337316217, 
15.1021660424984, 4.63168157763046, 11.1299079134792, 9.55572588729967
), `444` = c(5.06134249676025, 14.5442494311861, -0.399445049232868, 
7.45775961504073, 9.92629675808998)), row.names = c("hsa_let_7a_3p", 
"hsa_let_7a_5p", "hsa_let_7b_3p", "hsa_let_7b_5p", "hsa_let_7c_5p"
), class = "data.frame")

df.miRNA.cpm$miRNA <- rownames(df.miRNA.cpm)


  ss.survival.shiny.miRNA.miRNA <-   structure(list(ID = c("86", "175", "217", "394", "444"), TimeDiff = c(71.0416666666667, 
601.958333333333, 1130, 1393, 117.041666666667), Status = c(1L, 
1L, 0L, 0L, 1L)), row.names = c(NA, 5L), class = "data.frame")

Объедините два примера фрейма данных:

 data_prep.miRNA <- df.miRNA.cpm %>% 
tidyr::pivot_longer(-miRNA, names_to = "ID") %>% 
left_join(ss.survival.shiny.miRNA.miRNA)

Пример объединенных данных:

 > data_prep.miRNA
# A tibble: 153,033 x 5
   miRNA         ID     value TimeDiff Status
   <chr>         <chr>  <dbl>    <dbl>  <int>
 1 hsa_let_7a_3p 86     5.58      71.0      1
 2 hsa_let_7a_3p 175    5.22     602.       1
 3 hsa_let_7a_3p 217    5.43    1130        0
 4 hsa_let_7a_3p 394   -1.14    1393        0
 5 hsa_let_7a_3p 444    5.06     117.       1
 6 hsa_let_7a_3p 618    4.37    1508        0
 7 hsa_let_7a_3p 640    2.46    1409        0
 8 hsa_let_7a_3p 829    0.435    919.       0
 9 hsa_let_7a_3p 851   -1.36     976.       0
10 hsa_let_7a_3p 998    3.87    1196.       0
# … with 153,023 more rows

Для выбранной MicroRNA это работает:

fitSurv <- survfit(Surv(data$TimeDiff, data$Status) ~ paste(cut(value   , quantile(value   , probs = c(0, 0.8)), include.lowest=T)), data = data_prep.miRNA[grep("hsa_let_7a_3p",data_prep.miRNA$miRNA),])

Блестящий:

ui.miRNA <- fluidPage(
  selectInput("MicroRNA", "miRNA", choices = unique(data_prep.miRNA$miRNA)),

  plotOutput("myplot"))

server <- function(input, output, session) {
  
  data_selected <- reactive({
    filter(data_prep.miRNA, miRNA %in% input$MicroRNA)
  })
  
  output$myplot <- renderPlot({
    fitSurv <- survfit(Surv("TimeDiff", "Status") ~ paste(cut("value"   , quantile("value"   , probs = c(0, 0.8)), include.lowest=T)), data = data_selected)
    ggsurvplot(fitSurv ,title="", xlab="Time (Yrs)", ylab="Survival prbability",
               font.main = 8,
               font.x =  8,
               font.y = 8,
               font.tickslab = 8,
               font.legend=8,
               pval.size = 3,
               pval.coord = c(1000,1),
               size=0.4,
               legend = "right",
               censor.size=2,
               break.time.by = 365,
               pval =T,#"p=0.003",#"p=0.41",
               #xscale=365,
               #palette = c("#E7B800", "#2E9FDF"),
               #ggtheme = theme_bw(),
               risk.table = F,
               xscale=365.25,
               xlim=c(0,7*365))
    
    
  })
}

shinyApp(ui.miRNA, server)

1 Ответ

0 голосов
/ 09 июля 2020

В этом утверждении есть несколько ошибок:

fitSurv <- 
  survfit(Surv("TimeDiff", "Status") ~ paste(cut("value", quantile("value", probs = c(0, 0.8)), include.lowest=T)), 
          data = data_selected)

Во-первых, data_selected - это реактивный проводник, а не фрейм данных. Если вы хотите, чтобы фрейм данных возвращал этот реактивный проводник, вы должны использовать круглые скобки: data_selected().

Далее, вы не должны заключать в кавычки переменные: TimeDiff, а не "TimeDiff", et c.

Команда paste бесполезна.

Ваш cut создает только одну категорию и категорию NA. Чтобы получить два интервала в качестве категорий, используйте probs = c(0, 0.8, 1) в quantile.

Наконец, не рекомендуется использовать T для TRUE, потому что T может быть установлен для любого объекта R. , а TRUE - зарезервированная работа.

В заключение, вот исправленный код:

fitSurv <- 
  survfit(Surv(TimeDiff, Status) ~ cut(value, quantile(value, probs = c(0, 0.8, 1)), include.lowest=TRUE), 
          data = data_selected())
...