print_tab <- function(plt,title) {
   cat("## ",title,"{.unnumbered }"," \n")
  print(
    plt
    )
  plot.new()
  dev.off()
  cat(' \n\n')
}

1 All cells combined


lung = SetIdent(object = lung,value = "program.assignment")
lung  = RenameIdents(object = lung,"metagene.1" = "Hypoxia")
lung  = RenameIdents(object = lung,"metagene.2" = "TNFa")
lung  = RenameIdents(object = lung,"metagene.1" = "cell_cycle")
Error in RenameIdents.Seurat(object = lung, metagene.1 = "cell_cycle") : 
  Cannot find any of the provided identities
 df  = FetchData(object = lung,vars = c("program.assignment","time.point")) %>% 
    filter (program.assignment %in% c("Hypoxia","TNFa")) %>% 
    filter (time.point %in% c("pre-treatment","on-treatment")) %>% 
    droplevels() 
  test = fisher.test(table(df))
    
  library(ggstatsplot)
print(
    ggbarstats(
    df, program.assignment, time.point,
    results.subtitle = FALSE,
    subtitle = paste0(
      "Fisher's exact test", ", p-value = ",
      ifelse(test$p.value < 0.001, "< 0.001", round(test$p.value, 3))
    )
  )
)

cell_percentage(dataset = lung,time.point_var = "time.point")

2 Per patient fisher test


patients_vector = lung$patient.ident %>% unique()
for (patient_name in patients_vector) {
  df  = FetchData(object = lung,vars = c("program.assignment","patient.ident","time.point")) %>% 
    filter (patient.ident == patient_name) %>% 
    filter (program.assignment %in% c("Hypoxia","TNFa")) %>% 
    filter (time.point %in% c("pre-treatment","on-treatment")) %>% 
    select(-patient.ident) %>% 
    droplevels() 
  test = fisher.test(table(df))
    
  library(ggstatsplot)

   p =  ggbarstats(
    df, program.assignment, time.point,
    results.subtitle = FALSE,
    subtitle = paste0(
      "Fisher's exact test", ", p-value = ",
      ifelse(test$p.value < 0.001, "< 0.001", round(test$p.value, 3))
    ),title = patient_name
  )
print_tab(plt = p,title = patient_name)
}

X1071

X1144

X1167

MGH088

MGH1066

X1155

NA

3 Per patient programs ratio


cell_percentage = function(dataset,time.point_var) {
    data =FetchData(object = dataset,vars = c("program.assignment",time.point_var))
  data = data %>% dplyr::count(program.assignment, .[time.point_var]) %>%  dplyr::add_count(program.assignment, wt = n, name = "overall")%>% 
  mutate(proportion = n / overall)   
  
  plt_list = list()
    time.point_var = ensym(time.point_var)
  for (program_name in unique(data$program.assignment)) {
    program_data = data[data$program.assignment == program_name,]
    p = ggplot(data=program_data, aes(x=!!time.point_var, y=proportion)) +geom_bar(stat="identity")+ylab("precentage") +
      ggtitle("program" %>% paste(program_data$program.assignment %>% unique() %>% as.character()))+
      scale_y_continuous(limits = c(0,1))   
      plt_list[[program_name]] = p
  }
  p = ggarrange(plotlist = plt_list )

  return(p)
}
patients_vector = lung$patient.ident %>% unique()
for (patient_name in patients_vector) {
  patient_data = subset(x = lung, subset = patient.ident == patient_name)
  print_tab(plt = cell_percentage(dataset = patient_data,time.point_var = "time.point"),title = patient_name)

}

X1071

X1144

X1167

MGH088

MGH1066

X1155

NA

