]> git.donarmstrong.com Git - ape.git/blob - R/compar.lynch.R
final warp for ape 3.0-2
[ape.git] / R / compar.lynch.R
1 ## compar.lynch.R (2002-08-28)
2
3 ##   Lynch's Comparative Method
4
5 ## Copyright 2002 Julien Claude
6
7 ## This file is part of the R-package `ape'.
8 ## See the file ../COPYING for licensing issues.
9
10 compar.lynch <- function(x, G, eps = 1e-4)
11 {
12     if (is.vector(x) || is.data.frame(x)) x <- as.matrix(x)
13     alea <- runif(1, 0, 1)
14     z <- as.vector(x)
15     uz <- apply(x, 2, mean)
16     vcvz <- var(x)
17     vz <- diag(vcvz)
18     nsp <- nrow(x)
19     k <- ncol(x)
20     X1 <- matrix(0, k, k)
21     diag(X1) <- 1
22     I <- matrix(0, nsp, nsp)
23     diag(I) <- 1
24     vara <- trvare <- matrix(NA, k, k)
25     nsp1 <- rep(1, nsp)
26     X <- X1 %x% nsp1
27     compteur <- 0
28     vara <- A0 <- alea * vcvz
29     vare <- E0 <- (1 - alea) * vcvz
30     newu <- u0 <- uz
31     Ginv <- solve(G)
32     V0 <- vcvz %x% G
33     a0 <- e0 <- matrix(0, nsp, k)
34     a1 <- e1 <- matrix(1, nsp, k)
35     while (any(abs((rbind(a1, e1) - rbind(a0, e0))) > eps)) {
36         a1 <- a0
37         e1 <- e0
38         compteur <- compteur + 1
39         Rinv <- solve(E0 %x% I)
40         Dinv <- solve(A0 %x% G)
41         info <- solve(Rinv + Dinv)
42         newa <- solve(Rinv + Dinv) %*% Rinv %*% (z - X %*% u0)
43         newe <- z - X %*% u0 - newa
44         e0 <- mnewe <- matrix(newe, nsp, k)
45         a0 <- mnewa <- matrix(newa, nsp, k)
46
47         for (i in 1:k) {
48             for (j in 1:k) {
49                 trvare[i, j] <- sum(diag(info[(((i - 1) * nsp) + 1):(i * nsp),
50                                               (((j - 1) * nsp) + 1):(j * nsp)]))}
51         }
52         vare <- ((nsp - 1) * var(mnewe) + trvare) / nsp
53
54         for (i in 1:k) {
55             for (j in 1:k) {
56                 vara[i, j] <- (t(mnewa[, i]) %*% Ginv %*% mnewa[, j] +
57                               sum(diag(Ginv %*%
58                                        info[(((i - 1) * nsp) + 1):(i * nsp),
59                                             (((j - 1) * nsp) + 1):(j * nsp)]))) / nsp
60             }
61         }
62
63         newu <- apply(x - mnewa, 2, mean)
64         V  <-  vara %x% G + vare %x% I
65
66         p <- (2 * pi)^(-nsp) * det(V)^(-0.5) *
67           exp(-0.5 * t(z - (X %*% newu)) %*% solve(V) %*% (z - (X %*% newu)))
68         E0 <- vare
69         A0 <- vara
70         u0 <- newu
71     }
72     dimnames(vare) <- dimnames(vara)
73     list(vare = vare, vara = vara, A = mnewa, E = mnewe, u = newu, lik = log(p))
74 }