2020-07-14 14:35:33 +02:00
|
|
|
newGetDistances <- function(data, rowsFromInd) {
|
2022-02-03 10:43:34 +01:00
|
|
|
ninds <- base::max(data[, ncol(data)])
|
2021-11-10 14:02:35 +01:00
|
|
|
nloci <- size(data, 2) - 1
|
|
|
|
|
riviLkm <- choose(ninds, 2)
|
|
|
|
|
|
2022-02-03 10:43:34 +01:00
|
|
|
empties <- matlab2r::find(data < 0)
|
2021-11-10 14:02:35 +01:00
|
|
|
data[empties] <- 0
|
2022-02-03 10:43:34 +01:00
|
|
|
data <- apply(data, 2, as.numeric) # base::max(noalle) oltava <256
|
2021-11-10 14:02:35 +01:00
|
|
|
|
|
|
|
|
pariTaulu <- zeros(riviLkm, 2)
|
|
|
|
|
aPointer <- 1
|
|
|
|
|
for (a in 1:(ninds - 1)) {
|
|
|
|
|
pariTaulu_rows <- aPointer:(aPointer + ninds - 1 - a)
|
|
|
|
|
pariTaulu[pariTaulu_rows, 1] <- ones(ninds - a, 1) * a
|
|
|
|
|
pariTaulu[pariTaulu_rows, 2] <- t((a + 1):ninds)
|
|
|
|
|
aPointer <- aPointer + ninds - a
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
eka <- pariTaulu[, ones(1, rowsFromInd)]
|
|
|
|
|
eka <- eka * rowsFromInd
|
|
|
|
|
miinus <- repmat((rowsFromInd - 1):0, c(riviLkm, 1))
|
|
|
|
|
eka <- eka - miinus
|
|
|
|
|
|
|
|
|
|
toka <- pariTaulu[, ones(1, rowsFromInd) * 2]
|
|
|
|
|
toka <- toka * rowsFromInd
|
|
|
|
|
toka <- toka - miinus
|
|
|
|
|
|
|
|
|
|
summa <- zeros(riviLkm, 1)
|
|
|
|
|
vertailuja <- zeros(riviLkm, 1)
|
|
|
|
|
|
|
|
|
|
rm(pariTaulu, miinus)
|
|
|
|
|
|
|
|
|
|
x <- zeros(size(eka))
|
|
|
|
|
x <- apply(x, 2, as.integer)
|
|
|
|
|
y <- zeros(size(toka))
|
|
|
|
|
y <- apply(y, 2, as.integer)
|
|
|
|
|
|
2024-03-25 12:35:31 +01:00
|
|
|
for (j in seq_len(nloci)) {
|
2021-11-10 14:02:35 +01:00
|
|
|
for (k in 1:rowsFromInd) {
|
|
|
|
|
x[, k] <- data[eka[, k], j]
|
|
|
|
|
y[, k] <- data[toka[, k], j]
|
|
|
|
|
}
|
|
|
|
|
for (a in 1:rowsFromInd) {
|
|
|
|
|
for (b in 1:rowsFromInd) {
|
|
|
|
|
vertailutNyt <- as.double(x[, a] > 0 & y[, b] > 0)
|
|
|
|
|
vertailuja <- vertailuja + vertailutNyt
|
|
|
|
|
lisays <- (x[, a] != y[, b] & vertailutNyt)
|
|
|
|
|
summa <- summa + as.double(lisays)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rm(x, y, vertailutNyt)
|
2022-02-03 10:43:34 +01:00
|
|
|
nollat <- matlab2r::find(vertailuja == 0)
|
2021-11-10 14:02:35 +01:00
|
|
|
dist <- zeros(length(vertailuja), 1)
|
|
|
|
|
dist[nollat] <- 1
|
2022-02-03 10:43:34 +01:00
|
|
|
muut <- matlab2r::find(vertailuja > 0)
|
2021-11-10 14:02:35 +01:00
|
|
|
dist[muut] <- summa[muut] / vertailuja[muut]
|
|
|
|
|
rm(summa, vertailuja)
|
|
|
|
|
Z <- linkage(t(dist))
|
|
|
|
|
return(list(Z = Z, dist = dist))
|
|
|
|
|
}
|