NA
LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMuRGF0ZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IEZBTFNFCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19kZXB0aDogMQotLS0KCmBgYHtyfQpwcmludF90YWIgPC0gZnVuY3Rpb24ocGx0LHRpdGxlKSB7CiAgIGNhdCgiIyMgIix0aXRsZSwiey51bm51bWJlcmVkIH0iLCIgXG4iKQogIHByaW50KAogICAgcGx0CiAgICApCiAgcGxvdC5uZXcoKQogIGRldi5vZmYoKQogIGNhdCgnIFxuXG4nKQp9CmBgYAoKIyBBbGwgY2VsbHMgY29tYmluZWQgCioqKgpgYGB7cn0KbHVuZyA9IFNldElkZW50KG9iamVjdCA9IGx1bmcsdmFsdWUgPSAicHJvZ3JhbS5hc3NpZ25tZW50IikKbHVuZyAgPSBSZW5hbWVJZGVudHMob2JqZWN0ID0gbHVuZywibWV0YWdlbmUuMSIgPSAiSHlwb3hpYSIpCmx1bmcgID0gUmVuYW1lSWRlbnRzKG9iamVjdCA9IGx1bmcsIm1ldGFnZW5lLjIiID0gIlRORmEiKQpsdW5nICA9IFJlbmFtZUlkZW50cyhvYmplY3QgPSBsdW5nLCJtZXRhZ2VuZS4zIiA9ICJjZWxsX2N5Y2xlIikKCmx1bmckcHJvZ3JhbS5hc3NpZ25tZW50ID0gSWRlbnRzKG9iamVjdCA9IGx1bmcpCmBgYAoKYGBge3J9CiBkZiAgPSBGZXRjaERhdGEob2JqZWN0ID0gbHVuZyx2YXJzID0gYygicHJvZ3JhbS5hc3NpZ25tZW50IiwidGltZS5wb2ludCIpKSAlPiUgCiAgICBmaWx0ZXIgKHByb2dyYW0uYXNzaWdubWVudCAlaW4lIGMoIkh5cG94aWEiLCJUTkZhIikpICU+JSAKICAgIGZpbHRlciAodGltZS5wb2ludCAlaW4lIGMoInByZS10cmVhdG1lbnQiLCJvbi10cmVhdG1lbnQiKSkgJT4lIAogICAgZHJvcGxldmVscygpIAogIHRlc3QgPSBmaXNoZXIudGVzdCh0YWJsZShkZikpCiAgICAKICBsaWJyYXJ5KGdnc3RhdHNwbG90KQpwcmludCgKICAgIGdnYmFyc3RhdHMoCiAgICBkZiwgcHJvZ3JhbS5hc3NpZ25tZW50LCB0aW1lLnBvaW50LAogICAgcmVzdWx0cy5zdWJ0aXRsZSA9IEZBTFNFLAogICAgc3VidGl0bGUgPSBwYXN0ZTAoCiAgICAgICJGaXNoZXIncyBleGFjdCB0ZXN0IiwgIiwgcC12YWx1ZSA9ICIsCiAgICAgIGlmZWxzZSh0ZXN0JHAudmFsdWUgPCAwLjAwMSwgIjwgMC4wMDEiLCByb3VuZCh0ZXN0JHAudmFsdWUsIDMpKQogICAgKQogICkKKQpgYGAKYGBge3J9CmNlbGxfcGVyY2VudGFnZShkYXRhc2V0ID0gbHVuZyx0aW1lLnBvaW50X3ZhciA9ICJ0aW1lLnBvaW50IikKYGBgCgojIFBlciBwYXRpZW50IGZpc2hlciB0ZXN0IHsudGFic2V0IH0KKioqCgpgYGB7ciByZXN1bHRzPSdhc2lzJ30KcGF0aWVudHNfdmVjdG9yID0gbHVuZyRwYXRpZW50LmlkZW50ICU+JSB1bmlxdWUoKQpmb3IgKHBhdGllbnRfbmFtZSBpbiBwYXRpZW50c192ZWN0b3IpIHsKICBkZiAgPSBGZXRjaERhdGEob2JqZWN0ID0gbHVuZyx2YXJzID0gYygicHJvZ3JhbS5hc3NpZ25tZW50IiwicGF0aWVudC5pZGVudCIsInRpbWUucG9pbnQiKSkgJT4lIAogICAgZmlsdGVyIChwYXRpZW50LmlkZW50ID09IHBhdGllbnRfbmFtZSkgJT4lIAogICAgZmlsdGVyIChwcm9ncmFtLmFzc2lnbm1lbnQgJWluJSBjKCJIeXBveGlhIiwiVE5GYSIpKSAlPiUgCiAgICBmaWx0ZXIgKHRpbWUucG9pbnQgJWluJSBjKCJwcmUtdHJlYXRtZW50Iiwib24tdHJlYXRtZW50IikpICU+JSAKICAgIHNlbGVjdCgtcGF0aWVudC5pZGVudCkgJT4lIAogICAgZHJvcGxldmVscygpIAogIHRlc3QgPSBmaXNoZXIudGVzdCh0YWJsZShkZikpCiAgICAKICBsaWJyYXJ5KGdnc3RhdHNwbG90KQoKICAgcCA9ICBnZ2JhcnN0YXRzKAogICAgZGYsIHByb2dyYW0uYXNzaWdubWVudCwgdGltZS5wb2ludCwKICAgIHJlc3VsdHMuc3VidGl0bGUgPSBGQUxTRSwKICAgIHN1YnRpdGxlID0gcGFzdGUwKAogICAgICAiRmlzaGVyJ3MgZXhhY3QgdGVzdCIsICIsIHAtdmFsdWUgPSAiLAogICAgICBpZmVsc2UodGVzdCRwLnZhbHVlIDwgMC4wMDEsICI8IDAuMDAxIiwgcm91bmQodGVzdCRwLnZhbHVlLCAzKSkKICAgICksdGl0bGUgPSBwYXRpZW50X25hbWUKICApCnByaW50X3RhYihwbHQgPSBwLHRpdGxlID0gcGF0aWVudF9uYW1lKQp9CmBgYAoKIyBQZXIgcGF0aWVudCBwcm9ncmFtcyByYXRpbyB7LnRhYnNldH0KKioqCgpgYGB7cn0KY2VsbF9wZXJjZW50YWdlID0gZnVuY3Rpb24oZGF0YXNldCx0aW1lLnBvaW50X3ZhcikgewogICAgZGF0YSA9RmV0Y2hEYXRhKG9iamVjdCA9IGRhdGFzZXQsdmFycyA9IGMoInByb2dyYW0uYXNzaWdubWVudCIsdGltZS5wb2ludF92YXIpKQogIGRhdGEgPSBkYXRhICU+JSBkcGx5cjo6Y291bnQocHJvZ3JhbS5hc3NpZ25tZW50LCAuW3RpbWUucG9pbnRfdmFyXSkgJT4lICBkcGx5cjo6YWRkX2NvdW50KHByb2dyYW0uYXNzaWdubWVudCwgd3QgPSBuLCBuYW1lID0gIm92ZXJhbGwiKSU+JSAKICBtdXRhdGUocHJvcG9ydGlvbiA9IG4gLyBvdmVyYWxsKSAgIAogIAogIHBsdF9saXN0ID0gbGlzdCgpCiAgICB0aW1lLnBvaW50X3ZhciA9IGVuc3ltKHRpbWUucG9pbnRfdmFyKQogIGZvciAocHJvZ3JhbV9uYW1lIGluIHVuaXF1ZShkYXRhJHByb2dyYW0uYXNzaWdubWVudCkpIHsKICAgIHByb2dyYW1fZGF0YSA9IGRhdGFbZGF0YSRwcm9ncmFtLmFzc2lnbm1lbnQgPT0gcHJvZ3JhbV9uYW1lLF0KICAgIHAgPSBnZ3Bsb3QoZGF0YT1wcm9ncmFtX2RhdGEsIGFlcyh4PSEhdGltZS5wb2ludF92YXIsIHk9cHJvcG9ydGlvbikpICtnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpK3lsYWIoInByZWNlbnRhZ2UiKSArCiAgICAgIGdndGl0bGUoInByb2dyYW0iICU+JSBwYXN0ZShwcm9ncmFtX2RhdGEkcHJvZ3JhbS5hc3NpZ25tZW50ICU+JSB1bmlxdWUoKSAlPiUgYXMuY2hhcmFjdGVyKCkpKSsKICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSkgICAKICAgICAgcGx0X2xpc3RbW3Byb2dyYW1fbmFtZV1dID0gcAogIH0KICBwID0gZ2dhcnJhbmdlKHBsb3RsaXN0ID0gcGx0X2xpc3QgKQoKICByZXR1cm4ocCkKfQpgYGAKCgoKCmBgYHtyIHJlc3VsdHM9J2FzaXMnfQpwYXRpZW50c192ZWN0b3IgPSBsdW5nJHBhdGllbnQuaWRlbnQgJT4lIHVuaXF1ZSgpCmZvciAocGF0aWVudF9uYW1lIGluIHBhdGllbnRzX3ZlY3RvcikgewogIHBhdGllbnRfZGF0YSA9IHN1YnNldCh4ID0gbHVuZywgc3Vic2V0ID0gcGF0aWVudC5pZGVudCA9PSBwYXRpZW50X25hbWUpCiAgcHJpbnRfdGFiKHBsdCA9IGNlbGxfcGVyY2VudGFnZShkYXRhc2V0ID0gcGF0aWVudF9kYXRhLHRpbWUucG9pbnRfdmFyID0gInRpbWUucG9pbnQiKSx0aXRsZSA9IHBhdGllbnRfbmFtZSkKCn0KICAKYGBg