#' Calculates the percentage of methylated cells/molecules per site
#'
#' @param orderObject An object of class \code{orderObject}
#' @param makePlot Logical, indicates whether to generate the percentage plot
#' @param ... Additional parameters used by the \code{plot} function.
#' @return The percent of molecules or cells methylated (endogenous (yellow)
#' or accessible) at each site. Output is a list with names "red"
#' and "yellow". Red represents the endogenous methylation and
#' yellow represents the accessibility. Within each list object is a
#' vector of the percent of cells/molecules methylated. The location
#' of the site is also represent in the form CXX, where XX is the
#' position of the site within the defined region.
#' @importFrom graphics hist lines plot points
#' @export
#' @examples
#'
#' data(singlemolecule_example)
#'
#' orderObj <- initialOrder(singlemolecule_example, Method = "PCA")
#' methyl_percent_sites(orderObj, makePlot = TRUE)
methyl_percent_sites <- function(orderObject, makePlot = TRUE, ...) {
dat <- orderObject$toClust
red_sites <- c(which(dat == 4, arr.ind = TRUE)[, 2], which(dat == 1, arr.ind = TRUE)[, 2])
red_sites <- sort(unique(red_sites))
yellow_sites <- c(which(dat == -4, arr.ind = TRUE)[, 2], which(dat == -1, arr.ind = TRUE)[, 2])
yellow_sites <- sort(unique(yellow_sites))
c_red <- vapply(red_sites, function(i) {
sum(dat[, i] == 4) / nrow(dat)
}, numeric(1))
c_yellow <- vapply(yellow_sites, function(i) {
sum(dat[, i] == -4) / nrow(dat)
}, numeric(1))
if (makePlot) {
plot(
x = red_sites - ncol(dat) / 2, y = c_red,
col = "brown1", pch = 19, ylim = c(0, 1),
xlab = "Position in the genomic region", ylab = "% methylated",
bty = "n", cex.lab = 1.3, ...
)
lines(x = red_sites - ncol(dat) / 2, y = c_red, col = "brown1")
points(x = yellow_sites, y = c_yellow, col = "gold2", pch = 19)
lines(x = yellow_sites, y = c_yellow, col = "gold2")
legend("topright", c("Endogenous", "Accessibility"),
pch = 16,
col = c("brown1", "gold2"), bty = "n", title = "Methylation Type"
)
n_sites <- length(union(red_sites, yellow_sites))
labs <- union(red_sites, yellow_sites)[seq(1, n_sites, by = n_sites / 12)]
}
final <- list(c_red, c_yellow)
names(final) <- c("meth", "acc")
return(final)
}
#' Calculate the proportion of methylated bases for each cell/molecule
#'
#' @param orderObject An object of class \code{orderObject}
#' @param type Indicates which data set to compute proportions for.
#' This should be 'met' or 'hcg' or 'red' for endogenous methylation; 'acc' or
#' 'gch' or 'yellow' for accessibility.
#' @param makePlot Indicates whether to plot a histogram of the proportions
#' across all cells/molcules.
#' @param ... Additional parameters used by the \code{hist} function.
#'
#' @return The proportion of methylated (endogenous (yellow)
#' or accessible) bases for each cell/molecule. Output is vector
#' with length the numbner of cells/molecules and contains a proportion.
#' @importFrom graphics hist
#' @export
#' @examples
#'
#' data(singlemolecule_example)
#'
#' orderObj <- initialOrder(singlemolecule_example, Method = "PCA")
#' methyl_proportion(orderObj, makePlot = TRUE)
methyl_proportion <- function(orderObject, type = "yellow",
makePlot = TRUE, ...) {
type <- tolower(type)
if (type == "gch") type <- "yellow"
if (type == "accessibility methylation") type <- "yellow"
if (type == "acc") type <- "yellow"
color_indicator <- ifelse(type == "yellow", -1, 1)
Proportion <- apply(orderObject$toClust, 1, function(x) {
sum(x == color_indicator * 3 | x == color_indicator * 4) / (length(x) / 2)
})
if (makePlot) {
opar <- par(lwd = 4)
H <- hist(Proportion, plot = FALSE, breaks = 15)
plot(H,
xlim = c(0, 1), border = ifelse(type == "yellow", "gold2", "brown1"),
col = "gray75", cex.lab = 1.3,
lwd = 2, ...
)
par(opar)
}
Proportion <- data.frame(methylationProportion = Proportion)
return(Proportion)
}
#' Calculate the average methylation/accessibility status across all cells/molecules.
#'
#' @param orderObject An object of class \code{orderObject}
#' @param window_length Length of the window to be used to compute a
#' moving average. Default is 20.
#' @param makePlot Logical, indicates whether to generate a line plot of
#' average status.
#' @param ... Addition parameters used by the \code{plot} function.
#'
#' @return The proportion of methylated bases for each cell/molecule
#' within a defined moving window. Output is a list with elements
#' "meth_avg" and "acc_avg", indicating endogenous
#' or accessible methylation respectively.
#' @importFrom stats filter
#' @importFrom graphics legend
#' @export
#' @examples
#'
#' data(singlemolecule_example)
#'
#' orderObj <- initialOrder(singlemolecule_example, Method = "PCA")
#' methyl_average_status(orderObj, makePlot = TRUE)
#'
methyl_average_status <- function(orderObject, window_length = 20,
makePlot = TRUE, ...) {
colLength <- ncol(orderObject$toClust)
gch_num <- orderObject$toClust[, seq(1, (colLength / 2))]
hcg_num <- orderObject$toClust[, seq((colLength / 2 + 1), colLength)]
acc_sum <- colSums(gch_num <= -3)
meth_sum <- colSums(hcg_num >= 3)
acc_denom <- colSums(gch_num != 0)
meth_denom <- colSums(hcg_num != 0)
acc_avg <- acc_sum / acc_denom
meth_avg <- meth_sum / meth_denom
width <- window_length
moving_acc_avg <- filter(x = acc_avg, filter = rep(1, width)) / width
moving_meth_avg <- filter(x = meth_avg, filter = rep(1, width)) / width
if (makePlot) {
plot(
x = seq(1, length(moving_acc_avg)), y = moving_acc_avg,
type = "l", col = "gold2", lwd = 2, bty = "n",
xlab = "Position in the genomic region",
ylab = "Averaged % methylation status",
cex.lab = 1.3, ylim = c(0, 1), ...
)
lines(moving_meth_avg, col = "brown1", lwd = 2)
legend("topright", c("Endogenous", "Accessibility"),
lwd = 2,
col = c("brown1", "gold2"), bty = "n", title = "Methylation Type"
)
}
return(list(meth_avg = moving_meth_avg, acc_avg = moving_acc_avg))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.