|
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 |
} |