diff --git a/NAMESPACE b/NAMESPACE index a7ddd55..aff9bfb 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -48,6 +48,7 @@ importFrom(ape,read.FASTA) importFrom(matlab2r,blanks) importFrom(matlab2r,cell) importFrom(matlab2r,colon) +importFrom(matlab2r,disp) importFrom(matlab2r,find) importFrom(matlab2r,inputdlg) importFrom(matlab2r,isempty) diff --git a/R/checkLogml.R b/R/checkLogml.R new file mode 100644 index 0000000..ff7435c --- /dev/null +++ b/R/checkLogml.R @@ -0,0 +1,27 @@ +checkLogml <- function(priorTerm, adjprior, cliques, separators) { + # tarkistaa logml:n + + # global CLIQCOUNTS + # global SEPCOUNTS + # global PARTITION + + npops <- length(unique(PARTITION)) + cliqcounts <- computeCounts(cliques, separators, npops)$cliqcounts + sepcounts <- computeCounts(cliques, separators, npops)$sepcounts + + CLIQCOUNTS <- cliqcounts + SEPCOUNTS <- sepcounts + + logml <- computeLogml(adjprior, priorTerm)$logml + spatialPrior <- computeLogml(adjprior, priorTerm)$spatialPrior + + disp( + c( + 'logml: ', + logml2String(logml), + ', spatial prior: ', + logml2String(spatialPrior) + ) + ) + return(logml) +} diff --git a/R/laskeMuutokset12345.R b/R/laskeMuutokset12345.R index 7cffc86..df9bf11 100644 --- a/R/laskeMuutokset12345.R +++ b/R/laskeMuutokset12345.R @@ -13,7 +13,266 @@ spatialMixture_muutokset <- R6Class( laskeMuutokset = function( ind, rowsFromInd, data, adjprior, priorTerm, logml, cliques, separators ) { - stop("Not yet implemented") # TODO: implement + # Palauttaa npops * 1 taulun, jossa i:s alkio kertoo, mik?olisi + # muutos logml:ss? mikהli yksil?ind siirretההn koriin i. + # diffInCounts on poistettava COUNTS:in siivusta i1 ja lisהttהv? + # COUNTS:in siivuun i2, mikהli muutos toteutetaan. + npops <- size(COUNTS, 3) + muutokset <- zeros(npops, 1) + + emptyPop_pops <- findEmptyPop(npops) + emptyPop <- emptyPop_pops$emptyPop + pops <- emptyPop_pops$pops + rm(emptyPop_pops) + + i1 <- PARTITION(ind) + i2 <- pops[find(pops != i1)] + if (emptyPop > 0) { + i2 <- c(i2, emptyPop) + } + + rows <- ((ind - 1) * rowsFromInd + 1):(ind * rowsFromInd) + diffInCounts <- computeDiffInCounts(rows, size(COUNTS, 1), size(COUNTS, 2), data) + diffInSumCounts <- sum(diffInCounts) + + diffInCliqCounts <- computeDiffInCliqCounts(cliques, ind) + diffInSepCounts <- computeDiffInCliqCounts(separators, ind) + + COUNTS[, ,i1] <- COUNTS[, , i1] - diffInCounts + SUMCOUNTS[i1, ] <- SUMCOUNTS[i1, ] - diffInSumCounts + CLIQCOUNTS[, i1] <- CLIQCOUNTS[, i1] - diffInCliqCounts + SEPCOUNTS[, i1] <- SEPCOUNTS[, i1] - diffInSepCounts + + for (i in i2) { + CLIQCOUNTS[, i] <- CLIQCOUNTS[, i] + diffInCliqCounts + SEPCOUNTS[, i] <- SEPCOUNTS[, i] + diffInSepCounts + COUNTS[, ,i] <- COUNTS[, , i] + diffInCounts + SUMCOUNTS[i, ] <- SUMCOUNTS[i, ] + diffInSumCounts + + muutokset[i] <- computeLogml(adjprior, priorTerm) - logml + + CLIQCOUNTS[, i] <- CLIQCOUNTS[, i] - diffInCliqCounts + SEPCOUNTS[, i] <- SEPCOUNTS[, i] - diffInSepCounts + COUNTS[, , i] <- COUNTS[, , i] - diffInCounts + SUMCOUNTS[i, ] <- SUMCOUNTS[i, ] - diffInSumCounts + } + + COUNTS[, , i1] <- COUNTS[, , i1] + diffInCounts + SUMCOUNTS[i1, ] <- SUMCOUNTS[i1, ] + diffInSumCounts + CLIQCOUNTS[, i1] <- CLIQCOUNTS[, i1] + diffInCliqCounts + SEPCOUNTS[, i1] <- SEPCOUNTS[, i1] + diffInSepCounts + + # Asetetaan muillekin tyhjille populaatioille sama muutos, kuin + # emptyPop:lle + + if (emptyPop > 0) { + empties <- mysetdiff(1:npops, c(i2, i1)) + muutokset[empties] <- muutokset(emptyPop) + } + return(list(muutokset = muutokset, diffInCounts = diffInCounts)) + }, + #' @param i1 i1 + #' @param rowsFromInd rowsFromInd + #' @param data data + #' @param adjprior adjprior + #' @param priorTerm priorTerm + #' @param logml logml + #' @param cliques cliques + #' @param separators separators + laskeMuutokset2 = function( + i1, rowsFromInd, data, adjprior, priorTerm, logml, cliques, separators + ) { + # Palauttaa npops * 1 taulun, jossa i:s alkio kertoo, mik?olisi + # muutos logml:ss? mikהli korin i1 kaikki yksilצt siirretההn + # koriin i. + # Laskee muutokset vain yhdelle tyhjהlle populaatiolle, muille tulee + # muutokseksi 0. + # global COUNTS # global SUMCOUNTS + # global PARTITION # global POP_LOGML + # global CLIQCOUNTS # global SEPCOUNTS + + npops <- size(COUNTS, 3) + muutokset <- zeros(npops, 1) + + emptyPop <- findEmptyPop(npops)$emptyPop + pops <- findEmptyPop(npops)$npops + + i2 <- pops[find(pops != i1)] + if (emptyPop > 0) { + i2 <- c(i2, emptyPop) + } + + inds <- find(PARTITION == i1) + rows <- computeRows(rowsFromInd, inds, length(inds)) + + diffInCounts <- computeDiffInCounts(rows, size(COUNTS, 1), size(COUNTS, 2), data) + diffInSumCounts <- sum(diffInCounts) + diffInCliqCounts <- computeDiffInCliqCounts(cliques, inds) + diffInSepCounts <- computeDiffInCliqCounts(separators, inds) + + COUNTS[, ,i1] <- COUNTS[, , i1] - diffInCounts + SUMCOUNTS[i1, ] <- SUMCOUNTS[i1, ] - diffInSumCounts + CLIQCOUNTS[, i1] <- 0 + SEPCOUNTS[, i1] <- 0 + + for (i in i2) { + CLIQCOUNTS[, i] <- CLIQCOUNTS[, i] + diffInCliqCounts + SEPCOUNTS[, i] <- SEPCOUNTS[, i] + diffInSepCounts + COUNTS[, ,i] <- COUNTS[, , i] + diffInCounts + SUMCOUNTS[i, ] <- SUMCOUNTS[i, ] + diffInSumCounts + + muutokset[i] <- computeLogml(adjprior, priorTerm) - logml + + CLIQCOUNTS[, i] <- CLIQCOUNTS[, i] - diffInCliqCounts + SEPCOUNTS[, i] <- SEPCOUNTS[, i] - diffInSepCounts + COUNTS[, ,i] <- COUNTS[, , i] - diffInCounts + SUMCOUNTS[i, ] <- SUMCOUNTS[i, ] - diffInSumCounts + } + + COUNTS[, ,i1] <- COUNTS[, , i1] + diffInCounts + SUMCOUNTS[i1, ] <- SUMCOUNTS[i1, ] + diffInSumCounts + CLIQCOUNTS[, i1] <- diffInCliqCounts + SEPCOUNTS[, i1] <- diffInSepCounts + return(list(muutokset = muutokset, diffInCounts = diffInCounts)) + }, + #' @param T2 T2 + #' @param inds2 inds2 + #' @param rowsFromInd rowsFromInd + #' @param data data + #' @param adjprior adjprior + #' @param priorTerm priorTerm + #' @param i1 i1 + #' @param logml logml + #' @param cliques cliques + #' @param separators separators + laskeMuutokset3 = function( + T2, inds2, rowsFromInd, data, adjprior, priorTerm, i1, logml, cliques, + separators + ) { + # Palauttaa length(unique(T2)) * npops taulun, jossa (i, j):s alkio + # kertoo, mik?olisi muutos logml:ss? jos populaation i1 osapopulaatio + # inds2(find(T2 == i)) siirretההn koriin j. + # Laskee vain yhden tyhjהn populaation, muita kohden muutokseksi jהה 0. + + # global COUNTS # global SUMCOUNTS + # global PARTITION # global POP_LOGML + # global CLIQCOUNTS # global SEPCOUNTS + + npops <- size(COUNTS, 3) + npops2 <- length(unique(T2)) + muutokset <- zeros(npops2, npops) + + for (pop2 in 1:npops2) { + inds <- inds2[find(T2 == pop2)] + ninds <- length(inds) + if (ninds > 0) { + rows <- computeRows(rowsFromInd, inds, ninds) + + diffInCounts <- computeDiffInCounts(rows, size(COUNTS, 1), size(COUNTS, 2), data) + diffInSumCounts <- sum(diffInCounts) + diffInCliqCounts <- computeDiffInCliqCounts(cliques, inds) + diffInSepCounts <- computeDiffInCliqCounts(separators, inds) + + COUNTS[, ,i1] <- COUNTS[, , i1] - diffInCounts + SUMCOUNTS[i1, ] <- SUMCOUNTS[i1, ] - diffInSumCounts + CLIQCOUNTS[, i1] <- CLIQCOUNTS[, i1] - diffInCliqCounts + SEPCOUNTS[, i1] <- SEPCOUNTS[, i1] - diffInSepCounts + + emptyPop <- findEmptyPop(npops)$emptyPop + pops <- findEmptyPop(npops)$pops + i2 <- pops[find(pops != i1)] + if (emptyPop > 0) { + i2 <- c(i2, emptyPop) + } + + for (i in i2) { + CLIQCOUNTS[, i] <- CLIQCOUNTS[, i] + diffInCliqCounts + SEPCOUNTS[, i] <- SEPCOUNTS[, i] + diffInSepCounts + COUNTS[, ,i] <- COUNTS[, , i] + diffInCounts + SUMCOUNTS[i, ] <- SUMCOUNTS[i, ] + diffInSumCounts + + muutokset[pop2, i] <- computeLogml(adjprior, priorTerm) - logml + + CLIQCOUNTS[, i] <- CLIQCOUNTS[, i] - diffInCliqCounts + SEPCOUNTS[, i] <- SEPCOUNTS[, i] - diffInSepCounts + COUNTS[, ,i] <- COUNTS[, , i] - diffInCounts + SUMCOUNTS[i, ] <- SUMCOUNTS[i, ] - diffInSumCounts + } + + COUNTS[, ,i1] <- COUNTS[, , i1] + diffInCounts + SUMCOUNTS[i1, ] <- SUMCOUNTS[i1, ] + diffInSumCounts + CLIQCOUNTS[, i1] <- CLIQCOUNTS[, i1] + diffInCliqCounts + SEPCOUNTS[, i1] <- SEPCOUNTS[, i1] + diffInSepCounts + } + } + return(muutokset) + }, + #' @param inds inds + #' @param rowsFromInd rowsFromInd + #' @param data data + #' @param adjprior adjprior + #' @param priorTerm priorTerm + #' @param logml logml + #' @param cliques cliques + #' @param separators separators + #' @param i1 i1 + #' @param i2 i2 + laskeMuutokset5 = function( + inds, rowsFromInd, data, adjprior, priorTerm, logml, cliques, separators, + i1, i2 + ) { + # Palauttaa length(inds) * 1 taulun, jossa i:s alkio kertoo, mik?olisi + # muutos logml:ss? mikהli yksil?i vaihtaisi koria i1:n ja i2:n vהlill? + + # global COUNTS # global SUMCOUNTS + # global PARTITION + # global CLIQCOUNTS # global SEPCOUNTS + + ninds <- length(inds) + muutokset <- zeros(ninds, 1) + cliqsize <- size(CLIQCOUNTS, 2) + sepsize <- size(SEPCOUNTS, 2) + + for (i in 1:ninds) { + ind <- inds[i] + if (PARTITION[ind] == i1) { + pop1 <- i1 # mist? + pop2 <- i2 # mihin + } else { + pop1 <- i2 + pop2 <- i1 + } + rows <- ((ind - 1) * rowsFromInd + 1):(ind * rowsFromInd) + + diffInCounts <- computeDiffInCounts(rows, size(COUNTS, 1), size(COUNTS, 2), data) + diffInSumCounts <- sum(diffInCounts) + diffInCliqCounts <- computeDiffInCliqCounts(cliques, ind) + diffInSepCounts <- computeDiffInCliqCounts(separators, ind) + + COUNTS[, ,pop1] <- COUNTS[, , pop1] - diffInCounts + SUMCOUNTS[pop1, ] <- SUMCOUNTS[pop1, ] - diffInSumCounts + COUNTS[, ,pop2] <- COUNTS[, , pop2] + diffInCounts + SUMCOUNTS[pop2, ] <- SUMCOUNTS[pop2, ] + diffInSumCounts + + CLIQCOUNTS[, pop1] <- CLIQCOUNTS[, pop1] - diffInCliqCounts + CLIQCOUNTS[, pop2] <- CLIQCOUNTS[, pop2] + diffInCliqCounts + SEPCOUNTS[, pop1] <- SEPCOUNTS[, pop1] - diffInSepCounts + SEPCOUNTS[, pop2] <- SEPCOUNTS[, pop2] + diffInSepCounts + + muutokset[i] <- computeLogml(adjprior, priorTerm) - logml + + COUNTS[, ,pop1] <- COUNTS[, , pop1] + diffInCounts + SUMCOUNTS[pop1, ] <- SUMCOUNTS[pop1, ] + diffInSumCounts + COUNTS[, ,pop2] <- COUNTS[, , pop2] - diffInCounts + SUMCOUNTS[pop2, ] <- SUMCOUNTS[pop2, ] - diffInSumCounts + + CLIQCOUNTS[, pop1] <- CLIQCOUNTS[, pop1] + diffInCliqCounts + CLIQCOUNTS[, pop2] <- CLIQCOUNTS[, pop2] - diffInCliqCounts + SEPCOUNTS[, pop1] <- SEPCOUNTS[, pop1] + diffInSepCounts + SEPCOUNTS[, pop2] <- SEPCOUNTS[, pop2] - diffInSepCounts + + } + return(muutokset) } ) ) diff --git a/R/rBAPS-package.R b/R/rBAPS-package.R index c9fde26..3867ba3 100644 --- a/R/rBAPS-package.R +++ b/R/rBAPS-package.R @@ -7,6 +7,6 @@ #' Check the "BugReports" field on the package description for the URL. #' @importFrom matlab2r blanks cell colon find inputdlg #' isempty isfield isspace max min ones questdlg rand repmat reshape -#' size sortrows squeeze strcmp times zeros +#' size sortrows squeeze strcmp times zeros disp #' @importFrom stats runif NULL diff --git a/man/spatialMixture_muutokset.Rd b/man/spatialMixture_muutokset.Rd index ca75f0b..93f945b 100644 --- a/man/spatialMixture_muutokset.Rd +++ b/man/spatialMixture_muutokset.Rd @@ -12,6 +12,9 @@ Calculate changes (spatial mixture class) \subsection{Public methods}{ \itemize{ \item \href{#method-spatialMixture_muutokset-laskeMuutokset}{\code{spatialMixture_muutokset$laskeMuutokset()}} +\item \href{#method-spatialMixture_muutokset-laskeMuutokset2}{\code{spatialMixture_muutokset$laskeMuutokset2()}} +\item \href{#method-spatialMixture_muutokset-laskeMuutokset3}{\code{spatialMixture_muutokset$laskeMuutokset3()}} +\item \href{#method-spatialMixture_muutokset-laskeMuutokset5}{\code{spatialMixture_muutokset$laskeMuutokset5()}} \item \href{#method-spatialMixture_muutokset-clone}{\code{spatialMixture_muutokset$clone()}} } } @@ -55,6 +58,135 @@ Calculate changes (spatial mixture class) } } \if{html}{\out{