library(mbtools)
theme_set(theme_minimal())
classes <- c(public_client_id = "character", vendor_observation_id = "character")
cohort <- fread("data/manifest.csv", colClasses = classes)[has_close_microbiome == T]

Let’s rad the data and format it to a phyloseq object.

species <- fread("data/S_counts.csv", colClasses = c(sample = "character"))
map <- c(d = "domain", p = "phylum", o = "order", c = "class", f = "family", g = "genus", s = "species")
names(species)[1:7] <- map[names(species)[1:7]]
abundance <- dcast(species, sample ~ species, value.var = "reads", fun.aggregate = sum)
samples <- abundance[, sample]
abundance <- as.matrix(abundance[, "sample" := NULL])
rownames(abundance) <- samples

taxa <- as.matrix(unique(species[, map, with = F]))
rownames(taxa) <- taxa[, "species"]

sdata <- as.data.frame(cohort)
rownames(sdata) <- sdata$vendor_observation_id
sdata <- sdata[rownames(abundance), ]
sdata$subset <- factor(sdata$subset)
sdata$sex <- factor(sdata$sex)

ps <- phyloseq(
    otu_table(abundance, taxa_are_rows = F),
    tax_table(taxa),
    sample_data(sdata)
)
ps <- ps %>% subset_taxa(species != "" & domain == "Bacteria")
rank <- "species"

tests <- association(
    ps, 
    presence_threshold = 0.5,
    min_abundance = 2,
    in_samples = 0.8,
    confounders = c("age", "bmi", "sex"),
    variables = "subset",
    taxa_rank = rank,
    method = "deseq2",
    shrink=F
)
empty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supported
bmi <- association(
    ps, 
    presence_threshold = 0.5,
    min_abundance = 2,
    in_samples = 0.8,
    confounders = c("age", "sex"),
    variables = "bmi",
    taxa_rank = rank,
    method = "deseq2",
    shrink=F
)
empty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supportedempty search patterns are not supported
tests <- rbind(tests, bmi)
tests <- merge.data.table(tests, as.data.frame(as(tax_table(ps), "matrix")), on=rank)
tests[order(padj)]
tests[, "t" := log2FoldChange / lfcSE]
wide <- dcast(tests, reformulate("variable", rank), value.var=c("t", "padj"), fill=0)
wide[, "sig" := "none"]
wide[padj_bmi < 0.05, "sig" := "BMI"]
wide[padj_subset < 0.05, "sig" := "weight loss"]
wide[padj_bmi < 0.05 & padj_subset < 0.05, "sig" := "both"]
wide[, "sig" := factor(sig, levels=c("none", "BMI", "weight loss", "both"))]
ggplot(wide, aes(x=t_bmi, y=t_subset, color=sig)) +
    geom_vline(xintercept = 0, color="gray30", lty="dashed") +
    geom_hline(yintercept = 0, color="gray30", lty="dashed") +
    geom_point() + stat_smooth(method="glm", aes(group = 1)) +
    labs(x = "t statistic BMI", y = "t statistic weight loss") +
    scale_color_manual(values=c(none = "black", BMI = "royalblue", `weight loss`="orange", both = "red"))

ggsave("figures/species_t.png", dpi=300, width=5, height=3)
cor.test(~ t_bmi + t_subset, data=wide, method="spearman")

    Spearman's rank correlation rho

