a b/diagDA.R
1
> diagDA
2
function (ls, cll, ts, pool = TRUE) 
3
{
4
  ls <- data.matrix(ls)
5
  n <- nrow(ls)
6
  p <- ncol(ls)
7
  cl0 <- as.integer(min(cll, na.rm = TRUE) - 1)
8
  cll <- as.integer(cll) - cl0
9
  inaC <- is.na(cll)
10
  clL <- cll[!inaC]
11
  K <- max(clL)
12
  if (K != length(unique(clL))) 
13
    stop(sQuote("cll"), " did not contain *consecutive* integers")
14
  nk <- integer(K)
15
  m <- v <- matrix(0, p, K)
16
  colVars <- function(x, means = colMeans(x, na.rm = na.rm), 
17
                      na.rm = FALSE) {
18
    x <- sweep(x, 2, means)
19
    colSums(x * x, na.rm = na.rm)/(nrow(x) - 1)
20
  }
21
  sum.na <- function(x) sum(x, na.rm = TRUE)
22
  for (k in 1:K) {
23
    which <- (cll == k)
24
    nk[k] <- sum.na(which)
25
    lsk <- ls[which, , drop = FALSE]
26
    m[, k] <- colMeans(lsk, na.rm = TRUE)
27
    if (nk[k] > 1) 
28
      v[, k] <- colVars(lsk, na.rm = TRUE, means = m[, 
29
                                                     k])
30
  }
31
  ts <- data.matrix(ts)
32
  if (p != ncol(ts)) 
33
    stop("test set matrix must have same columns as learning one")
34
  ts <- na.exclude(ts)
35
  nt <- nrow(ts)
36
  disc <- matrix(0, nt, K)
37
  if (pool) {
38
    vp <- rowSums(rep(nk - 1, each = p) * v)/(n - K)
39
    if (any(i0 <- vp == 0)) 
40
      vp[i0] <- 1e-07 * min(vp[!i0])
41
    ivp <- rep(1/vp, each = nt)
42
    for (k in 1:K) {
43
      y <- ts - rep(m[, k], each = nt)
44
      disc[, k] <- rowSums(y * y * ivp)
45
    }
46
  }
47
  else {
48
    if (FALSE) {
49
      for (k in 1:K) {
50
        ts <- ts - rep(m[, k], each = nt)
51
        disc[, k] <- rowSums((ts * ts)/rep(v[, k], each = nt)) + 
52
          sum(log(v[, k]))
53
      }
54
    }
55
    else {
56
      for (k in 1:K) {
57
        disc[, k] <- apply(ts, 1, function(z) sum((z - 
58
                                                     m[, k])^2/v[, k])) + sum.na(log(v[, k]))
59
      }
60
    }
61
  }
62
  pred <- cl0 + apply(disc, 1, which.min)
63
  if (inherits(attr(ts, "na.action"), "exclude")) 
64
    pred <- napredict(omit = attr(ts, "na.action"), pred)
65
  pred
66
}
67
<environment: namespace:sfsmisc>