---
title: "Cross Domain SPIEC-EASI"
author: 
  - name: Zachary Kurtz
    email: zdkurtz@gmail.com
output: 
  BiocStyle::html_document:
    self_contained: yes
    toc: true
    toc_float: true
    toc_depth: 2
    code_folding: show
date: "`r format(Sys.time(), '%B %d, %Y')`"
package: "SpiecEasi"
version: "2.1.1"
vignette: >
  %\VignetteIndexEntry{Cross Domain SPIEC-EASI}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}  
---

```{r setup, echo = FALSE, eval=TRUE, message=FALSE}
library(BiocStyle)
knitr::opts_knit$set(
  upload.fun = NULL,
  base.url = NULL) # use local files for images
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#"
)
# Override BiocStyle plot hook to avoid css_align issues
knitr::knit_hooks$set(plot = function(x, options) {
  paste0('![', basename(x), '](', x, ')')
})
runchunks = if (Sys.getenv("FORCE_VIGNETTE_REBUILD", "FALSE") == "TRUE") TRUE else FALSE

cache_file <- '../vignette_cache/cross-domain-interactions.RData'
if (!runchunks && file.exists(cache_file)) {
  load(cache_file)
  # If we loaded trimmed objects, reassign them to original names
  if (exists("se.hmp2.trimmed")) {
    se.hmp2 <- se.hmp2.trimmed
    rm(se.hmp2.trimmed)
  }
  if (exists("se.cross.trimmed")) {
    se.cross <- se.cross.trimmed
    rm(se.cross.trimmed)
  }
} else {
  if (!runchunks) {
    message("Cache file cross-domain-interactions.RData not found - building from scratch")
  }
  runchunks <- TRUE
}
saveout   = runchunks

```

# Cross Domain SPIEC-EASI

SpiecEasi now includes a convenience wrapper for dealing with multiple taxa sequenced on the same samples, such as 16S and ITS, as seen in [Tipton, Müller, et. al. (2018)](https://microbiomejournal.biomedcentral.com/articles/10.1186/s40168-017-0393-0). It assumes that each taxa is in its own data matrix and that all samples are in all data matrices in the same order.

Here's an example run from the [HMP2 project](https://ibdmdb.org/tunnel/public/summary.html) with 16S and Proteomics data:

First we load the data:
```{r, eval=TRUE}
library(SpiecEasi)
library(phyloseq)
data(hmp2)
```

Run the cross-domain SPIEC-EASI pipeline:
```{r, eval=runchunks, echo=TRUE, message=FALSE}
se.hmp2 <- spiec.easi(list(hmp216S, hmp2prot), method='mb', nlambda=40,
              lambda.min.ratio=1e-2, pulsar.params = list(thresh = 0.05))
```

Plot the network:
```{r, eval=TRUE}
dtype <- c(rep(1,ntaxa(hmp216S)), rep(2,ntaxa(hmp2prot)))
plot(adj2igraph(getRefit(se.hmp2)), vertex.color=dtype+1, vertex.size=9)
```

## Key features of cross-domain analysis

1. **Multiple data types**: You can analyze different types of microbiome data (e.g., 16S rRNA, ITS, metagenomics) or even different omics data types together.

2. **Same samples**: All data matrices must have the same samples in the same order.

3. **Unified network**: The result is a single network where nodes represent features from all data types, and edges represent associations between features across domains.

4. **Visualization**: Different node colors can be used to distinguish between different data types or domains.

## Example with custom data

```{r, eval=runchunks}
# Example with custom data
# Assuming you have two data matrices with the same samples
data1 <- matrix(rpois(100*50, 10), 100, 50)  # First data type
data2 <- matrix(rpois(100*30, 5), 100, 30)   # Second data type

# Run cross-domain SPIEC-EASI
se.cross <- spiec.easi(list(data1, data2), method='mb', 
                       lambda.min.ratio=1e-2, nlambda=20,
                       pulsar.params=list(rep.num=50))

```

```{r, eval=TRUE}
# Create visualization with different colors for each domain
dtype <- c(rep(1, ncol(data1)), rep(2, ncol(data2)))
ig.cross <- adj2igraph(getRefit(se.cross))
plot(ig.cross, vertex.color=dtype+1, vertex.size=6)
```

## Interpretation

In cross-domain networks:

- **Within-domain edges**: Represent associations between features of the same type
- **Cross-domain edges**: Represent associations between features from different data types
- **Network structure**: Can reveal how different biological systems interact

This approach is particularly useful for understanding how different components of the microbiome (e.g., bacteria vs. fungi) or different biological systems (e.g., microbiome vs. metabolome) interact.

Session info:
```{r, eval=TRUE}
sessionInfo()
```

```{r, echo = FALSE, eval=TRUE, message=FALSE}
# Save objects if they exist
if (exists("se.hmp2") && exists("dtype")) {
  cache_file <- '../vignette_cache/cross-domain-interactions.RData'
  tryCatch({
    # Load trimming function and trim objects to reduce size
    source('../vignette_cache/trim_spiec_easi.R')
    se.hmp2.trimmed <- trim_spiec_easi(se.hmp2)
    se.cross.trimmed <- trim_spiec_easi(se.cross)
    
    # Save trimmed objects and other essential data
    save(se.hmp2.trimmed, se.cross.trimmed, dtype, data1, data2, ig.cross, file=cache_file)
    message("Saved trimmed cache file: ", cache_file, " in directory: ", getwd())
  }, error = function(e) {
    message("Failed to save cache file: ", e$message)
  })
}
``` 