25 Interactive Report: Airway Data
Instructions
In today’s exercise, we’ll be writing a report on the Airway dataset published by Himes et al. (2014). The report will have both static and interactive elements, and we’ll deploy it to the Posit Connect Cloud service as well as hosting it on GitHub pages using Shinylive.
We can fork and clone this starter code from GitHub Classroom to get started.
Part 1: Create the README
To start with, recreate the report found on this page, using only static elements (i.e. create a png figure using ggplot2).
- Edit
README.qmdin the starter code. The following files will be helpful:- Top 2000 DEGs from the airway data set - you can see how this was generated at this GitHub gist.
- The bibtex reference file containing the Himes et al. (2014) reference data.
- Render
README.mdand push to GitHub.
Part 2: Add interactivity and publish
Next, we will copy our code from README.qmd to Airway_shiny.qmd and add an interactive element to the report.
Ask your favorite AI agent to add a shiny server element in place of the figure allowing the viewer to change the significance threshold.
Verify that the shiny elements work locally and publish the report to the Posit Connect Cloud service.
Add a link to the Posit Connect Cloud deployment to your README and re-render
README.mdPush your changes to GitHub.
Part 3: Publishing using Shinylive
We should be ready at this point to make some small changes and deploy this report using Shinylive on GitHub pages. As discussed in the lecture, we’ll need to simplify things a bit. Tidyverse packages (e.g. ggplot2) have a lot of dependencies, which can bog down WebR and cause problems with loading the interactive elements.
Copy the code from
Airway_shiny.qmdtoAirway_shinylive.qmdand ask your AI agent to adapt the file to deploy using Shinylive.- Tell it to change the figure to use only base-R graphics.
- Try to deploy using only the
shinylibrary. The fewer the number of packages, the more likely WebR is to load successfully and efficiently. - I think we’ll want to download the data first before reading it into R.
Once you have the page working locally, push to GitHub and publish to GitHub pages:
- GitHub Pages can be enabled under your repository settings -> Pages
- Select “Deploy from branch” under the “Build and deployment” section
- Select the correct branch and directory and save the settings
- We can find the link to our published pages at the top of the page
On the main repository page, open the “About” dalog on the right and paste the link into the website field to make it easier to find your published page in the future.
Also add a link to the Shinylive deployment in
README.md.
Assignment
Make sure all code is pushed to GitHub and submit links to both your deployments on Blackboard (i.e. one link for the Posit Connect deployment, and one link for the GitHub pages deployment).
Study Summary
The following is a summary of the RNA-Seq analysis of airway smooth muscle cells as reported by Himes et al. (2014).
Background & Objective
Asthma is a chronic inflammatory disease of the airways, often managed using glucocorticoids (inhaled steroids). While these drugs are effective at reducing inflammation, the specific molecular mechanisms by which they act on Airway Smooth Muscle (ASM) cells—the cells responsible for airway constriction—were not fully mapped prior to this study.
The researchers aimed to use RNA-seq to:
Characterize the global transcriptional response of ASM cells to glucocorticoids.
Identify novel genes that might mediate the anti-inflammatory effects of these drugs.
Experimental Design
The study utilized four primary human ASM cell lines. These lines were treated with:
Dexamethasone: A potent synthetic glucocorticoid (1 micromolar for 18 hours).
Vehicle Control: To establish a baseline of gene expression.
The researchers performed high-throughput RNA sequencing (RNA-seq), generating approximately 30 million reads per sample. This allowed for a high-resolution view of the transcriptome compared to older microarray technologies.
Key Results
The analysis revealed a robust and consistent transcriptional shift across all four cell lines:
- Differential Expression: See the volcano below for a visualization of differentially expressed genes.
#| '!! shinylive warning !!': |
#| shinylive does not work in self-contained HTML documents.
#| Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 550
library(shiny)
gist <- "https://gist.githubusercontent.com/johnsonra/121eb61bf4b09e4258b78e341b1819e9/raw/9d4d1650713378ce59e06a21b62f940433100a81/top_2000.csv"
download.file(gist, 'top_2000.csv')
top_2000 <- read.csv('top_2000.csv')
top_2000$nl10p <- -log10(top_2000$padj)
ui <- fluidPage(
sliderInput("threshold", label = "Significance threshold (p_adj)",
min = 0.001, max = 0.1, value = 0.05, step = 0.001),
plotOutput("volcano")
)
server <- function(input, output) {
output$volcano <- renderPlot({
top_2000$sig <- top_2000$padj < input$threshold
cols <- adjustcolor(ifelse(top_2000$sig, 'orange', 'black'), alpha.f = 0.3)
# sqrt-scaled y axis: transform data, then relabel
y_ticks <- c(0, 10, 25, 50, 75, 100)
plot(top_2000$log2FoldChange, sqrt(top_2000$nl10p),
col = cols, pch = 16,
xlab = expression(log[2] ~ "Fold Change"),
ylab = expression(-log[10] ~ p),
yaxt = 'n',
bty = 'l')
axis(2, at = sqrt(y_ticks), labels = y_ticks)
legend("topright",
legend = c(paste0("< ", input$threshold),
paste0("\u2265 ", input$threshold)),
col = adjustcolor(c('orange', 'black'), alpha.f = 0.8),
pch = 16,
title = expression(p[adj]),
bty = 'n')
})
}
shinyApp(ui, server)
Identification of CRISPLD2: The most notable finding was the high induction of the gene CRISPLD2 (Cysteine-Rich Secretory Protein LCCL Domain Containing 2). This gene was previously known to be involved in lung development but hadn’t been strongly linked to the glucocorticoid response in asthma.
Functional Enrichment: Down-regulated genes were heavily involved in inflammatory pathways, including those related to cytokine activity and Chemokine signaling (e.g. CCL2, CXCL12).
Validation: The researchers used siRNA “knockdown” experiments to show that when CRISPLD2 is inhibited, ASM cells produce more pro-inflammatory cytokines, suggesting that CRISPLD2 is a key “brake” on inflammation.