1 |
burt |
|
k |
|
eps |
|
itmax |
|
verbose |
|
vectors |
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 75 76 77 78 79 80 | ##---- Should be DIRECTLY executable !! ----
##-- ==> Define data, use random,
##-- or do help(data=index) for the standard data sets.
## The function is currently defined as
function (burt, k, eps = 1e-06, itmax = 500, verbose = TRUE,
vectors = TRUE)
{
m <- length(k)
burt <- m * m * burt/sum(burt)
sk <- sum(k)
db <- diag(burt)
ll <- kk <- ww <- diag(sk)
itel <- 1
ossq <- 0
klw <- 1 + cumsum(c(0, k))[1:m]
kup <- cumsum(k)
ind <- lapply(1:m, function(i) klw[i]:kup[i])
sburt <- burt/sqrt(outer(db, db))
for (i in 1:m) kk[ind[[i]], ind[[i]]] <- t(svd(sburt[ind[[i]],
])$u)
kbk <- kk %*% sburt %*% t(kk)
for (i in 1:m) for (j in 1:m) ww[ind[[i]], ind[[j]]] <- ifelse(outer(1:k[i],
1:k[j], "=="), 1, 0)
repeat {
for (l in 1:m) {
if (k[l] == 2)
next()
li <- ind[[l]]
for (i in (klw[l] + 1):(kup[l] - 1)) for (j in (i +
1):kup[l]) {
bi <- kbk[i, -li]
bj <- kbk[j, -li]
wi <- ww[i, -li]
wj <- ww[j, -li]
acc <- sum(wi * bi^2) + sum(wj * bj^2)
acs <- sum((wi - wj) * bi * bj)
ass <- sum(wi * bj^2) + sum(wj * bi^2)
u <- eigen(matrix(c(acc, acs, acs, ass), 2, 2))$vectors[,
1]
c <- u[1]
s <- u[2]
kbk[-li, i] <- kbk[i, -li] <- c * bi + s * bj
kbk[-li, j] <- kbk[j, -li] <- c * bj - s * bi
if (vectors) {
ki <- kk[i, li]
kj <- kk[j, li]
kk[i, li] <- c * ki + s * kj
kk[j, li] <- c * kj - s * ki
}
}
}
nssq <- sum(ww * kbk^2) - sum(diag(kbk)^2)
if (verbose)
cat("Iteration ", formatC(itel, digits = 4), "ssq ",
formatC(nssq, digits = 10, width = 15), "\n")
if (((nssq - ossq) < eps) || (itel == itmax))
break()
itel <- itel + 1
ossq <- nssq
}
kl <- unlist(sapply(k, function(i) 1:i))
pp <- ifelse(outer(1:sk, order(kl), "=="), 1, 0)
pkbkp <- t(pp) %*% kbk %*% pp
pk <- t(pp) %*% kk
km <- as.vector(table(kl))
nm <- length(km)
klw <- 1 + cumsum(c(0, km))[1:nm]
kup <- cumsum(km)
for (i in 1:length(km)) {
if (km[i] == 1)
next()
ind <- klw[i]:kup[i]
ll[ind, ind] <- eigen(pkbkp[ind, ind])$vectors
}
lpkbkpl <- t(ll) %*% pkbkp %*% ll
lpk <- t(ll) %*% pk
return(list(kbk = kbk, pkbkp = pkbkp, lpkbkpl = lpkbkpl,
kk = t(kk), pp = pp, ll = ll, kpl = t(lpk)))
}
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.