R/Hobotnica.R

Defines functions Hobot_pval Hobot_distr Hobotnica

Documented in Hobotnica

Hobotnica <- function(distMatrix, annotation){
    if (typeof(annotation) == "list") {
        annotation <- as.vector(unlist(annotation))
    } else {
        annotation <- as.vector(annotation)
    }
    rank.m <- as.matrix(distMatrix) # transform distance matrix to matrix object
    rank.m[lower.tri(rank.m)] <- rank(rank.m[lower.tri(rank.m)]) # transform distances to ranks
    rank.m[upper.tri(rank.m)] <- rank(rank.m[upper.tri(rank.m)]) #

    inclass_sum <- 0
    classes <- unique(annotation) # unique classes
    Ns <- vector()

    for (i  in 1:length(classes)){

        clas <- classes[i]
        class_samples <- which(annotation == clas)
        l_tmp <- length(class_samples)
        Ns[i] <- l_tmp
        tmp_sum_inclass <- sum(rank.m[class_samples,class_samples]) # sum of ranks, describing in-class distances
        inclass_sum <- inclass_sum + tmp_sum_inclass


    }
    Ns_sum <- sum(Ns)
    biggest_bossible_rank <-  Ns_sum * (Ns_sum - 1)/2
    number_of_unique_inclass_elements <-  sum(Ns * (Ns-1))/2
    maximal_value <- number_of_unique_inclass_elements * (2*biggest_bossible_rank - number_of_unique_inclass_elements + 1)
    minimal_value <- number_of_unique_inclass_elements* (1 + number_of_unique_inclass_elements)

    normalization_factor <- maximal_value - minimal_value
    return (max(0, 1 - (inclass_sum - minimal_value)/normalization_factor ))

}



Hobot_distr <- function(N ,distMatrix, annotation){

    hobots <- vector()
    for (i in 1:100000){
        sample_anno <- annotation
        sample_anno[,1] <- sample(annotation[,1])
        hobots <- c(hobots, Hobotnica(distMatrix, sample_anno)$total)
    }

    return(hobots)
}


Hobot_pval <- function(Test_hobot ,Hobots){
    p_val <- mean(Hobots <= Test_hobot)
    return(p_val)

}
lab-medvedeva/Hobotnica-main documentation built on Dec. 21, 2021, 8:48 a.m.