想要模拟真实世界的情况本身就非常困难。受限于本人数学水平,勉强生成一批均值和方差不断增大的数据,来模拟小鼠肿瘤生长的情况。在这过程中,参考了一些肿瘤方面的文章。
TEM8 marks neovasculogenic tumor-initiating cells in triple-negative breast cancer1
Naturally-occurring spinosyn A and its derivatives function as argininosuccinate synthase activator and tumor inhibitor2
先写一个能生成x只小鼠y天的肿瘤大小数据集的函数
# generate data set generate_tumordata <- function(n=10,min=10 ,max=1800,days=90,group = "Control",id="MouseC"){ mean_seq <- rexp(n=days,rate=1/(max-min)) mean_seq <- mean_seq[mean_seq>min & mean_seq<max] mean_seq <-sort(c(abs(rnorm(n=days-length(mean_seq),mean = (max-min)/2, sd=3)),mean_seq)) sd_seq <- round(seq(3,days,length.out = days),4) data <- map2(mean_seq,sd_seq,rnorm,n=n) day_name <- paste0("day",1:days) data2 <- data.frame( Mouse = paste0(id,1:n), Group=rep(group,n), t(matrix(unlist(data),nrow = days ,byrow = T))) colnames(data2) <- c("Mouse","Group",day_name) return(data2) }
然后在shiny中展示它
library(shiny) library(reshape2) library(tidyverse) library(lubridate) source("function.R") ui <- fluidPage( sidebarLayout( sidebarPanel("Generate a dataset", sliderInput("days","The days of the experiment",min = 3,max = 100,value = 20), numericInput("group","Set the groups",min = 1,max = 8,value = 4), dateRangeInput("date","input date range",start = as.Date("2020-03-05")) ), mainPanel( navbarPage(title = "Page", tabPanel("Data", h3("Data"), dataTableOutput("dataset"), h3("Data summary"), dataTableOutput("sumdata") ), tabPanel("Plot", plotOutput("plotline",width = "1200px",height = "800px")) ) ) ) ) server <- function(input, output, session) { observe({ updateDateRangeInput(inputId = "date",end = input$date[1] +input$days) }) data <- reactive({ days=input$days ngroup = input$group if(ngroup > 1){ maplist <- tibble( max=c(seq(500,1500,length.out = ngroup-1),2000), group=c(paste0("Treat-",LETTERS[1:ngroup-1]),"Control"), id=c(paste0("MouseT",LETTERS[1:ngroup-1]),"MouseC") ) t <- pmap(maplist,generate_tumordata,n=10,days=days) data <- data.frame() for (i in 1:length(t)) { d <- as.data.frame(t[[i]]) data <- rbind(data,d) } } else { data <- generate_tumordata(n=10,days = days) } colnames(data)[c(-1,-2)] <- as.character(ymd(input$date[1])+c(1:days)) return(data) }) data_sum <- reactive({ data_melt<- melt(data(),id.vars = c("Mouse","Group"),variable.name = "days",value.name = "tumor_volumn") Rmisc::summarySE(data_melt,measurevar = "tumor_volumn",groupvars = c("days","Group")) }) plotline <- reactive({ req(input$group) p <- ggplot(data_sum(),aes(x=.data[["days"]],y=.data[["tumor_volumn"]],color=.data[["Group"]],group=.data[["Group"]]))+ geom_line(size=1)+ geom_point(aes(fill=.data[["Group"]]),size=3,shape=21,color="black")+ geom_errorbar(aes(ymax=.data[["tumor_volumn"]]+.data[["sd"]],ymin=.data[["tumor_volumn"]]-.data[["sd"]]), width=0.1, size=0.5)+ theme_classic()+ labs(x="date",y="Tumor volumn")+ theme(axis.text.x = element_text(size = 12,color = "black",angle = 90), axis.text.y = element_text(size = 14,color = "black"), axis.title.x = element_text(size = 16,color = "black"), axis.title.y = element_text(size = 16,color = "black"), axis.ticks = element_line(color = "black",size=1), ) return(p) }) output$dataset <- renderDataTable( data(), options = list(pageLength=15) ) output$sumdata <- renderDataTable( data_sum(), options = list(pageLength=15) ) output$plotline <- renderPlot(plotline()) } shinyApp(ui, server)
访问链接在这link
之后再加入文件上传、下载、筛选等功能。
Xu, J., Yang, X., Deng, Q. et al. TEM8 marks neovasculogenic tumor-initiating cells in triple-negative breast cancer. Nat Commun 12, 4413 (2021). https://doi.org/10.1038/s41467-021-24703-7 ↩︎
Zou, Z., Hu, X., Luo, T. et al. Naturally-occurring spinosyn A and its derivatives function as argininosuccinate synthase activator and tumor inhibitor. Nat Commun 12, 2263 (2021). https://doi.org/10.1038/s41467-021-22235-8 ↩︎