bio-microbiome-diversity-analysis
SKILL.md
Diversity Analysis
Create phyloseq Object
library(phyloseq)
library(vegan)
library(ggplot2)
seqtab <- readRDS('seqtab_nochim.rds')
taxa <- readRDS('taxa.rds')
metadata <- read.csv('sample_metadata.csv', row.names = 1)
ps <- phyloseq(otu_table(seqtab, taxa_are_rows = FALSE),
tax_table(taxa),
sample_data(metadata))
taxa_names(ps) <- paste0('ASV', seq(ntaxa(ps)))
Alpha Diversity
# Calculate multiple metrics
alpha_div <- estimate_richness(ps, measures = c('Observed', 'Chao1', 'Shannon', 'Simpson'))
alpha_div$SampleID <- rownames(alpha_div)
alpha_div <- merge(alpha_div, sample_data(ps), by = 'row.names')
# Statistical test
kruskal.test(Shannon ~ Group, data = alpha_div)
# Pairwise comparisons
pairwise.wilcox.test(alpha_div$Shannon, alpha_div$Group, p.adjust.method = 'BH')
Alpha Diversity Plots
plot_richness(ps, x = 'Group', measures = c('Observed', 'Shannon')) +
geom_boxplot() +
theme_minimal()
# Custom plot
ggplot(alpha_div, aes(x = Group, y = Shannon, fill = Group)) +
geom_boxplot() +
geom_jitter(width = 0.2, alpha = 0.5) +
theme_minimal() +
labs(y = 'Shannon Diversity Index')
Faith's Phylogenetic Diversity
library(picante)
# Requires phylogenetic tree in phyloseq object
# Build tree from ASV sequences
library(DECIPHER)
library(phangorn)
seqs <- refseq(ps)
alignment <- AlignSeqs(seqs, anchor = NA)
phang_align <- phyDat(as(alignment, 'matrix'), type = 'DNA')
dm <- dist.ml(phang_align)
tree <- NJ(dm)
tree <- midpoint(tree)
phy_tree(ps) <- tree
# Calculate Faith's PD
otu_mat <- as.matrix(t(otu_table(ps)))
faith_pd <- pd(otu_mat, phy_tree(ps), include.root = TRUE)
alpha_div$PD <- faith_pd$PD
Rarefaction Curves
# Check if sequencing depth is adequate
rarecurve_data <- vegan::rarecurve(t(otu_table(ps)), step = 100, sample = min(sample_sums(ps)))
# ggplot version with ggrare (install from GitHub)
# devtools::install_github('gauravsk/ranacapa')
library(ranacapa)
p_rare <- ggrare(ps, step = 100, color = 'Group', se = FALSE)
p_rare + theme_minimal() + labs(title = 'Rarefaction Curves')
Rarefaction
# Check sequencing depth
sample_sums(ps)
# Rarefy to minimum depth
ps_rarefied <- rarefy_even_depth(ps, sample.size = min(sample_sums(ps)),
rngseed = 42, replace = FALSE)
Beta Diversity
# Calculate distance matrices
bray <- phyloseq::distance(ps, method = 'bray') # Bray-Curtis
jaccard <- phyloseq::distance(ps, method = 'jaccard') # Jaccard
unifrac <- UniFrac(ps, weighted = TRUE) # Weighted UniFrac (requires tree)
# Ordination
ord_bray <- ordinate(ps, method = 'PCoA', distance = bray)
# Plot
plot_ordination(ps, ord_bray, color = 'Group') +
stat_ellipse(level = 0.95) +
theme_minimal()
PERMANOVA
# Test for group differences
metadata <- data.frame(sample_data(ps))
permanova_result <- adonis2(bray ~ Group, data = metadata, permutations = 999)
permanova_result
# With covariates
adonis2(bray ~ Group + Age + Sex, data = metadata, permutations = 999)
Beta Dispersion
# Test homogeneity of dispersions (assumption of PERMANOVA)
beta_disp <- betadisper(bray, metadata$Group)
permutest(beta_disp)
plot(beta_disp)
NMDS Ordination
ord_nmds <- ordinate(ps, method = 'NMDS', distance = bray)
# Check stress
ord_nmds$stress # Should be < 0.2
plot_ordination(ps, ord_nmds, color = 'Group') +
theme_minimal()
Distance Metrics Comparison
| Metric | Type | Considers Abundance | Phylogeny |
|---|---|---|---|
| Bray-Curtis | Quantitative | Yes | No |
| Jaccard | Binary | No | No |
| UniFrac (unweighted) | Binary | No | Yes |
| UniFrac (weighted) | Quantitative | Yes | Yes |
Related Skills
- amplicon-processing - Generate ASV table
- differential-abundance - Identify taxa driving differences
- data-visualization/ggplot2-fundamentals - Custom diversity plots
Weekly Installs
4
Repository
gptomics/bioskillsInstalled on
claude-code3
windsurf2
trae2
opencode2
codex2
antigravity2