Longitudinal profiling of the murine gut microbiome (early vs. late time windows)
| Group | Male | Female | Total |
|---|---|---|---|
| Early (Day0–25) | 102 | 91 | 193 |
| Late (Day124–175) | 69 | 68 | 137 |
| Total | 171 | 159 | 330 |
$ cutadapt \
-g FORWARD_PRIMER_SEQ \
-G REVERSE_PRIMER_SEQ \
--discard-untrimmed \
-o sample_R1.trimmed.fastq.gz \
-p sample_R2.trimmed.fastq.gz \
sample_R1.fastq.gz sample_R2.fastq.gz
# Do not run
base_dir <- "WORKING_DIRECTORY" # path to your project folder
setwd(base_dir)
library(dada2) # ASV inference and DADA2 pipeline functions
library(Biostrings) # DNA/RNA sequence handling (FASTA I/O, string ops)
library(ShortRead) # FASTQ input and quality assessment utilities
library(data.table) # fast, memory-efficient tabular data manipulation
library(ggplot2) # static plotting with the grammar of graphics
library(patchwork) # combine multiple ggplot figures into layouts
library(RColorBrewer) # color palettes (e.g., for plots/heatmaps)
library(plotly) # interactive versions of plots (hover/zoom)
library(phyloseq) # microbiome data structures + analysis/visualization
fastq_dir <- file.path(base_dir, "FASTQ", "raw")
r1_suffix <- "_R1.fastq.gz"
r2_suffix <- "_R2.fastq.gz"
r1_files <- sort(list.files(fastq_dir, pattern = paste0(r1_suffix, "$"), full.names = TRUE))
stop_if_not(length(r1_files) > 0, paste0("No R1 files matching '*", r1_suffix, "' found in: ", fastq_dir))
sample_ids <- vapply(r1_files, derive_sample_id_from_r1, character(1))
stop_if_not(!anyDuplicated(sample_ids), "Duplicate sample IDs derived from R1 filenames.")
names(r1_files) <- sample_ids
if (isTRUE(is_paired_end)) {
r2_files <- file.path(fastq_dir, paste0(sample_ids, r2_suffix))
missing_r2 <- !file.exists(r2_files)
stop_if_not(
!any(missing_r2),
paste0("Missing R2 files for: ", paste(sample_ids[missing_r2], collapse = ", "))
)
names(r2_files) <- sample_ids
} else {
r2_files <- character(0)
}
if (isTRUE(is_paired_end)) {
qp_raw <- filter_qp_inputs(unname(r1_files), unname(r2_files))
p_raw_R1 <- plotQualityProfile(qp_raw$R1, aggregate = TRUE) +
labs(subtitle = "Read 1")
p_raw_R2 <- plotQualityProfile(qp_raw$R2, aggregate = TRUE) +
labs(subtitle = "Read 2")
print(p_raw_R1 + p_raw_R2)
} else {
p_raw_R1 <- plotQualityProfile(unname(r1_files), aggregate = TRUE)
print(p_raw_R1)
}
if (isTRUE(do_cutadapt)) {
cutadapt_dir <- base::file.path(base_dir, "FASTQ", "cutadapt")
ca_r1 <- sort(list.files(cutadapt_dir, pattern = paste0(r1_suffix, "$"), full.names = TRUE))
ca_ids <- vapply(ca_r1, derive_sample_id_from_r1, character(1))
if (isTRUE(is_paired_end)) {
ca_r2 <- file.path(cutadapt_dir, paste0(ca_ids, r2_suffix))
stop_if_not(all(file.exists(ca_r2)), "Missing some cutadapt R2 files.")
qp_afterqc <- filter_qp_inputs(ca_r1, ca_r2)
p_afterqc_R1 <- plotQualityProfile(qp_afterqc$R1, aggregate = TRUE) +
labs(subtitle = "After trimming (cutadapt) — Read 1")
p_afterqc_R2 <- plotQualityProfile(qp_afterqc$R2, aggregate = TRUE) +
labs(subtitle = "After trimming (cutadapt) — Read 2")
print(p_afterqc_R1 + p_afterqc_R2)
filt_in_r1 <- ca_r1
filt_in_r2 <- ca_r2
} else {
qp_afterqc <- list(R1 = ca_r1, R2 = NULL)
p_afterqc_R1 <- plotQualityProfile(qp_afterqc$R1, aggregate = TRUE) +
labs(subtitle = "After trimming (cutadapt) — Read 1")
print(p_afterqc_R1)
filt_in_r1 <- ca_r1
filt_in_r2 <- NULL
}
} else {
filt_in_r1 <- unname(r1_files)
filt_in_r2 <- if (isTRUE(is_paired_end)) unname(r2_files) else NULL
}