#### TRONCO: a tool for TRanslational ONCOlogy
####
#### Copyright (c) 2015-2017, Marco Antoniotti, Giulio Caravagna, Luca De Sano,
#### Alex Graudenzi, Giancarlo Mauri, Bud Mishra and Daniele Ramazzotti.
####
#### All rights reserved. This program and the accompanying materials
#### are made available under the terms of the GNU GPL v3.0
#### which accompanies this distribution.
#' Return all genotypes for input 'x', which should be a TRONCO compliant dataset
#' see \code{is.compliant}.
#' Function \code{keysToNames} can be used to translate colnames to events.
#' @title as.genotypes
#'
#' @examples
#' data(test_dataset)
#' as.genotypes(test_dataset)
#'
#' @param x A TRONCO compliant dataset.
#' @return A TRONCO genotypes matrix.
#' @export as.genotypes
#'
as.genotypes <- function(x) {
return(x$genotypes)
}
#' Return all sample IDs for input 'x', which should be a TRONCO compliant dataset - see \code{is.compliant}.
#' @title as.samples
#'
#' @examples
#' data(test_dataset)
#' as.samples(test_dataset)
#'
#' @param x A TRONCO compliant dataset.
#' @return A vector of sample IDs
#' @export as.samples
#'
as.samples <- function(x) {
return(rownames(x$genotypes))
}
#' Return all gene symbols for which a certain type of event exists in 'x', which should be a
#' TRONCO compliant dataset - see \code{is.compliant}.
#' @title as.genes
#'
#' @examples
#' data(test_dataset)
#' as.genes(test_dataset)
#'
#' @param x A TRONCO compliant dataset.
#' @param types The types of events to consider, if NA all available types are used.
#' @return A vector of gene symbols for which a certain type of event exists
#' @export as.genes
#'
as.genes <- function(x, types = NA) {
if ('Pattern' %in% types) {
stop('"Pattern" is not a valid gene type, it is a reseverd keyword in TRONCO.')
}
if (npatterns(x) > 0) {
ev = as.events(x, types = types)
ev = ev[which(ev[ , 'type'] != 'Pattern'), 'event']
return(unique(ev))
} else
return(unique(as.events(x, types = types)[ , 'event']))
}
#' Return all events involving certain genes and of a certain type in 'x', which should be a
#' TRONCO compliant dataset - see \code{is.compliant}.
#' @title as.events
#'
#' @examples
#' data(test_dataset)
#' as.events(test_dataset)
#' as.events(test_dataset, types='ins_del')
#' as.events(test_dataset, genes = 'TET2')
#' as.events(test_dataset, types='Missing')
#'
#' @param x A TRONCO compliant dataset.
#' @param types The types of events to consider, if NA all available types are used.
#' @param genes The genes to consider, if NA all available genes are used.
#' @param keysToNames If TRUE return a list of mnemonic name composed by type + gene
#' @return A matrix with 2 columns (event type, gene name) for the events found.
#' @export as.events
#'
as.events <- function(x, genes = NA, types = NA, keysToNames = FALSE) {
ann = x$annotations[ , c('type', 'event'), drop = FALSE]
if (!any(is.na(genes)))
ann = ann[which(ann[, 'event', drop=FALSE] %in% genes), , drop = FALSE]
if (!any(is.na(types)))
ann = ann[which(ann[, 'type', drop = FALSE] %in% types), , drop = FALSE]
if (keysToNames) {
ann = keysToNames(x, ann)
names(colnames(ann)) = NULL
names(rownames(ann)) = NULL
return(rownames(ann))
}
return(ann)
}
#' Return the association sample -> stage, if any. Input 'x' should be a
#' TRONCO compliant dataset - see \code{is.compliant}.
#' @title as.stages
#'
#' @examples
#' data(test_dataset)
#' data(stage)
#' test_dataset = annotate.stages(test_dataset, stage)
#' as.stages(test_dataset)
#'
#' @param x A TRONCO compliant dataset.
#' @return A matrix with 1 column annotating stages and rownames as sample IDs.
#' @export as.stages
#'
as.stages <- function(x) {
if (has.stages(x)) {
return(x$stages)
}
return(NA)
}
#' Return the types of events for a set of genes which are in 'x', which should be a
#' TRONCO compliant dataset - see \code{is.compliant}.
#' @title as.types
#'
#' @examples
#' data(test_dataset)
#' as.types(test_dataset)
#' as.types(test_dataset, genes='TET2')
#'
#' @param x A TRONCO compliant dataset.
#' @param genes A list of genes to consider, if NA all genes are used.
#' @return A matrix with 1 column annotating stages and rownames as sample IDs.
#' @export as.types
#'
as.types <- function(x, genes = NA) {
return(unlist(unique(as.events(x, genes = genes)[, 'type'])))
}
#' Return the colors associated to each type of event in 'x', which should be a
#' TRONCO compliant dataset - see \code{is.compliant}.
#' @title as.colors
#'
#' @examples
#' data(test_dataset)
#' as.colors(test_dataset)
#'
#' @param x A TRONCO compliant dataset.
#' @return A named vector of colors.
#' @export as.colors
#'
as.colors <- function(x) {
return(x$types[, 'color'])
}
#' Return the genotypes for a certain set of genes and type of events. Input 'x' should be a
#' TRONCO compliant dataset - see \code{is.compliant}. In this case column names are substituted
#' with events' types.
#' @title as.gene
#'
#' @examples
#' data(test_dataset)
#' as.gene(test_dataset, genes = c('EZH2', 'ASXL1'))
#'
#' @param x A TRONCO compliant dataset.
#' @param types The types of events to consider, if NA all available types are used.
#' @param genes The genes to consider, if NA all available genes are used.
#' @return A matrix, subset of \code{as.genotypes(x)} with colnames substituted with events' types.
#' @export as.gene
#'
as.gene <- function(x, genes, types = NA) {
keys = as.events(x, genes = genes, types = types)
data = data.frame(x$genotypes[, rownames(keys)],
row.names = as.samples(x))
colnames(data) = apply(keys,
1,
FUN = paste,
collapse = ' ')
return(data)
}
#' Return a dataset where all events for a gene are merged in a unique event, i.e.,
#' a total of gene-level alterations diregarding the event type. Input 'x' is checked
#' to be a TRONCO compliant dataset - see \code{is.compliant}.
#' @title as.alterations
#'
#' @examples
#' data(muts)
#' as.alterations(muts)
#'
#' @param x A TRONCO compliant dataset.
#' @param new.type The types label of the new event type, 'Alteration' by default.
#' @param new.color The color of the event \code{new.type}, default 'khaki'.
#' @param silent A parameter to disable/enable verbose messages.
#' @return A TRONCO compliant dataset with alteration profiles.
#' @export as.alterations
#'
as.alterations <- function(x,
new.type = 'Alteration',
new.color = 'khaki',
silent = FALSE) {
is.compliant(x)
if(has.model(x)) {
stop("There's a reconstructed model, types cannot be merged now. \nUse delete.model()")
}
if(length(as.patterns(x)) > 0) {
stop('Patterns found. Delete patterns first.\n')
}
join.types(x,
NULL,
new.type = new.type,
new.color = new.color,
silent = silent)
}
#' Return the patterns in the dataset which constitute CAPRI's hypotheses.
#' @title as.patterns
#'
#' @examples
#' data(test_dataset)
#' as.patterns(test_dataset)
#'
#' @param x A TRONCO compliant dataset.
#' @return The patterns in the dataset which constitute CAPRI's hypotheses.
#' @export as.patterns
#'
as.patterns <- function(x) {
is.compliant(x)
if (npatterns(x) == 0) {
return(NULL)
}
return(names(x$hypotheses$hstructure))
}
#' Return the hypotheses in the dataset which constitute CAPRI's hypotheses.
#' @title as.hypotheses
#'
#' @examples
#' data(test_dataset)
#' as.hypotheses(test_dataset)
#'
#' @param x A TRONCO compliant dataset.
#' @param cause A list of genes to use as causes
#' @param effect A list of genes to use as effects
#' @return The hypotheses in the dataset which constitute CAPRI's hypotheses.
#' @export as.hypotheses
#'
as.hypotheses <- function(x, cause = NA, effect = NA) {
if (nhypotheses(x) < 1)
return(NULL)
hlist = x$hypotheses$hlist
list_c = x$annotations[hlist[,'cause'], c('type', 'event'), drop = FALSE]
colnames(list_c) = c('cause type', 'cause event')
rownames(list_c) = NULL
list_e = x$annotations[hlist[,'effect'], c('type', 'event'), drop = FALSE]
colnames(list_e) = c('effect type', 'effect event')
rownames(list_e) = NULL
filtered_list = cbind(list_c, list_e)
if (!is.na(cause)) {
if (all(cause %in% as.events(x)[, 'event'])) {
filtered_list = filtered_list[which(filtered_list[, 'cause event'] == cause), ]
} else {
stop('some cause not in as.events\n')
}
}
if (!is.na(effect)) {
if (all(effect %in% as.events(x)[, 'event'])) {
filtered_list = filtered_list[which(filtered_list[, 'effect event'] == effect), ]
} else {
stop('some effect not in as.events\n')
}
}
return(filtered_list)
}
#' Return the list of events present in selected patterns
#'
#' @examples
#' data(test_dataset)
#' as.events.in.patterns(test_dataset)
#' as.events.in.patterns(test_dataset, patterns='XOR_EZH2')
#'
#' @title as.events.in.patterns
#' @param x A TRONCO compliant dataset.
#' @param patterns A list of patterns for which the list will be returned
#' @return A list of events present in patterns which consitute CAPRI's hypotheses
#' @export as.events.in.patterns
#'
as.events.in.patterns <- function(x, patterns = NULL) {
is.compliant(x)
ann = x$annotations[, c('type', 'event'), drop = FALSE]
if (is.null(patterns)) {
patterns = as.patterns(x)
}
genes_list = NULL
for (h in patterns) {
if (!h %in% as.patterns(x)) {
stop('Hypothesis ', h, ' not in as.patterns(x)')
}
g =
lapply(colnames(x$hypotheses$hstructure[[h]]),
function(x) { if (!is.logic.node(x)) return(x) })
genes_list = append(genes_list, g)
}
genes_list = unique(unlist(genes_list))
if (!(is.null(genes_list)))
ann = ann[ which(rownames(ann) %in% genes_list), , drop = FALSE]
return(ann)
}
#' Return the list of genes present in selected patterns
#'
#' @examples
#' data(test_dataset)
#' as.genes.in.patterns(test_dataset)
#' as.genes.in.patterns(test_dataset, patterns='XOR_EZH2')
#'
#' @title as.genes.in.patterns
#' @param x A TRONCO compliant dataset.
#' @param patterns A list of patterns for which the list will be returned
#' @return A list of genes present in patterns which consitute CAPRI's hypotheses
#' @export as.genes.in.patterns
#'
as.genes.in.patterns <- function(x, patterns=NULL) {
events = as.events.in.patterns(x, patterns)
genes = unique(events[, 'event'])
return(genes)
}
#' Return the list of types present in selected patterns
#'
#' @examples
#' data(test_dataset)
#' as.types.in.patterns(test_dataset)
#' as.types.in.patterns(test_dataset, patterns='XOR_EZH2')
#'
#' @title as.types.in.patterns
#' @param x A TRONCO compliant dataset.
#' @param patterns A list of patterns for which the list will be returned
#' @return A list of types present in patterns which consitute CAPRI's hypotheses
#' @export as.types.in.patterns
#'
as.types.in.patterns <- function(x, patterns = NULL) {
events = as.events.in.patterns(x, patterns)
types = unique(events[, 'type'])
return(types)
}
#' Return a list of events which are observed in the input samples list
#'
#' @examples
#' data(test_dataset)
#' as.events.in.sample(test_dataset, c('patient 1', 'patient 7'))
#'
#' @title as.events.in.sample
#' @param x A TRONCO compliant dataset
#' @param sample Vector of sample names
#' @return A list of events which are observed in the input samples list
#' @export as.events.in.sample
#'
as.events.in.sample <- function(x, sample) {
aux <- function(s) {
sub.geno = as.genotypes(x)[s, , drop = FALSE]
sub.geno = sub.geno[, sub.geno == 1, drop = FALSE]
return(as.events(x)[colnames(sub.geno), , drop = FALSE])
}
events = sapply(sample, FUN = aux, simplify = FALSE)
merge = unique(Reduce(rbind, events))
return(merge)
}
#' Return confidence information for a TRONCO model. Available information are: temporal priority (tp),
#' probability raising (pr), hypergeometric test (hg), parametric (pb), non parametric (npb) or
#' statistical (sb) bootstrap, entropy loss (eloss), prediction error (prederr).
#' Confidence is available only once a model has been reconstructed with any of the algorithms implemented
#' in TRONCO. If more than one model has been reconstructed - for instance via multiple regularizations -
#' confidence information is appropriately nested. The requested confidence is specified via
#' vector parameter \code{conf}.
#'
#' @examples
#' data(test_model)
#' as.confidence(test_model, conf='tp')
#' as.confidence(test_model, conf=c('tp', 'hg'))
#'
#' @title as.confidence
#' @param x A TRONCO model.
#' @param conf A vector with any of 'tp', 'pr', 'hg', 'npb', 'pb', 'sb', 'eloss', 'prederr' or 'posterr'.
#' @param models The name of the models to extract, all by default.
#' @return A list of matrices with the event-to-event confidence.
#' @export as.confidence
#'
as.confidence <- function(x, conf, models = names(x$model)) {
is.compliant(x)
is.model(x)
if (!is.vector(conf)) stop('"conf" should be a vector.')
keys = c('hg', 'tp', 'pr', 'npb', 'pb', 'sb', 'eloss', 'prederr', 'posterr')
if (!all(conf %in% keys))
stop('Confidence keyword unrecognized, \'conf\' should be any of:\n
INPUT DATASET\n
\t \"hg\" - hypergeometric test (randomness of observations)\n
SELECTIVE ADVANTAGE SCORES\n
\t \"tp\" - temporal priority (temporal ordering of events)\n
\t \"pr\" - probability raising (selectivity among events)\n
MODEL CONFIDENCE - requires post-reconstruction bootstrap or cross-validation\n
\t \"npb\" - non-parametric bootstrap,\n
\t \"sb\" - statistical bootstrap\n
\t \"eloss\" - entropy loss\n
\t \"prederr\" - prediction error\n
\t \"posterr\"- posterior classification error'
)
if (is.null(x$confidence)
|| any(is.na(x$confidence))
|| is.null(x$model)
|| all(is.na(x$model)))
stop('Input \'x\' does not contain a TRONCO model. No confidence to show.\n')
has.npb.bootstrap = is.null(x$bootstrap[[models[1]]]$npb)
has.sb.bootstrap = is.null(x$bootstrap[[models[1]]]$sb)
if ('npb' %in% conf && has.npb.bootstrap) {
stop('Non-parametric bootstrap was not performed. Remove keyword\n')
}
if ('sb' %in% conf && has.sb.bootstrap) {
stop('Statistical bootstrap was not performed. Remove keyword\n')
}
result = NULL
if ('hg' %in% conf) {
result$hg = x$confidence['hypergeometric test', ][[1]]
}
if ('tp' %in% conf) {
result$tp = x$confidence['temporal priority', ][[1]]
}
if ('pr' %in% conf) {
result$pr = x$confidence['probability raising', ][[1]]
}
if ('npb' %in% conf) {
for (i in 1:length(models)) {
result$npb[models[i]] =
list(x$bootstrap[[models[i]]]$npb$bootstrap.edge.confidence)
}
}
if ('sb' %in% conf) {
for (i in 1:length(models)) {
result$sb[models[i]] =
list(x$bootstrap[[models[i]]]$sb$bootstrap.edge.confidence)
}
}
if ('eloss' %in% conf) {
result$eloss = as.kfold.eloss(x, models = models)
}
if ('prederr' %in% conf) {
result$prederr = as.kfold.prederr(x, models = models)
}
if ('posterr' %in% conf) {
result$posterr = as.kfold.posterr(x, models = models)
}
return(result)
}
#' Extract the models from a reconstructed object.
#'
#' @examples
#' data(test_model)
#' as.models(test_model)
#'
#' @title as.models
#' @param x A TRONCO model.
#' @param models The name of the models to extract, e.g. 'bic', 'aic', 'caprese', all by default.
#' @return The models in a reconstructed object.
#' @export as.models
#'
as.models <- function(x, models=names(x$model)) {
is.compliant(x)
is.model(x)
for (model in models) {
if ( !model %in% names(x$model)) {
stop(paste('model:', model, 'not present'))
}
}
return(x$model[models])
}
#' Return the description annotating the dataset, if any. Input 'x' should be
#' a TRONCO compliant dataset - see \code{is.compliant}.
#'
#' @examples
#' data(test_dataset)
#' as.description(test_dataset)
#'
#' @title as.description
#' @param x A TRONCO compliant dataset.
#' @return The description annotating the dataset, if any.
#' @export as.description
#'
as.description <- function(x) {
if (!is.null(x$name))
return(x$name)
return("")
}
#' Given a cohort and a pathway, return the cohort with events restricted to genes
#' involved in the pathway. This might contain a new 'pathway' genotype with an alteration mark if
#' any of the involved genes are altered.
#'
#' @examples
#' data(test_dataset)
#' p = as.pathway(test_dataset, c('ASXL1', 'TET2'), 'test_pathway')
#'
#' @title as.pathway
#' @param x A TRONCO compliant dataset.
#' @param pathway.genes Gene (symbols) involved in the pathway.
#' @param pathway.name Pathway name for visualization.
#' @param pathway.color Pathway color for visualization.
#' @param aggregate.pathway If TRUE drop the events for the genes in the pathway.
#' @param silent A parameter to disable/enable verbose messages.
#' @return Extract the subset of events for genes which are part of a pathway.
#' @export as.pathway
#'
as.pathway <- function(x,
pathway.genes,
pathway.name,
pathway.color='yellow',
aggregate.pathway = TRUE,
silent = FALSE) {
is.compliant(x, 'as.pathway: input')
data = x$genotypes
if (!silent) {
cat('*** Extracting events for pathway: ',
pathway.name,
'.\n')
}
## Select only those events involving a gene in pathway.genes
## which is also in x.
y = events.selection(x, NA, filter.in.names = pathway.genes, NA)
## Extend genotypes.
y = enforce.numeric(y)
pathway =
data.frame(rowSums(as.genotypes(y)),
row.names = as.samples(y),
stringsAsFactors = FALSE)
pathway[pathway > 1, ] = 1
colnames(pathway) = pathway.name
pathway =
import.genotypes(pathway,
event.type = 'Pathway',
color = pathway.color)
if (!silent) {
cat('Pathway extracted succesfully.\n')
}
if (!aggregate.pathway) {
pathway = ebind(pathway, y, silent = silent)
}
if (has.stages(y)) {
pathway = annotate.stages(pathway, as.stages(y))
}
is.compliant(pathway, 'as.pathway: output')
return(pathway)
}
#' Extract the adjacency matrix of a TRONCO model. The matrix is indexed with colnames/rownames which
#' represent genotype keys - these can be resolved with function \code{keysToNames}. It is possible to
#' specify a subset of events to build the matrix, a subset of models if multiple reconstruction have
#' been performed. Also, either the prima facie matrix or the post-regularization matrix can be extracted.
#'
#' @examples
#' data(test_model)
#' as.adj.matrix(test_model)
#' as.adj.matrix(test_model, events=as.events(test_model)[5:15,])
#' as.adj.matrix(test_model, events=as.events(test_model)[5:15,], type='pf')
#'
#' @title as.adj.matrix
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @param type Either the prima facie ('pf') or the post-regularization ('fit') matrix, 'fit' by default.
#' @return The adjacency matrix of a TRONCO model.
#' @export as.adj.matrix
#'
as.adj.matrix <- function(x,
events = as.events(x),
models = names(x$model),
type = 'fit') {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (!all(models %in% names(x$model))) {
stop('not all "models" are reconstructed model.')
}
if (!type %in% c('fit', 'pf') ) {
stop('"type" should be any of \'fit\' (post-regularization) or \'pf\' (prima facie).')
}
m = as.models(x, models = models)
ret = list()
for (i in models) {
if (type == 'fit') {
mat = m[[i]]$adj.matrix$adj.matrix.fit
} else if (type == 'pf') {
mat = m[[i]]$adj.matrix$adj.matrix.pf
}
mat = mat[rownames(events), , drop = FALSE]
mat = mat[, rownames(events), drop = FALSE]
ret = append(ret, list(mat))
}
names(ret) = models
return(ret)
}
#' Extract the marginal probabilities from a TRONCO model. The return matrix is indexed with rownames which
#' represent genotype keys - these can be resolved with function \code{keysToNames}. It is possible to
#' specify a subset of events to build the matrix, a subset of models if multiple reconstruction have
#' been performed. Also, either the observed or fit probabilities can be extracted.
#'
#' @examples
#' data(test_model)
#' as.marginal.probs(test_model)
#' as.marginal.probs(test_model, events=as.events(test_model)[5:15,])
#'
#' @title as.marginal.probs
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @param type observed.
#' @return The marginal probabilities in a TRONCO model.
#' @export as.marginal.probs
as.marginal.probs <- function(x,
events = as.events(x),
models = names(x$model),
type = 'observed') {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (any(is.null(colnames(events)))) {
stop('Events should have colnames to access the adjacency matrix - use \'as.events\' function?')
}
if (!all(models %in% names(x$model))) {
stop('not all "models" are reconstructed model.')
}
if (type != 'observed') {
stop('Marginal probabilities are available for \'observed\' (empirical).')
}
m = as.models(x, models = models)
ret = list()
for (i in models) {
mat = m[[i]]$probabilities$probabilities.observed$marginal.probs
mat = mat[rownames(events), , drop = FALSE]
ret = append(ret, list(mat))
}
names(ret) = models
return(ret)
}
#' Extract the joint probabilities from a TRONCO model. The return matrix is indexed with rownames/colnames which
#' represent genotype keys - these can be resolved with function \code{keysToNames}. It is possible to
#' specify a subset of events to build the matrix, a subset of models if multiple reconstruction have
#' been performed. Also, either the observed or fit probabilities can be extracted.
#'
#' @examples
#' data(test_model)
#' as.joint.probs(test_model)
#' as.joint.probs(test_model, events=as.events(test_model)[5:15,])
#'
#' @title as.joint.probs
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @param type observed
#' @return The joint probabilities in a TRONCO model.
#' @export as.joint.probs
#'
as.joint.probs <- function(x,
events = as.events(x),
models = names(x$model),
type = 'observed') {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (any(is.null(colnames(events)))) {
stop('Events should have colnames to access the adjacency matrix - use \'as.events\' function?')
}
if (!all(models %in% names(x$model))) {
stop('not all "models" are reconstructed model.')
}
if (type != 'observed') {
stop('Marginal probabilities are available for \'observed\' (empirical).')
}
m = as.models(x, models = models)
ret = list()
for (i in models) {
mat = m[[i]]$probabilities$probabilities.observed$joint.probs
mat = mat[rownames(events), , drop = FALSE]
mat = mat[, rownames(events), drop = FALSE]
ret = append(ret, list(mat))
}
names(ret) = models
return(ret)
}
#' Extract the conditional probabilities from a TRONCO model. The return matrix is indexed with rownames which
#' represent genotype keys - these can be resolved with function \code{keysToNames}. It is possible to
#' specify a subset of events to build the matrix, a subset of models if multiple reconstruction have
#' been performed. Also, either the observed or fit probabilities can be extracted.
#'
#' #' @examples
#' data(test_model)
#' as.conditional.probs(test_model)
#' as.conditional.probs(test_model, events=as.events(test_model)[5:15,])
#'
#' @title as.conditional.probs
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @param type observed ('observed')
#' @return The conditional probabilities in a TRONCO model.
#' @export as.conditional.probs
#'
as.conditional.probs <- function(x,
events = as.events(x),
models = names(x$model),
type = 'observed') {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (any(is.null(colnames(events)))) {
stop('Events should have colnames to access the adjacency matrix - use \'as.events\' function?')
}
if (!all(models %in% names(x$model))) {
stop('not all "models" are reconstructed model.')
}
if (type != 'observed') {
stop('Marginal probabilities are available for \'observed\' (empirical).')
}
m = as.models(x, models = models)
ret = list()
for (i in models) {
mat = m[[i]]$probabilities$probabilities.observed$conditional.probs
mat = mat[rownames(events), , drop = FALSE]
ret = append(ret, list(mat))
}
names(ret) = models
return(ret)
}
# Extract the estimated rates of false positives an negatives in the data, given the model.
# A subset of models if multiple reconstruction have been performed can be extracted.
#
# @examples
# data(test_model)
# as.error.rates(test_model)
#
# @title as.error.rates
# @param x A TRONCO model.
# @param models A subset of reconstructed models, all by default.
# @return The estimated rates of false positives an negatives in the data, given the model.
#
as.error.rates <- function(x, models = names(x$model)) {
is.compliant(x)
is.model(x)
if (!all(models %in% names(x$model))) {
stop('not all "models" are reconstructed model.')
}
m = as.models(x, models = models)
ret = list()
for (i in models) {
mat = m[[i]]$error.rates
ret = append(ret, list(mat))
}
names(ret) = models
return(ret)
}
#' Returns a dataframe with all the selective advantage relations in a
#' TRONCO model. Confidence is also shown - see \code{as.confidence}. It is possible to
#' specify a subset of events or models if multiple reconstruction have
#' been performed.
#'
#' @examples
#' data(test_model)
#' as.selective.advantage.relations(test_model)
#' as.selective.advantage.relations(test_model, events=as.events(test_model)[5:15,])
#' as.selective.advantage.relations(test_model, events=as.events(test_model)[5:15,], type='pf')
#'
#' @title as.selective.advantage.relations
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @param type Either Prima Facie ('pf') or fit ('fit') probabilities, 'fit' by default.
#' @return All the selective advantage relations in a TRONCO model
#' @export as.selective.advantage.relations
#'
as.selective.advantage.relations <- function(x,
events = as.events(x),
models = names(x$model),
type = 'fit') {
is.compliant(x)
is.model(x)
is.events.list(x, events)
## TEMPORARY HORRIBLE FIX
matrix = NULL
if (type == 'pf')
matrix$pf = x$adj.matrix.prima.facie
else
matrix =
as.adj.matrix(x,
events = events,
models = models,
type = type)
matrix = lapply(matrix, keysToNames, x = x)
conf = as.confidence(x, conf = c('tp', 'pr', 'hg'))
conf = lapply(conf, keysToNames, x = x)
matrix.to.df <- function(m) {
entries = length(which(m == 1))
df = NULL
df$SELECTS = NULL
df$SELECTED = NULL
df$OBS.SELECTS = NULL
df$OBS.SELECTED = NULL
df$HG = NULL
df$TP = NULL
df$PR = NULL
if (entries == 0) {
return(NULL)
}
for (i in 1:ncol(m)) {
for (j in 1:nrow(m)) {
if (m[i, j] == 1) {
df$SELECTS = c(df$SELECTS, rownames(m)[i])
df$SELECTED = c(df$SELECTED, colnames(m)[j])
df$OBS.SELECTS =
c(df$OBS.SELECTS,
sum(as.genotypes(x)[, nameToKey(x, rownames(m)[i])]))
df$OBS.SELECTED =
c(df$OBS.SELECTED,
sum(as.genotypes(x)[, nameToKey(x, colnames(m)[j])]))
df$TP = c(df$TP, conf$tp[rownames(m)[i], colnames(m)[j]])
df$PR = c(df$PR, conf$pr[rownames(m)[i], colnames(m)[j]])
df$HG = c(df$HG, conf$hg[rownames(m)[i], colnames(m)[j]])
}
}
}
df =
cbind(df$SELECTS,
df$SELECTED,
df$OBS.SELECTS,
df$OBS.SELECTED,
df$TP,
df$PR,
df$HG)
colnames(df) =
c('SELECTS',
'SELECTED',
'OBS.SELECTS',
'OBS.SELECTED',
'TEMPORAL.PRIORITY',
'PROBABILITY.RAISING',
'HYPERGEOMETRIC')
rownames(df) = paste(1:nrow(df))
df = data.frame(df, stringsAsFactors = FALSE)
df$OBS.SELECTS = as.numeric(df$OBS.SELECTS)
df$OBS.SELECTED = as.numeric(df$OBS.SELECTED)
df$HYPERGEOMETRIC = as.numeric(df$HYPERGEOMETRIC)
df$TEMPORAL.PRIORITY = as.numeric(df$TEMPORAL.PRIORITY)
df$PROBABILITY.RAISING = as.numeric(df$PROBABILITY.RAISING)
return(df)
}
return(lapply(matrix, matrix.to.df))
}
#' Returns a dataframe with all the bootstrap score in a
#' TRONCO model. It is possible to specify a subset of events
#' or models if multiple reconstruction have been performed.
#'
#' @examples
#' data(test_model)
#' as.bootstrap.scores(test_model)
#' as.bootstrap.scores(test_model, events=as.events(test_model)[5:15,])
#'
#' @title as.bootstrap.scores
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @return All the bootstrap scores in a TRONCO model
#' @export as.bootstrap.scores
#'
as.bootstrap.scores <- function(x,
events = as.events(x),
models = names(x$model)) {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (!all(models %in% names(x$model))) {
stop('not all "models" are reconstructed model.')
}
matrix =
as.adj.matrix(x,
events = events,
models = models,
type = 'fit')
matrix = lapply(matrix, keysToNames, x = x)
if (!(is.null(x$confidence) && is.na(x$confidence))) {
models = names(x$model)
}
has.npb.bootstrap = !is.null(x$bootstrap[[models[1]]]$npb)
has.sb.bootstrap = !is.null(x$bootstrap[[models[1]]]$sb)
if(has.npb.bootstrap) {
npb.boot.conf = lapply(as.confidence(x, conf = c('npb'))$npb, keysToNames, x = x)
}
if(has.sb.bootstrap) {
sb.boot.conf = lapply(as.confidence(x, conf = c('sb'))$sb, keysToNames, x = x)
}
matrix.to.df <- function(z) {
m = matrix[[z]]
entries = length(which(m == 1))
df = NULL
df$SELECTS = NULL
df$SELECTED = NULL
df$OBS.SELECTS = NULL
df$OBS.SELECTED = NULL
df$BOOT.NPB = NULL
df$BOOT.PB = NULL
df$BOOT.SB = NULL
if (entries == 0) {
return(NULL)
}
for (i in 1:ncol(m)) {
for (j in 1:nrow(m)) {
if (m[i, j] == 1) {
df$SELECTS = c(df$SELECTS, rownames(m)[i])
df$SELECTED = c(df$SELECTED, colnames(m)[j])
df$OBS.SELECTS = c(df$OBS.SELECTS,
sum(as.genotypes(x)[, nameToKey(x, rownames(m)[i])]))
df$OBS.SELECTED = c(df$OBS.SELECTED,
sum(as.genotypes(x)[, nameToKey(x, colnames(m)[j])]))
if (has.npb.bootstrap) {
df$BOOT.NPB = c(df$BOOT.NPB,
npb.boot.conf[[z]][ rownames(m)[i], colnames(m)[j] ] * 100)
} else {
df$BOOT.NPB = c(df$BOOT.NPB, NA)
}
if (has.sb.bootstrap) {
df$BOOT.SB = c(df$BOOT.SB,
sb.boot.conf[[z]][ rownames(m)[i], colnames(m)[j] ] * 100)
} else {
df$BOOT.SB = c(df$BOOT.SB, NA)
}
}
}
}
df = cbind(df$SELECTS,
df$SELECTED,
df$OBS.SELECTS,
df$OBS.SELECTED,
df$BOOT.NPB,
df$BOOT.SB)
colnames(df) =
c('SELECTS',
'SELECTED',
'OBS.SELECTS',
'OBS.SELECTED',
'NONPAR.BOOT',
'STAT.BOOT')
rownames(df) = paste(1:nrow(df))
df = data.frame(df, stringsAsFactors = FALSE)
df$OBS.SELECTS = as.numeric(df$OBS.SELECTS)
df$OBS.SELECTED = as.numeric(df$OBS.SELECTED)
if (!has.npb.bootstrap) {
df$NONPAR.BOOT = NULL
} else {
df$NONPAR.BOOT = as.numeric(df$NONPAR.BOOT)
}
if (!has.sb.bootstrap) {
df$STAT.BOOT = NULL
} else {
df$STAT.BOOT = as.numeric(df$STAT.BOOT)
}
return(df)
}
res = lapply(seq_along(matrix), matrix.to.df)
names(res) = names(matrix)
return(res)
}
#' Returns a dataframe with all the average/stdev entropy loss score of a
#' TRONCO model. It is possible to specify models if multiple
#' reconstruction have been performed.
#'
#' @examples
#' data(test_model_kfold)
#' as.kfold.eloss(test_model_kfold)
#' as.kfold.eloss(test_model_kfold, models='capri_aic')
#'
#' @title as.kfold.eloss
#' @param x A TRONCO model.
#' @param models A subset of reconstructed models, all by default.
#' @param values If you want to see also the values
#' @return All the bootstrap scores in a TRONCO model
#' @export as.kfold.eloss
#' @importFrom stats sd
#'
as.kfold.eloss <- function(x,
models = names(x$model),
values = FALSE) {
is.compliant(x)
is.model(x)
if(is.null(x$kfold)) {
stop('Cross-validation was never performed on this model!')
}
ret = NULL
ret$C1 = NULL
ret$C2 = NULL
ret$C3 = NULL
ret$C4 = NULL
for (model in models) {
if (is.null(x$kfold[[model]]$eloss)) {
stop('Entropy loss was not estimated for \'', model, '\'')
}
meanll = mean(get(model, x$kfold)$eloss)
ll = get(model, x$model)$logLik
ratio = meanll / abs(ll) * 100
ret$C1 = c(ret$C1, meanll)
ret$C2 = c(ret$C2, ratio)
ret$C3 = c(ret$C3, sd(get(model, x$kfold)$eloss))
ret$C4 = c(ret$C4, paste(round(get(model, x$kfold)$eloss, 2), sep = ', ', collapse = ', '))
}
ret = data.frame(ret)
rownames(ret) = models
colnames(ret) = c('Mean', '%-of-logLik', 'Stdev', 'Values (rounded, 2 digits)')
if(!values) ret = ret[, 1:3]
return(ret)
}
#' Returns a dataframe with all the prediction error score in a
#' TRONCO model. It is possible to specify a subset of events
#' or models if multiple reconstruction have been performed.
#'
#' @examples
#' data(test_model_kfold)
#' as.kfold.prederr(test_model_kfold)
#' as.kfold.prederr(test_model_kfold, models='capri_aic')
#'
#' @title as.kfold.prederr
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @param values If you want to see also the values
#' @param table Keep the original table (defaul false)
#' @return All the bootstrap scores in a TRONCO model
#' @export as.kfold.prederr
#' @importFrom stats sd
#'
as.kfold.prederr <- function(x,
events = as.events(x),
models = names(x$model),
values = FALSE,
table = FALSE) {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (is.null(x$kfold) ) {
stop('Crossvalidation was not executed for this object!')
}
matrix.to.df <- function(z) {
if ( any(is.null(x$kfold[[z]]$prederr)) ) {
stop('Crossvalidation was not executed for the required model: ', models[z] )
}
prederr.matrix = x$kfold[[z]]$prederr
if (table) {
names(prederr.matrix) = lapply(names(prederr.matrix), function(k) { nameToKey(x, k) })
return(prederr.matrix)
}
# Already prepared data - just wrap it in a dataframe
df = NULL
df$prederr = t(as.data.frame(prederr.matrix)) # values
df$MEAN.PREDERR = apply(df$prederr, 1, mean) # means
df$SD.PREDERR = apply(df$prederr, 1, sd) # standard deviation
df$VALUES.PREDERR = apply(df$prederr, 1, function(z){paste(round(z, 3), collapse = ', ')}) # collapse values
df$SELECTED = gsub("\\.", " ", rownames(df$prederr)) # for later merge we use this
df = data.frame(df, stringsAsFactors = FALSE)
rownames(df) = paste(1:nrow(df))
df = df[, c('SELECTED', 'MEAN.PREDERR', 'SD.PREDERR', 'VALUES.PREDERR')]
colnames(df)[4] = 'PREDERR Values (rounded, 3 digits)'
## Filter out events if required.
sel.events = apply(events, 1, function(z){paste(z, collapse = ' ')})
df = df[which(df$SELECTED %in% sel.events), , drop = FALSE]
if(!values) df = df[, 1:3]
return(df)
}
res = lapply(seq_along(models), matrix.to.df)
names(res) = models
return(res)
}
#' Returns a dataframe with all the posterior classification error
#' score in a TRONCO model. It is possible to specify a subset of events
#' or models if multiple reconstruction have been performed.
#'
#' @examples
#' data(test_model_kfold)
#' data(test_model)
#' as.kfold.posterr(test_model_kfold)
#' as.kfold.posterr(test_model_kfold, events=as.events(test_model)[5:15,])
#'
#' @title as.kfold.posterr
#' @param x A TRONCO model.
#' @param events A subset of events as of \code{as.events(x)}, all by default.
#' @param models A subset of reconstructed models, all by default.
#' @param values If you want to see also the values
#' @param table Keep the original table (defaul false)
#' @return All the posterior classification error scores in a TRONCO model
#' @export as.kfold.posterr
#' @importFrom stats sd
#'
as.kfold.posterr <- function(x,
events = as.events(x),
models = names(x$model),
values = FALSE,
table = FALSE) {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (is.null(x$kfold) ) {
stop('Crossvalidation was not executed for this object!')
}
matrix =
as.adj.matrix(x,
events = events,
models = models,
type = 'fit')
matrix = lapply(matrix, keysToNames, x = x)
matrix.to.df <- function(z) {
if ( any(is.null(x$kfold[[z]]$posterr)) ) {
stop('Posterior classification error was not executed for the required model: ', z )
}
m = matrix[[z]]
posterr.matrix = get(z, x$kfold)$posterr
if (table) {
rownames(posterr.matrix) = lapply(rownames(posterr.matrix), function(k) { nameToKey(x, k) })
colnames(posterr.matrix) = lapply(colnames(posterr.matrix), function(k) { nameToKey(x, k) })
return(posterr.matrix)
}
posterr.matrix = keysToNames(posterr.matrix, x = x)
entries = length(which(m == 1))
df = NULL
df$SELECTS = NULL
df$SELECTED = NULL
df$MEAN.POSTERR = NULL
df$SD.POSTERR = NULL
df$POSTERR = NULL
if (entries == 0) {
return(NULL)
}
for (i in 1:ncol(m)) {
for (j in 1:nrow(m)) {
if (m[i, j] == 1) {
select = rownames(m)[i]
df$SELECTS = c(df$SELECTS, select)
selected = colnames(m)[j]
val = posterr.matrix[[select,selected]]
df$SELECTED = c(df$SELECTED, colnames(m)[j])
df$MEAN.POSTERR = c(df$MEAN.POSTERR, mean(val))
df$SD.POSTERR = c(df$SD.POSTERR, sd(val))
posterr = paste(round(val, 3), collapse=', ')
df$POSTERR = c(df$POSTERR, posterr)
}
}
}
df = cbind(df$SELECTS,
df$SELECTED,
df$MEAN.POSTERR,
df$SD.POSTERR,
df$POSTERR)
rownames(df) = c(1:nrow(df))
df = data.frame(df, stringsAsFactors = FALSE)
colnames(df) =
c('SELECTS',
'SELECTED',
'MEAN.POSTERR',
'SD.POSTERR',
'POSTERR Values (rounded, 3 digits)')
df$MEAN.POSTERR = as.numeric(df$MEAN.POSTERR)
df$SD.POSTERR = as.numeric(df$SD.POSTERR)
if(!values) df = df[, 1:4]
return(df)
}
res = lapply(models, matrix.to.df)
names(res) = names(matrix)
return(res)
}
# Get parents for each node
#
# @title as.parents.pos
# @param x A TRONCO model.
# @param events A subset of events as of \code{as.events(x)}, all by default.
# @param models A subset of reconstructed models, all by default.
# @return A list of parents for each node
#
as.parents.pos <- function(x,
events = as.events(x),
models = names(x$model)) {
is.compliant(x)
is.model(x)
is.events.list(x, events)
if (!all(models %in% names(x$model))) {
stop('not all "models" are reconstructed model.')
}
m = as.models(x, models = models)
ret = list()
for (i in models) {
mat = m[[i]]$parents.pos
mat = mat[rownames(events), , drop = FALSE]
ret = append(ret, list(mat))
}
names(ret) = models
return(ret)
}
#' Get parameters of a model
#'
#' @title as.parameters
#'
#' @examples
#' data(test_model)
#' as.parameters(test_model)
#'
#' @param x A TRONCO model.
#' @return A list of parameters
#' @export as.parameters
#
as.parameters <- function(x) {
is.compliant(x)
is.model(x)
return(x$parameters)
}
#' Return true if the TRONCO dataset 'x', which should be a TRONCO compliant dataset
#' - see \code{is.compliant} - has stage annotations for samples. Some sample stages
#' might be annotated as NA, but not all.
#'
#' @examples
#' data(test_dataset)
#' has.stages(test_dataset)
#' data(stage)
#' test_dataset = annotate.stages(test_dataset, stage)
#' has.stages(test_dataset)
#'
#' @title has stages
#' @param x A TRONCO compliant dataset.
#' @return TRUE if the TRONCO dataset has stage annotations for samples.
#' @export has.stages
#'
has.stages <- function(x) {
return(!(all(is.null(x$stages)) || all(is.na(x$stages))))
}
#' Return true if there are duplicated events in the TRONCO dataset 'x', which should be
#' a TRONCO compliant dataset - see \code{is.compliant}. Events are identified by a gene
#' name, e.g., a HuGO_Symbol, and a type label, e.g., c('SNP', 'KRAS')
#'
#' @examples
#' data(test_dataset)
#' has.duplicates(test_dataset)
#'
#' @title has.duplicates
#' @param x A TRONCO compliant dataset.
#' @return TRUE if there are duplicated events in \code{x}.
#' @export has.duplicates
#'
has.duplicates <- function(x) {
## Find duplicate over the dataset.
dup = duplicated(as.events(x))
## Return true if at least one duplicate is found.
return(any(dup))
}
#' Return true if there is a reconstructed model in the TRONCO dataset 'x', which should be
#' a TRONCO compliant dataset - see \code{is.compliant}.
#'
#' @examples
#' data(test_dataset)
#' has.model(test_dataset)
#'
#' @title has.model
#' @param x A TRONCO compliant dataset.
#' @return TRUE if there is a reconstructed model in \code{x}.
#' @export has.model
#'
has.model <- function(x) {
is.compliant(x)
if (length(x$model) > 0) # Isn't 'return(length(x$mode) > 0)' enough?
return(TRUE)
return(FALSE)
}
#' Return the events duplicated in \code{x}, if any. Input 'x' should be
#' a TRONCO compliant dataset - see \code{is.compliant}.
#'
#' @examples
#' data(test_dataset)
#' duplicates(test_dataset)
#'
#' @title duplicates
#' @param x A TRONCO compliant dataset.
#' @return A subset of \code{as.events(x)} with duplicated events.
#' @export duplicates
#'
duplicates <- function(x) {
is.compliant(x)
return(as.events(x)[duplicated(as.events(x)),])
}
#' Print to console a short report of a dataset 'x', which should be
#' a TRONCO compliant dataset - see \code{is.compliant}.
#'
#' @examples
#' data(test_dataset)
#' view(test_dataset)
#'
#' @title view
#' @param x A TRONCO compliant dataset.
#' @param view The firse \code{view} events are shown via \code{head}.
#' @export view
#' @importFrom utils head
#'
view <- function(x, view = 5) {
is.compliant(x)
x = enforce.numeric(x)
view = min(view, nevents(x))
if (as.description(x) != "")
cat(paste('Description: ', as.description(x), '.\n', sep = ''))
cat(paste('-- TRONCO Dataset: n=',
nsamples(x),
', m=',
nevents(x),
', |G|=',
ngenes(x),
', patterns=',
npatterns(x),
'.\n',
sep = ''))
cat(paste('Events (types): ',
paste(as.types(x), collapse=', '),
'.\n',
sep = ''))
cat(paste('Colors (plot): ',
paste(as.colors(x), collapse=', '),
'.\n',
sep = ''))
if (has.stages(x)) {
cat(paste('Stages: '))
s = unlist(sort(unique(as.stages(x)[, 1])))
cat((paste(paste(s, collapse=', ', sep = ''), '.\n', sep = '')))
}
cat(paste('Events (', view, ' shown):\n', sep = ''))
to.show =
paste( '\t',
rownames(as.events(x)[1: view,]), ':',
as.events(x)[1: view, 1],
as.events(x)[1: view, 2],
sep = ' ')
cat(paste(to.show, collapse = '\n'))
cat(paste('\nGenotypes (', view, ' shown):\n', sep = ''))
if (has.model(x)) {
cat('\n-- TRONCO Model(s): ', x$parameters$algorithm, '\n')
if (as.parameters(x)$algorithm == 'CAPRI') {
cat('Score optimization via ')
if (x$parameters$command == 'hc') {
cat('Hill-Climbing.\n')
}
if (x$parameters$command == 'tabu') {
cat('Tabu Search.\n')
}
}
if (as.parameters(x)$algorithm != 'CAPRESE') {
cat(paste(toupper(x$parameters$regularization), sep = ', ', collapse = ', '),' regularizers.\n', sep = '')
models = as.models(x)
sel.adv.rel = as.selective.advantage.relations(x)
for (reg in as.parameters(x)$regularization) {
model = paste0(tolower(as.parameters(x)$algorithm), '_', reg)
cat(toupper(reg), ': ', sep = '')
score = get(model, models)$score
logLik = get(model, models)$logLik
row = nrow(get(model, sel.adv.rel))
cat('score', score, '|',
'logLik', logLik, '|',
row, 'selective advantage relations.\n')
}
}
cat('Available confidence measures:\n')
cat('\tTemporal priority | Probability raising | Hypergeometric\n')
if(!is.null(x$bootstrap)) {
cat('Bootstrap estimation available.\n')
}
if(!is.null(x$kfold)) {
cat('Cross-validation assessment available.\n')
}
cat('\n')
}
}
#' Return the number of types in the dataset.
#'
#' @examples
#' data(test_dataset)
#' ntypes(test_dataset)
#'
#' @title ntypes
#' @param x A TRONCO compliant dataset.
#' @return The number of types in the dataset.
#' @export ntypes
#'
ntypes <- function(x) {
return(length(as.types(x)))
}
#' Return the number of samples in the dataset.
#'
#' @examples
#' data(test_dataset)
#' nsamples(test_dataset)
#'
#' @title nsamples
#' @param x A TRONCO compliant dataset.
#' @return The number of samples in the dataset.
#' @export nsamples
#'
nsamples <- function(x) {
return(nrow(x$genotypes))
}
#' Return the number of events in the dataset involving a certain gene or type of event.
#'
#' @examples
#' data(test_dataset)
#' nevents(test_dataset)
#'
#' @title nevents
#' @param x A TRONCO compliant dataset.
#' @param genes The genes to consider, if NA all available genes are used.
#' @param types The types of events to consider, if NA all available types are used.
#' @return The number of events in the dataset involving a certain gene or type of event.
#' @export nevents
#'
nevents <- function(x, genes = NA, types = NA) {
return(nrow(as.events(x, genes, types)))
}
#' Return the number of genes in the dataset involving a certain type of event.
#'
#' @examples
#' data(test_dataset)
#' ngenes(test_dataset)
#'
#' @title ngenes
#' @param x A TRONCO compliant dataset.
#' @param types The types of events to consider, if NA all available types are used.
#' @return The number of genes in the dataset involving a certain type of event.
#' @export ngenes
#'
ngenes <- function(x, types = NA) {
return(length(as.genes(x, types = types)))
}
#' Return the number of patterns in the dataset
#'
#' @examples
#' data(test_dataset)
#' npatterns(test_dataset)
#'
#'
#' @param x the dataset.
#' @export npatterns
#'
npatterns <- function(x) {
if (any(is.null(x$hypotheses))) {
return(0)
}
if ('hstructure' %in% names(x$hypotheses)) {
return(length(ls(x$hypotheses$hstructure)))
}
return(0)
}
#' Return the number of hypotheses in the dataset
#'
#' @examples
#' data(test_dataset)
#' nhypotheses(test_dataset)
#'
#' @param x the dataset.
#' @export nhypotheses
#'
nhypotheses <- function(x) {
if (npatterns(x) < 1) {
return(0)
}
if ('hlist' %in% names(x$hypotheses)) {
return(length(x$hypotheses$hlist) / 2)
}
return(0)
}
#' Convert the internal reprensentation of genotypes to numeric, if not.
#'
#' @examples
#' data(test_dataset)
#' test_dataset = enforce.numeric(test_dataset)
#'
#' @title enforce.numeric
#' @param x A TRONCO compliant dataset.
#' @return Convert the internal reprensentation of genotypes to numeric, if not.
#' @export enforce.numeric
#'
enforce.numeric <- function(x) {
is.compliant(x)
if (!all(is.numeric(x$genotypes[1, ]))) {
rn = as.samples(x)
x$genotypes = apply(x$genotypes, 2, as.numeric)
rownames(x$genotypes) = rn
}
return(x)
}
#' Convert the internal representation of genotypes to character, if not.
#'
#' @examples
#' data(test_dataset)
#' test_dataset = enforce.string(test_dataset)
#'
#' @title enforce.string
#' @param x A TRONCO compliant dataset.
#' @return Convert the internal reprensentation of genotypes to character, if not.
#' @export enforce.string
#'
enforce.string <- function(x) {
is.compliant(x)
if (!all(is.character(x$genotypes[1,]))) {
rn = as.samples(x)
x$genotypes = apply(x$genotypes, 2, as.character)
rownames(x$genotypes) = rn
}
return(x)
}
#' Sort the internal genotypes according to event frequency.
#'
#' @examples
#' data(test_dataset)
#' order.frequency(test_dataset)
#'
#' @title order.frequency
#' @param x A TRONCO compliant dataset.
#' @param decreasing Inverse order. Default TRUE
#' @return A TRONCO compliant dataset with the internal genotypes sorted according to event frequency.
#' @export order.frequency
#'
order.frequency <- function(x, decreasing = TRUE) {
is.compliant(x)
x = enforce.numeric(x)
sums = colSums(x$genotypes)
x$genotypes = x$genotypes[, order(sums, decreasing = decreasing), drop = FALSE]
x$annotations = x$annotations[colnames(x$genotypes), , drop = FALSE]
return(x)
}
#' Convert colnames/rownames of a matrix into intelligible event names, e.g., change a key G23 in 'Mutation KRAS'.
#' If a name is not found, the original name is left unchanged.
#'
#' @examples
#' data(test_model)
#' adj_matrix = as.adj.matrix(test_model, events=as.events(test_model)[5:15,])$capri_bic
#' keysToNames(test_model, adj_matrix)
#'
#'
#' @title keysToNames
#' @param x A TRONCO compliant dataset.
#' @param matrix A matrix with colnames/rownames which represent genotypes keys.
#' @return The matrix with intelligible colnames/rownames.
#' @export keysToNames
#'
keysToNames <- function(x, matrix) {
is.compliant(x)
if (!is.matrix(matrix)
|| any(is.null(colnames(matrix)))
|| any(is.null(rownames(matrix))))
stop('"matrix" should be a matrix with rownames/colnames.')
events = as.events(x)
resolve <- function(y) {
if (y %in% rownames(events)) paste(events[y,], collapse=' ')
else y
}
colnames(matrix) = sapply(colnames(matrix), resolve)
rownames(matrix) = sapply(rownames(matrix), resolve)
return(matrix)
}
#' Convert to key an intelligible event names, e.g., change 'Mutation KRAS' in G23.
#' If a name is not found, an error is raised!
#'
#' @examples
#' data(test_model)
#' adj_matrix = as.adj.matrix(test_model, events=as.events(test_model)[5:15,])$bic
#'
#' @title nameToKey
#' @param x A TRONCO compliant dataset.
#' @param name A intelligible event name
#' @return A TRONCO dataset key name
#' @export nameToKey
#'
nameToKey <- function(x, name) {
is.compliant(x)
types = as.types(x)
for (i in types) {
if (nchar(name) > nchar(i) && substr(name, 1, nchar(i)) == i)
return(rownames(as.events(x,
genes = substr(name, nchar(i) + 2, nchar(name)),
types = substr(name, 1, nchar(i)))))
}
stop('"name" is not a key!')
}
# Check if logic node down
#
# @title is logical node down
# @param node A node identifier
# @return boolean
#
is.logic.node.down <- function(node) {
if (substr(node, start = 1, stop = 3) == 'OR_')
return(TRUE)
if (substr(node, start = 1, stop = 4) == 'XOR_')
return(TRUE)
if (substr(node, start = 1, stop = 4) == 'AND_')
return(TRUE)
if (substr(node, start = 1, stop = 4) == 'NOT_')
return(TRUE)
return(FALSE)
}
# Check if logic node up
#
# @title is logical node up
# @param node A node identifier
# @return boolean
is.logic.node.up <- function(node) {
if (substr(node, start = 1, stop = 2) == 'UP')
return(TRUE)
return(FALSE)
}
# Check if logic node down or up
#
# @title is logical node
# @param node A node identifier
# @return boolean
is.logic.node <- function(node) {
return(is.logic.node.up(node) || is.logic.node.down(node))
}
as.categorical.dataset <- function(dataset){
## Create a categorical data frame from the dataset
data = array("missing", c(nrow(dataset), ncol(dataset)))
for (i in 1:nrow(dataset)) {
for (j in 1:ncol(dataset)) {
if (dataset[i,j] == 1) {
data[i,j] = "observed"
}
}
}
data = data.frame(data, stringsAsFactors = TRUE)
for (n in names(data)) {
levels(data[[n]]) = c('missing', 'observed')
}
## Renaming
colnames(data) = colnames(dataset)
rownames(data) = rownames(dataset)
return(data)
}
# Convert a TRONCO object in a Bnlearn network.
# title as.bnlearn.network
#
# examples
# data(test_model)
# as.bnlearn.network(test_model)
#
# param x A reconstructed model (the output of tronco.capri or tronco.caprese)
# param model The name of the selected regularization
# export as.bnlearn.network
# importFrom bnlearn empty.graph set.arc
#
as.bnlearn.network <- function(x,
model = names(as.models(x))[1]) {
## Check if there is a reconstructed model.
if(!has.model(x)) {
stop('Input doesn\'t have a TRONCO object inside.')
}
## Check if the selected regularization is used in the model.
if (!model %in% names(as.models(x))) {
stop(paste(model, " was not used to build the input TRONCO model!"))
}
## Get genotypes and data.
genotypes = as.genotypes(x)
genotypes = as.matrix(genotypes)
genotypes = keysToNames(x, genotypes)
names(colnames(genotypes)) = NULL
df = as.categorical.dataset(genotypes)
adj.matrix = get(model, as.adj.matrix(x, models = model))
adj.matrix = keysToNames(x, adj.matrix)
bayes.net = NULL
bayes.net$data = df
net = empty.graph(colnames(genotypes))
for (from in rownames(adj.matrix)) {
for (to in colnames(adj.matrix)) {
if (adj.matrix[from, to] == 1) {
net = set.arc(net, from, to)
}
}
}
bayes.net$net = net
return(bayes.net)
}
#### end of file -- as.functions.R
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.