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)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.