File: compar.lynch.R

package info (click to toggle)
r-cran-ape 5.8-1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,676 kB
  • sloc: ansic: 7,676; cpp: 116; sh: 17; makefile: 2
file content (74 lines) | stat: -rw-r--r-- 2,268 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
## compar.lynch.R (2002-08-28)

##   Lynch's Comparative Method

## Copyright 2002 Julien Claude

## This file is part of the R-package `ape'.
## See the file ../COPYING for licensing issues.

compar.lynch <- function(x, G, eps = 1e-4)
{
    if (is.vector(x) || is.data.frame(x)) x <- as.matrix(x)
    alea <- runif(1, 0, 1)
    z <- as.vector(x)
    uz <- apply(x, 2, mean)
    vcvz <- var(x)
    vz <- diag(vcvz)
    nsp <- nrow(x)
    k <- ncol(x)
    X1 <- matrix(0, k, k)
    diag(X1) <- 1
    I <- matrix(0, nsp, nsp)
    diag(I) <- 1
    vara <- trvare <- matrix(NA, k, k)
    nsp1 <- rep(1, nsp)
    X <- X1 %x% nsp1
    compteur <- 0
    vara <- A0 <- alea * vcvz
    vare <- E0 <- (1 - alea) * vcvz
    newu <- u0 <- uz
    Ginv <- solve(G)
    V0 <- vcvz %x% G
    a0 <- e0 <- matrix(0, nsp, k)
    a1 <- e1 <- matrix(1, nsp, k)
    while (any(abs((rbind(a1, e1) - rbind(a0, e0))) > eps)) {
        a1 <- a0
        e1 <- e0
	compteur <- compteur + 1
        Rinv <- solve(E0 %x% I)
        Dinv <- solve(A0 %x% G)
        info <- solve(Rinv + Dinv)
        newa <- solve(Rinv + Dinv) %*% Rinv %*% (z - X %*% u0)
        newe <- z - X %*% u0 - newa
        e0 <- mnewe <- matrix(newe, nsp, k)
        a0 <- mnewa <- matrix(newa, nsp, k)

        for (i in 1:k) {
            for (j in 1:k) {
                trvare[i, j] <- sum(diag(info[(((i - 1) * nsp) + 1):(i * nsp),
                                              (((j - 1) * nsp) + 1):(j * nsp)]))}
        }
        vare <- ((nsp - 1) * var(mnewe) + trvare) / nsp

        for (i in 1:k) {
            for (j in 1:k) {
                vara[i, j] <- (t(mnewa[, i]) %*% Ginv %*% mnewa[, j] +
                              sum(diag(Ginv %*%
                                       info[(((i - 1) * nsp) + 1):(i * nsp),
                                            (((j - 1) * nsp) + 1):(j * nsp)]))) / nsp
            }
        }

        newu <- apply(x - mnewa, 2, mean)
	V  <-  vara %x% G + vare %x% I

	p <- (2 * pi)^(-nsp) * det(V)^(-0.5) *
          exp(-0.5 * t(z - (X %*% newu)) %*% solve(V) %*% (z - (X %*% newu)))
        E0 <- vare
        A0 <- vara
        u0 <- newu
    }
    dimnames(vare) <- dimnames(vara)
    list(vare = vare, vara = vara, A = mnewa, E = mnewe, u = newu, lik = log(p))
}