diff --git a/scripts/ce089-04.R b/scripts/ce089-04.R
index 80ccfcbb41e6c767e3e836e45621dad12f1e89bb..bed0879f3db6c79e9a5bbc359102d03cdc1ab88a 100644
--- a/scripts/ce089-04.R
+++ b/scripts/ce089-04.R
@@ -1,10 +1,52 @@
 #-----------------------------------------------------------------------
-# Teste de aleatórização.
+# Teste de aleatorização.
+
+# Uma senhora toma chá.
+#
+# A senhora (Muriel Bristol) declarou saber distringuir entre bedidas
+# segundo a ordem com que o chá ou leite foram colocados na xícara.  O
+# experimento consistiu em servir 8 xícaras da bebida, 4 em cada order
+# (chá/leite e leite/chá).  No final a senhora deveria indicar quais as
+# xícaras que estão em cada um dos dois grupos.  DETALHE: ela sabe
+# distinguir mas não sabe classificar.
+
+# Quantidade de maneiras de gerar dois grupos de 4 xícaras usando 8.
+n_poss <- choose(8, 4)
+n_poss
+
+# De 4 xícaras selecionadas para um grupo, X representa o número de
+# acertos.
+n_acertar <- sapply(4:0,
+                    FUN = function(i) {
+                        # (formas de acertar x em 4) * (formas de errar x em 4).
+                        choose(4, i) * choose(4, 4 - i)
+                    })
+n_acertar
+
+# Pr(Acerto total) = 1/70 < 5%.
+cumsum(n_acertar)/n_poss
+
+# Comprovando por simulação.
+v <- rep(0:1, each = 4)
+mean(replicate(n = 100000,
+               expr = all(sample(v) == v)))
+
+# Essa forma de fazer a conta é mais realista mas dá na mesma.
+mean(replicate(n = 100000,
+               expr = all(sample(v) == sample(v))))
+
+#-----------------------------------------------------------------------
+# Exemplo com teste para a diferença de médias.
 
 # Comprimentos de crânios de cães pré históricos.
 m <- c(120, 107, 110, 116, 114, 111, 113, 117, 114, 112)
 f <- c(110, 111, 107, 108, 110, 105, 107, 106, 111, 111)
 
+plot(ecdf(m), xlim = range(c(m, f)), col = "cyan")
+lines(ecdf(f), col = "magenta")
+rug(m, col = "cyan")
+rug(f, col = "magenta")
+
 # Diferença de média.
 d <- mean(m) - mean(f)
 d
@@ -12,20 +54,54 @@ d
 # Aplicando um teste t.
 t.test(x = m, y = f, var.equal = TRUE)
 
+# Todos as combinações possíveis.
+choose(n = 20, k = 10)
+
+#--------------------------------------------
+# Com todas as combinações possíveis (exaustão).
+
+# Para construir todas.
+k <- combn(x = 1:20, m = 10)
+dim(k)
+
 # Vetor com os valores dos dois grupos.
 mf <- c(m, f)
 
+g <- integer(20)
+D <- apply(k,
+           MARGIN = 2,
+           FUN = function(i) {
+               g[i] <- 1L
+               -diff(tapply(mf, g, FUN = mean))
+           })
+
+hist(D, col = "gray50")
+rug(D)
+abline(v = d, col = 2)
+
+plot(ecdf(D), cex = 0)
+rug(D)
+abline(v = d, col = 2)
+
+# P-valor do teste.
+2 * sum(D >= d)/length(D)
+
+#--------------------------------------------
+# Com simulação (não necessáriamente exaustivo).
+
 # Variáveis que indentifica os grupos.
 g <- rep(1:2, each = 10)
 
-cbind(mf, g)
+# Apenas para conferir.
+cbind(g, mf)
 
 # Replicando a diferença para grupos formados por aleatorização.
-D <- replicate(999, {
-    y <- sample(mf, size = length(mf), replace = FALSE)
-    -diff(tapply(y, g, FUN = mean))
+D <- replicate(9999, {
+    gg <- sample(g)
+    -diff(tapply(mf, gg, FUN = mean))
 })
 
+# Tem que juntar a estatística observada com as simuladas.
 D <- c(D, d)
 
 hist(D, col = "gray50")
@@ -53,38 +129,48 @@ plot(y ~ as.numeric(g))
 fobs <- anova(lm(y ~ g))[1, "F value"]
 
 fsim <- replicate(9999, {
-    y <- sample(y, size = 12, replace = FALSE)
-    anova(lm(y ~ g))[1, "F value"]
+    gg <- sample(g)
+    anova(lm(y ~ gg))[1, "F value"]
 })
 
+# Junta a estatística observada com as obtidas por simulação.
 fsim <- c(fsim, fobs)
 
 # P-valor do teste.
 sum(fsim >= fobs)/length(fsim)
 
+# (maneiras de agrupar 4 em 12) * (maneiras de agrupar 4 em 8).
 choose(12, 4) * choose(8, 4)
 
 #-----------------------------------------------------------------------
 # Teste de aleatorização para a correlação.
 
+# N = 5 para um par de medidas.
 x <- c(4, 8, 2, 10, 9)
 y <- c(3, 5, 1, 7, 8)
 
-r0 <- cor(x, y)
+cbind(x, y)
+
+# r0 <- cor(x, y)
 r0 <- cor(x, y, method = "spearman")
+r0
 
 library(gtools)
 
-# Todas as permutações possiveis = 5! = 120.
-Y <- permutations(n = length(y), r = length(y), v = y)
-str(Y)
+# Todas as permutações possiveis = 5! = 120 do vetor x.
+X <- permutations(n = length(x), r = length(x), v = x)
+str(X)
+head(X)
 
-r <- apply(Y, MARGIN = 1, FUN = cor, y = x)
+# As 120 correlações obtidas para cada arranjo.
+r <- apply(X, MARGIN = 1, FUN = cor, y = y, method = "spearman")
 
 # P-valor do teste.
 sum(r >= r0)/length(r)
 
 #-----------------------------------------------------------------------
+# Exemplo da matriz de distância geográfica e similaridade entre
+# espécies.
 
 # s <- scan()
 # dput(s)
@@ -96,6 +182,8 @@ sim <- matrix(NA,
               nrow = length(cont),
               dimnames = list(cont, cont))
 sim[lower.tri(sim)] <- s
+
+# Coeficientes de associação entre espécies de tesourinha.
 sim
 
 # j <- scan()
@@ -104,9 +192,11 @@ j <- c(1, 2, 1, 2, 3, 2, 1, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 1, 2, 3, 2,
        1, 4, 3, 5, 4, 1)
 jum <- sim
 jum[lower.tri(jum)] <- j
+
+# Número de saltos entre continentes conforme movimento das placas.
 jum
 
-# Correlação entre as distância (fere a suposição de independência).
+# Correlação entre os valores (fere a suposição de independência).
 k <- cor(s, j)
 
 # Empilha os valores de similaridade.
@@ -139,6 +229,12 @@ hist(K)
 abline(v = k, col = 2)
 
 plot(density(K))
+rug(K)
+abline(v = k, col = 2)
+
+plot(ecdf(K))
+rug(K)
+abline(v = k, col = 2)
 
 # Mantel Matrix Randomization Test.
 RSiteSearch("mantel randomization")
@@ -150,7 +246,8 @@ jumd
 
 library(ade4)
 
-mr <- mantel.randtest(jumd, simd, nrepet = 999)
+# Passar valores negativos porque a hipótese H_a é "greater".
+mr <- mantel.randtest(-jumd, simd, nrepet = 999)
 mr
 
 plot(mr)