# read in mutual information fx
mutualInfoAdjacency <- function(datE, discretizeColumns = TRUE, entropyEstimationMethod = "MM", numberBins = NULL) {
reqPackages <- c("infotheo", "minet", "entropy")
nReq <- length(reqPackages)
for (r in 1:nReq)
{
expression <- spaste('require("', reqPackages[r], '", quietly = TRUE)')
ok <- eval(parse(text = expression))
if (!ok) stop("The function requires R package infotheo, minet and entropy. Please install these packages first.")
}
if (!is.element(discretizeColumns, c(TRUE, FALSE))) stop("The input parameter discretizeColumns
contains a value that is not logical. It needs to be set to TRUE or FALSE")
if (!is.element(entropyEstimationMethod, c("MM", "ML", "shrink", "SG"))) {
warning("The entropy estimation method does not correspond to any of the following: MM, ML, shrink, SG. MM will be used.")
entropyEstimationMethod <- "MM"
}
datE <- data.frame(datE)
if (!(dim(datE)[[2]] > 1)) stop("The number of columns of datE must be larger than 1")
entropyOfCountData <- function(counts) {
express <- 'entropy::entropy(table(counts) , unit="log", method= entropyEstimationMethod)'
eval(parse(text = express))
}
if (is.null(numberBins)) numberBins <- sqrt(nrow(datE))
if (!is.null(numberBins)) numberBins <- as.integer(numberBins)
if (!(numberBins > 1)) stop("Something is wrong with the input parameter numberBins, which is used for discretizing the quantitative variables. numberBins should be larger than 1. Recommendation: choose the default value numberBins=NULL")
if (discretizeColumns) {
express <- 'infotheo::discretize(datE, disc ="equalwidth", nbins=numberBins)'
discretized.datE <- eval(parse(text = express))
}
if (!discretizeColumns) {
discretized.datE <- datE
}
ENTROPY <- as.numeric(apply(discretized.datE, 2, entropyOfCountData))
if (entropyEstimationMethod == "MM") entropyEstimationMethodRenamed <- "mi.mm"
if (entropyEstimationMethod == "ML") entropyEstimationMethodRenamed <- "mi.empirical"
if (entropyEstimationMethod == "shrink") entropyEstimationMethodRenamed <- "mi.shrink"
if (entropyEstimationMethod == "SG") entropyEstimationMethodRenamed <- "mi.sg"
express <- "minet::build.mim(discretized.datE , estimator= entropyEstimationMethodRenamed)"
MIxy <- eval(parse(text = express))
MIxy[MIxy < 0] <- 0
diag(MIxy) <- ENTROPY
AdjacencySymmetricUncertainty <- 2 * MIxy / outer(ENTROPY, ENTROPY, FUN = "+")
AdjacencyUniversal <- AdjacencySymmetricUncertainty / (2 - AdjacencySymmetricUncertainty)
AdjacencyUniversalVersion2 <- MIxy / outer(ENTROPY, ENTROPY, FUN = "pmax", na.rm = T)
# output
list(
Entropy = ENTROPY, MutualInformation = MIxy,
AdjacencySymmetricUncertainty = AdjacencySymmetricUncertainty, AdjacencyUniversalVersion1 = AdjacencyUniversal, AdjacencyUniversalVersion2 = AdjacencyUniversalVersion2
)
} # end of function mutualInfoAdjacency
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.