Switch to unified view

a b/R/marginal.posterior.profile.R
1
#' Function to get marginal posterior on -/0/+ profile
2
#'
3
#' @param pars A list object as returned by the function set.parameters
4
#' @param data.sub A 3-dimension array (N. SNPs x N. phenotypes x 3) with state likelihoods.
5
#' @return pp. A 2-dimension array (N. Phenotypes x 3) with posterior probabilties.
6
#' 
7
8
marginal.posterior.profile <- function(
9
    pars = NULL,
10
    data.sub = NULL
11
) {
12
13
    ## Get forward and G matrices
14
    tmp <- calc.llk.tree(pars, data.sub, returnForwardMatrix=T, returnGMatrix=T);
15
    f <- tmp$f;
16
    g <- tmp$g;
17
    
18
    ## Build parents list and reverse F traversal order
19
    parents <- rep(0, pars$n.phenos);
20
    for (i in pars$t.path) parents[pars$ontology[[i]]] <- i;
21
    ord <- c(rev(pars$t.path), pars$terminals);
22
23
    ## Construct backward matrix
24
    b <- array(0, dim(f));
25
    b[ord[1],] <- log(pars$stat.dist);
26
    for (i in ord[-1]) {
27
        r.i <- b[parents[i],]+f[parents[i],]-g[i,];
28
        mx <- max(r.i);
29
        tmp <- mx+log(sum(exp(r.i-mx)));
30
        tmp <- tmp+pars$lp.switch+log(pars$stat.dist);
31
        tmp2 <- -pars$theta.tree+b[parents[i],]+f[parents[i],]-g[i,];
32
        tmp3 <- cbind(tmp2, tmp);
33
        mx <- apply(tmp3, 1, max);
34
        b[i,] <- log(rowSums(exp(tmp3-mx)))+mx;
35
    }
36
    
37
    ## Posteriors
38
    tmp <- b+f;
39
    mx <- apply(tmp, 1, max);
40
    pp <- exp(tmp-mx);
41
    pp <- pp/rowSums(pp);
42
    return(pp);
43
}