Next: Dropping all names in a printed array, Previous: More advanced examples, Up: More advanced examples
下面是一個有點枯燥但較為完整的例子。它是用來 計算一個區組設計中的效率因數(這個問題的 一些方面在 Index arrays已經討論過了)。
區組設計(block design)需要考慮兩個因數 blocks (b
個水準) 和 varieties (v 個水準)。如果R 和
K 分別是 v × v 和 b × b
重複(replications)及 區組大小(block size)矩陣而
N 則是 b × v 的關聯矩陣,那麼
那麼效率因數就是這個矩陣的特徵值。
E = I_v - R^{-1/2}N'K^{-1}NR^{-1/2} = I_v - A'A, where
A = K^{-1/2}NR^{-1/2}.
寫這個函數的一種方式就是
> bdeff <- function(blocks, varieties) {
blocks <- as.factor(blocks) # minor safety move
b <- length(levels(blocks))
varieties <- as.factor(varieties) # minor safety move
v <- length(levels(varieties))
K <- as.vector(table(blocks)) # 去掉 dim 屬性
R <- as.vector(table(varieties)) # 去掉 dim 屬性
N <- table(blocks, varieties)
A <- 1/sqrt(K) * N * rep(1/sqrt(R), rep(b, v))
sv <- svd(A)
list(eff=1 - sv$d^2, blockcv=sv$u, varietycv=sv$v)
}
這種情況下,奇異值分解 比求解特徵值效率高。
函數的結果是一個列表。它不僅以第一個分量的形式給出了 效率因數,還給出了區組和規範對照資訊, 因為有些時候這些會給出額外有用的 定量資訊。