From 248db439dcf7aa1800a34048b39ab39dad80a384 Mon Sep 17 00:00:00 2001 From: Waldir Leoncio Date: Thu, 30 Jan 2020 12:10:49 +0100 Subject: [PATCH] Added function with minimal testing --- NAMESPACE | 1 + R/admix1.R | 36 +---------------------------- R/computePersonalAllFreqs.R | 42 ++++++++++++++++++++++++++++++++++ man/computePersonalAllFreqs.Rd | 25 ++++++++++++++++++++ tests/testthat/test-admix1.R | 5 ++++ 5 files changed, 74 insertions(+), 35 deletions(-) create mode 100644 R/computePersonalAllFreqs.R create mode 100644 man/computePersonalAllFreqs.Rd diff --git a/NAMESPACE b/NAMESPACE index c77eb3f..8d9bb0b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,7 @@ export(admix1) export(calculatePopLogml) export(colon) export(computeIndLogml) +export(computePersonalAllFreqs) export(computeRows) export(etsiParas) export(laskeMuutokset4) diff --git a/R/admix1.R b/R/admix1.R index 86d2a13..f47f69d 100644 --- a/R/admix1.R +++ b/R/admix1.R @@ -486,38 +486,4 @@ admix1 <- function(tietue) { # cumsumma = cumsum(freqs); # arvo = rand; # isommat = find(cumsumma>arvo); -# all = min(isommat); - - -# %-------------------------------------------------------------------------- - - -# function omaFreqs = computePersonalAllFreqs(ind, data, allFreqs, rowsFromInd) -# % Laskee npops*(rowsFromInd*nloci) taulukon, jonka kutakin saraketta -# % vastaa yksilön ind alleeli. Eri rivit ovat alleelin alkuperäfrekvenssit -# % eri populaatioissa. Jos yksilölt?puuttuu jokin alleeli, niin vastaavaan -# % kohtaa tulee sarake ykkösi? - -# global COUNTS; -# nloci = size(COUNTS,2); -# npops = size(COUNTS,3); - -# rows = data(computeRows(rowsFromInd, ind, 1),:); - -# omaFreqs = zeros(npops, (rowsFromInd*nloci)); -# pointer = 1; -# for loc=1:size(rows,2) -# for all=1:size(rows,1) -# if rows(all,loc)>=0 -# try, -# omaFreqs(:,pointer) = ... -# reshape(allFreqs(rows(all,loc),loc,:), [npops,1]); -# catch -# a=0; -# end -# else -# omaFreqs(:,pointer) = ones(npops,1); -# end -# pointer = pointer+1; -# end -# end \ No newline at end of file +# all = min(isommat); \ No newline at end of file diff --git a/R/computePersonalAllFreqs.R b/R/computePersonalAllFreqs.R new file mode 100644 index 0000000..f0845f6 --- /dev/null +++ b/R/computePersonalAllFreqs.R @@ -0,0 +1,42 @@ +#' @title Compute Personal Freqs +#' @description Laskee npops*(rowsFromInd*nloci) taulukon, jonka kutakin +#' saraketta vastaa yksilön ind alleeli. Eri rivit ovat alleelin +#' alkuperäfrekvenssit eri populaatioissa. Jos yksilölt?puuttuu jokin alleeli, +#' niin vastaavaan kohtaa tulee sarake ykkösi? +#' @param ind ind +#' @param data data +#' @param allFreqs allFreqs +#' @param rowsFromInd rowsFromInd +#' @param COUNTS COUNTS +#' @export + +computePersonalAllFreqs <- function(ind, data, allFreqs, rowsFromInd, +COUNTS = matrix(0)) { + nloci <- ifelse(is.na(dim(COUNTS)[2]), 1, dim(COUNTS)[2]) + npops <- ifelse(is.na(dim(COUNTS)[3]), 1, dim(COUNTS)[3]) + + rows <- as.matrix(t(data))[computeRows(rowsFromInd, ind, 1), , drop = FALSE] + + omaFreqs <- zeros(npops, rowsFromInd * nloci) + pointer <- 1 + for (loc in 1:dim(rows)[2]) { + for (all in 1:dim(rows)[1]) { + if (rows[all, loc] >= 0) { + if (pointer > ncol(omaFreqs)) omaFreqs <- cbind(omaFreqs, 0) + omaFreqs[, pointer] <- tryCatch( + matrix( + data = as.matrix(t(allFreqs))[rows[all, loc], loc], + nrow = npops + ), + error = function(e) return(NA) + ) + } else { + omaFreqs[, pointer] <- ones(npops, 1) + } + # omaFreqs <- unname(cbind(omaFreqs, new_omaFreqs)) + pointer <- pointer + 1 + } + } + omaFreqs <- omaFreqs[, !is.na(omaFreqs)] + return(omaFreqs) +} \ No newline at end of file diff --git a/man/computePersonalAllFreqs.Rd b/man/computePersonalAllFreqs.Rd new file mode 100644 index 0000000..75e5be3 --- /dev/null +++ b/man/computePersonalAllFreqs.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/computePersonalAllFreqs.R +\name{computePersonalAllFreqs} +\alias{computePersonalAllFreqs} +\title{Compute Personal Freqs} +\usage{ +computePersonalAllFreqs(ind, data, allFreqs, rowsFromInd, COUNTS = matrix(0)) +} +\arguments{ +\item{ind}{ind} + +\item{data}{data} + +\item{allFreqs}{allFreqs} + +\item{rowsFromInd}{rowsFromInd} + +\item{COUNTS}{COUNTS} +} +\description{ +Laskee npops*(rowsFromInd*nloci) taulukon, jonka kutakin +saraketta vastaa yksilön ind alleeli. Eri rivit ovat alleelin +alkuperäfrekvenssit eri populaatioissa. Jos yksilölt?puuttuu jokin alleeli, +niin vastaavaan kohtaa tulee sarake ykkösi? +} diff --git a/tests/testthat/test-admix1.R b/tests/testthat/test-admix1.R index 5221db0..fd39abd 100644 --- a/tests/testthat/test-admix1.R +++ b/tests/testthat/test-admix1.R @@ -171,4 +171,9 @@ test_that("etsiParas works like on Matlab", { expected = c(7.4, 0, complex(real = 1.8563, imaginary = 3.1416)), tol = .0001 ) +}) + +test_that("computePersonalAllFreqs works like on Matlab", { + expect_equal(computePersonalAllFreqs(1, 1:4, c(15, 5, 10, 40), 1), 15) + # TODO: test with 2x2 matrix }) \ No newline at end of file