data:  t_bmi and t_subset
S = 57413148, p-value = 1.304e-08
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.2202592 
LS0tCnRpdGxlOiAiU3BlY2llcyBhYnVuZGFuY2VzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmxpYnJhcnkobWJ0b29scykKdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoKSkKYGBgCgpgYGB7cn0KY2xhc3NlcyA8LSBjKHB1YmxpY19jbGllbnRfaWQgPSAiY2hhcmFjdGVyIiwgdmVuZG9yX29ic2VydmF0aW9uX2lkID0gImNoYXJhY3RlciIpCmNvaG9ydCA8LSBmcmVhZCgiZGF0YS9tYW5pZmVzdC5jc3YiLCBjb2xDbGFzc2VzID0gY2xhc3NlcylbaGFzX2Nsb3NlX21pY3JvYmlvbWUgPT0gVF0KYGBgCgpMZXQncyByYWQgdGhlIGRhdGEgYW5kIGZvcm1hdCBpdCB0byBhIHBoeWxvc2VxIG9iamVjdC4KCmBgYHtyfQpzcGVjaWVzIDwtIGZyZWFkKCJkYXRhL1NfY291bnRzLmNzdiIsIGNvbENsYXNzZXMgPSBjKHNhbXBsZSA9ICJjaGFyYWN0ZXIiKSkKbWFwIDwtIGMoZCA9ICJkb21haW4iLCBwID0gInBoeWx1bSIsIG8gPSAib3JkZXIiLCBjID0gImNsYXNzIiwgZiA9ICJmYW1pbHkiLCBnID0gImdlbnVzIiwgcyA9ICJzcGVjaWVzIikKbmFtZXMoc3BlY2llcylbMTo3XSA8LSBtYXBbbmFtZXMoc3BlY2llcylbMTo3XV0KYWJ1bmRhbmNlIDwtIGRjYXN0KHNwZWNpZXMsIHNhbXBsZSB+IHNwZWNpZXMsIHZhbHVlLnZhciA9ICJyZWFkcyIsIGZ1bi5hZ2dyZWdhdGUgPSBzdW0pCnNhbXBsZXMgPC0gYWJ1bmRhbmNlWywgc2FtcGxlXQphYnVuZGFuY2UgPC0gYXMubWF0cml4KGFidW5kYW5jZVssICJzYW1wbGUiIDo9IE5VTExdKQpyb3duYW1lcyhhYnVuZGFuY2UpIDwtIHNhbXBsZXMKCnRheGEgPC0gYXMubWF0cml4KHVuaXF1ZShzcGVjaWVzWywgbWFwLCB3aXRoID0gRl0pKQpyb3duYW1lcyh0YXhhKSA8LSB0YXhhWywgInNwZWNpZXMiXQoKc2RhdGEgPC0gYXMuZGF0YS5mcmFtZShjb2hvcnQpCnJvd25hbWVzKHNkYXRhKSA8LSBzZGF0YSR2ZW5kb3Jfb2JzZXJ2YXRpb25faWQKc2RhdGEgPC0gc2RhdGFbcm93bmFtZXMoYWJ1bmRhbmNlKSwgXQpzZGF0YSRzdWJzZXQgPC0gZmFjdG9yKHNkYXRhJHN1YnNldCkKc2RhdGEkc2V4IDwtIGZhY3RvcihzZGF0YSRzZXgpCgpwcyA8LSBwaHlsb3NlcSgKICAgIG90dV90YWJsZShhYnVuZGFuY2UsIHRheGFfYXJlX3Jvd3MgPSBGKSwKICAgIHRheF90YWJsZSh0YXhhKSwKICAgIHNhbXBsZV9kYXRhKHNkYXRhKQopCmBgYAoKCmBgYHtyfQpwcyA8LSBwcyAlPiUgc3Vic2V0X3RheGEoc3BlY2llcyAhPSAiIiAmIGRvbWFpbiA9PSAiQmFjdGVyaWEiKQpyYW5rIDwtICJzcGVjaWVzIgoKdGVzdHMgPC0gYXNzb2NpYXRpb24oCiAgICBwcywgCiAgICBwcmVzZW5jZV90aHJlc2hvbGQgPSAwLjUsCiAgICBtaW5fYWJ1bmRhbmNlID0gMiwKICAgIGluX3NhbXBsZXMgPSAwLjgsCiAgICBjb25mb3VuZGVycyA9IGMoImFnZSIsICJibWkiLCAic2V4IiksCiAgICB2YXJpYWJsZXMgPSAic3Vic2V0IiwKICAgIHRheGFfcmFuayA9IHJhbmssCiAgICBtZXRob2QgPSAiZGVzZXEyIiwKICAgIHNocmluaz1GCikKYm1pIDwtIGFzc29jaWF0aW9uKAogICAgcHMsIAogICAgcHJlc2VuY2VfdGhyZXNob2xkID0gMC41LAogICAgbWluX2FidW5kYW5jZSA9IDIsCiAgICBpbl9zYW1wbGVzID0gMC44LAogICAgY29uZm91bmRlcnMgPSBjKCJhZ2UiLCAic2V4IiksCiAgICB2YXJpYWJsZXMgPSAiYm1pIiwKICAgIHRheGFfcmFuayA9IHJhbmssCiAgICBtZXRob2QgPSAiZGVzZXEyIiwKICAgIHNocmluaz1GCikKdGVzdHMgPC0gcmJpbmQodGVzdHMsIGJtaSkKdGVzdHMgPC0gbWVyZ2UuZGF0YS50YWJsZSh0ZXN0cywgYXMuZGF0YS5mcmFtZShhcyh0YXhfdGFibGUocHMpLCAibWF0cml4IikpLCBvbj1yYW5rKQp0ZXN0c1tvcmRlcihwYWRqKV0KYGBgCgpgYGB7ciwgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9M30KdGVzdHNbLCAidCIgOj0gbG9nMkZvbGRDaGFuZ2UgLyBsZmNTRV0Kd2lkZSA8LSBkY2FzdCh0ZXN0cywgcmVmb3JtdWxhdGUoInZhcmlhYmxlIiwgcmFuayksIHZhbHVlLnZhcj1jKCJ0IiwgInBhZGoiKSwgZmlsbD0wKQp3aWRlWywgInNpZyIgOj0gIm5vbmUiXQp3aWRlW3BhZGpfYm1pIDwgMC4wNSwgInNpZyIgOj0gIkJNSSJdCndpZGVbcGFkal9zdWJzZXQgPCAwLjA1LCAic2lnIiA6PSAid2VpZ2h0IGxvc3MiXQp3aWRlW3BhZGpfYm1pIDwgMC4wNSAmIHBhZGpfc3Vic2V0IDwgMC4wNSwgInNpZyIgOj0gImJvdGgiXQp3aWRlWywgInNpZyIgOj0gZmFjdG9yKHNpZywgbGV2ZWxzPWMoIm5vbmUiLCAiQk1JIiwgIndlaWdodCBsb3NzIiwgImJvdGgiKSldCmdncGxvdCh3aWRlLCBhZXMoeD10X2JtaSwgeT10X3N1YnNldCwgY29sb3I9c2lnKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3I9ImdyYXkzMCIsIGx0eT0iZGFzaGVkIikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3I9ImdyYXkzMCIsIGx0eT0iZGFzaGVkIikgKwogICAgZ2VvbV9wb2ludCgpICsgc3RhdF9zbW9vdGgobWV0aG9kPSJnbG0iLCBhZXMoZ3JvdXAgPSAxKSkgKwogICAgbGFicyh4ID0gInQgc3RhdGlzdGljIEJNSSIsIHkgPSAidCBzdGF0aXN0aWMgd2VpZ2h0IGxvc3MiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMobm9uZSA9ICJibGFjayIsIEJNSSA9ICJyb3lhbGJsdWUiLCBgd2VpZ2h0IGxvc3NgPSJvcmFuZ2UiLCBib3RoID0gInJlZCIpKQpnZ3NhdmUoImZpZ3VyZXMvc3BlY2llc190LnBuZyIsIGRwaT0zMDAsIHdpZHRoPTUsIGhlaWdodD0zKQpjb3IudGVzdCh+IHRfYm1pICsgdF9zdWJzZXQsIGRhdGE9d2lkZSwgbWV0aG9kPSJzcGVhcm1hbiIpCmBgYA==