2022-02-08 14:01:02 +01:00
|
|
|
getPopDistancesByKL <- function(adjprior) {
|
|
|
|
|
# Laskee populaatioille etהisyydet
|
|
|
|
|
# kהyttהen KL-divergenssi?
|
2024-04-10 16:04:07 +02:00
|
|
|
globals$COUNTS <- globals$COUNTS[seq_len(nrow(adjprior)), seq_len(ncol(adjprior)), ]
|
|
|
|
|
maxnoalle <- size(globals$COUNTS, 1)
|
|
|
|
|
nloci <- size(globals$COUNTS, 2)
|
|
|
|
|
npops <- size(globals$COUNTS, 3)
|
2022-02-08 14:01:02 +01:00
|
|
|
distances <- zeros(choose(npops, 2), 1)
|
|
|
|
|
|
|
|
|
|
d <- zeros(maxnoalle, nloci, npops)
|
|
|
|
|
prior <- adjprior
|
|
|
|
|
prior[find(prior == 1)] <- 0
|
2022-07-28 15:47:36 +02:00
|
|
|
|
|
|
|
|
# Lokukset, joissa oli havaittu vain yht?alleelia.
|
|
|
|
|
nollia <- find(all(prior == 0))
|
|
|
|
|
|
2022-02-08 14:01:02 +01:00
|
|
|
prior[1, nollia] <- 1
|
|
|
|
|
for (pop1 in 1:npops) {
|
2024-04-10 16:04:07 +02:00
|
|
|
d[, , pop1] <- (squeeze(globals$COUNTS[, , pop1]) + prior) / repmat(
|
|
|
|
|
sum(squeeze(globals$COUNTS[, , pop1]) + prior), c(maxnoalle, ncol(prior))
|
2022-07-28 15:47:36 +02:00
|
|
|
)
|
2022-02-08 14:01:02 +01:00
|
|
|
}
|
|
|
|
|
pointer <- 1
|
|
|
|
|
for (pop1 in 1:(npops - 1)) {
|
|
|
|
|
for (pop2 in (pop1 + 1):npops) {
|
|
|
|
|
dist1 <- d[, , pop1]
|
|
|
|
|
dist2 <- d[, , pop2]
|
2023-02-01 13:46:58 +01:00
|
|
|
div12 <- sum(sum(dist1 * base::log2((dist1 + 10^-10) / (dist2 + 10^-10)))) /
|
2022-07-28 15:47:36 +02:00
|
|
|
nloci
|
2023-02-01 13:46:58 +01:00
|
|
|
div21 <- sum(sum(dist2 * base::log2((dist2 + 10^-10) / (dist1 + 10^-10)))) /
|
2022-07-28 15:47:36 +02:00
|
|
|
nloci
|
2022-02-08 14:01:02 +01:00
|
|
|
div <- (div12 + div21) / 2
|
|
|
|
|
distances[pointer] <- div
|
|
|
|
|
pointer <- pointer + 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Z <- linkage(t(distances))
|
|
|
|
|
return(list(Z = Z, distances = distances))
|
|
|
|
|
}
|