diff --git a/scripts/metodos-intensivos.Rmd b/scripts/metodos-intensivos.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..3b29cd036655b7cbc75a8354d9559976884ca581 --- /dev/null +++ b/scripts/metodos-intensivos.Rmd @@ -0,0 +1,853 @@ +--- +title: "Métodos computacionalmente intensivos para inferência" +author: "[Walmes Marques Zeviani](http://lattes.cnpq.br/4410617539281650)" +date: '`r Sys.Date()`' +output: + html_document: + theme: yeti +--- + +```{r, include = FALSE} +opts_chunk$set(cache = TRUE, + tidy = FALSE, + fig.width = 7, + fig.height = 6, + fig.align = "center", + eval.after= "fig.cap", + warning = FALSE, + error = FALSE, + message = FALSE) +``` + +# Testes de aleatorização + +## Uma senhora toma chá + +```{r} +#----------------------------------------------------------------------- +# Uma senhora toma chá. + +# 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)))) +``` + +## Teste para a diferença de médias + +```{r} +#----------------------------------------------------------------------- +# 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 observada. +d <- mean(m) - mean(f) +d + +# Todos as combinações possíveis. +choose(n = 20, k = 10) + +#-------------------------------------------- +# Com todas as combinações possíveis (exaustão). + +# Para construir todas as combinações possíveis. +k <- combn(x = 1:20, m = 10) +dim(k) + +# Vetor com os valores dos dois grupos concatenados. +mf <- c(m, f) + +# Vetor cheio de zeros. +g <- integer(20) + +# Calcula a diferença para todo arranjo possível. +D <- apply(k, + MARGIN = 2, + FUN = function(i) { + # Alguns elementos do vetor convertidos para 1. + g[i] <- 1L + # Cálculo da estatística de teste. + -diff(tapply(mf, g, FUN = mean)) + }) + +# Histograma da distribuição da estatística sib H_0. +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) + +# Apenas para conferir. +cbind(g, mf) + +# Replicando a diferença para grupos formados por aleatorização. +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") +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) +``` + +## Teste para a correlação + +```{r} +#----------------------------------------------------------------------- +# Teste de aleatorização para a correlação. + +# N = 5 para um par de medidas. +x <- c(4.1, 8.3, 2.9, 10.8, 9.5) +y <- c(3.7, 5.1, 1.0, 7.7, 8.9) + +cbind(x, y) + +plot(x, y) + +# Estatística de teste na amostra original. +r0 <- cor(x, y, method = "pearson") +r0 + +# Todas as permutações possiveis: 5! = 120 do vetor x. +X <- gtools::permutations(n = length(x), r = length(x), v = x) +str(X) +head(X) + +# As 120 correlações obtidas para cada arranjo. +r <- apply(X, MARGIN = 1, FUN = cor, y = y, method = "spearman") + +# P-valor do teste. +2 * sum(r >= r0)/length(r) +``` + +## Índice de Moran + + * <http://gis.stackexchange.com/questions/161887/significance-test-for-morans-i-using-monte-carlo-simulation>. + * <https://en.wikipedia.org/wiki/Moran's_I>. + * <http://rstudio-pubs-static.s3.amazonaws.com/268058_dd37b98f25a4496b9f0a7eb2fcf892cd.html>. + * <http://rspatial.org/analysis/rst/3-spauto.html>. + +```{r} +#----------------------------------------------------------------------- +# Índice de Moran para medir dependência espacial. + +# Coordenadas dos eventos em uma malha regular. +x <- 1:8 +y <- 1:8 + +# Para criar a matriz de pesos. +ind <- expand.grid(i = 1:length(x), j = 1:length(y)) +f <- function(i, j) { + u <- min(3, sum(abs(ind[i, ] - ind[j, ]))) + c(0, 1, sqrt(1/2), 0)[u + 1] +} +w <- matrix(0, nrow(ind), nrow(ind)) +for (i in 1:nrow(ind)) { + for (j in 1:nrow(ind)) { + w[i, j] <- f(i, j) + } +} +w <- w/sum(w) + +image(w) + +# Índice de Moran. +moran <- function(x, weights) { + # Tamanho da amostra. + n <- length(x) + # Valores normalizados. + z <- as.vector((x - mean(x))/sd(x)) + # Índice de Moran. + as.vector(z %*% weights %*% (z * sqrt(n/(n - 1)))) +} + +# Teste de permutação com gráfico. +ppt <- function(z, w, N = 10000, stat, ...) { + # Índice de Moran por reamostragem. + sim <- replicate(N, + moran(sample(z), w)) + # Determina o p-valor. + p.value <- mean((all <- c(stat, sim)) >= stat) + # Histograma da distribuição empírica sob H_0. + hist(sim, + sub = paste("p =", round(p.value, 4)), + xlim = range(all), + ...) + abline(v = stat, col = "#903030", lty = 3, lwd = 2) + return(p.value) +} + +# Observações simuladas. +set.seed(17) +par(mfrow = c(2, 3)) + +# Dados com dependência espacial --------------------------------------- +# Indução de autocorrelação por meio de uma tendência. +z <- matrix(rexp(length(x) * length(y), + outer(x, y^2)), + length(x)) +image(log(z), main = "Com dependência") + +# Índice de Moran com dados originais. +stat <- moran(z, w) +stat + +hist(z) +ppt(z, w, stat = stat, main = "I de Moran", xlab = "I") + +# Dados sem dependência espacial --------------------------------------- +# Geração de de um conjunto de dados sob hipótese nula. +z <- matrix(rnorm(length(x) * length(y), 0, 1/2), length(x)) +image(z, main = "Sem dependência") + +# Índice de Moran com dados originais. +stat <- moran(z, w) +stat + +hist(z) +ppt(z, w, stat = stat, main = "I de Moran", xlab = "I") +``` + +# Jackknife + +## Regressão não linear + +```{r} +#----------------------------------------------------------------------- +# Aplicação de Jackknife em modelos de regressão não linear. + +library(latticeExtra) +library(car) +library(alr3) + +# Curva "palpite". +start <- list(th0 = 75, th1 = 0.5, th2 = 50) +xyplot(C ~ Temp, data = segreg) + + layer(panel.curve(th0 + th1 * (x - th2) * (x >= th2) + + 0 * (x < th2), lty = 2), + data = start) + +# Ajuste. +n0 <- nls(C ~ th0 + th1 * (Temp - th2) * (Temp >= th2) + + 0 * (Temp < th2), + data = segreg, + start = start) + +# Estimativas e medidas de ajuste. +summary(n0) + +# Observados e preditos. +xyplot(C ~ Temp, data = segreg) + + layer(panel.curve(th0 + th1 * (x - th2) * (x >= th2) + + 0 * (x < th2)), + data = as.list(coef(n0))) + +#----------------------------------------------------------------------- +# Estimativas Jackknife para os parâmetros. + + +theta <- coef(n0) # Estimativas com todos os dados. +n <- nrow(segreg) # Número de observações. + +# Matriz vazia para armazenar os pseudo-valores. +thetaj <- matrix(0, nrow = n, ncol = length(theta)) +colnames(thetaj) <- names(theta) + +# Ajustes deixando uma observação de fora (leave-one-out). +for (i in 1:n) { + # Reajusta o modelo, i.e. estima com leave-one-out. + n1 <- nls(C ~ th0 + th1 * (Temp - th2) * (Temp >= th2) + + 0 * (Temp < th2), + data = segreg[-i, ], + start = coef(n0)) + # Calcula os pseudo valores. + thetaj[i, ] <- n * theta - (n - 1) * coef(n1) +} + +# Os primeiros pseudo valores. +head(thetaj) + +# Estimativas pontuais. +jk <- colMeans(thetaj) +cbind(MLE = theta, Jack = jk, Vício = theta - jk) + +# Erros padrões. +cbind(MLE = summary(n0)$coefficients[, "Std. Error"], + Jack = apply(thetaj, MARGIN = 2, sd)/sqrt(n)) + +# Pacote com função pronta para Jackknife para modelos não lineares. +library(nlstools) +# ls("package:nlstools") + +# Aplica Jackknife sobre o modelo. +j0 <- nlsJack(n0) +summary(j0) +``` + +## Dose letal para 50% da população + +```{r} +#----------------------------------------------------------------------- +# Inferência para a DL 50. + +# library(labestData) +# data(PaulaTb3.12) +# str(PaulaTb3.12) +# help(PaulaTb3.12, h = "html") +# # Converte a resposta para binário. +# PaulaTb3.12$resp <- as.integer(PaulaTb3.12$resp) - 1 +# dput(PaulaTb3.12) + +PaulaTb3.12 <- +structure(list(vol = c(3.7, 3.5, 1.25, 0.75, 0.8, 0.7, 0.6, 1.1, +0.9, 0.9, 0.8, 0.55, 0.6, 1.4, 0.75, 2.3, 3.2, 0.85, 1.7, 1.8, +0.4, 0.95, 1.35, 1.5, 1.6, 0.6, 1.8, 0.95, 1.9, 1.6, 2.7, 2.35, +1.1, 1.1, 1.2, 0.8, 0.95, 0.75, 1.3), razao = c(0.825, 1.09, +2.5, 1.5, 3.2, 3.5, 0.75, 1.7, 0.75, 0.45, 0.57, 2.75, 3, 2.33, +3.75, 1.64, 1.6, 1.415, 1.06, 1.8, 2, 1.36, 1.35, 1.36, 1.78, +1.5, 1.5, 1.9, 0.95, 0.4, 0.75, 0.03, 1.83, 2.2, 2, 3.33, 1.9, +1.9, 1.625), resp = c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, +1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, +1, 1, 0, 0, 1)), .Names = c("vol", "razao", "resp"), row.names = c(NA, +39L), class = "data.frame") + +layout(1) +plot(resp ~ vol, data = PaulaTb3.12) + +m0 <- glm(resp ~ vol, + data = PaulaTb3.12, + family = binomial) +summary(m0) + +# DL_50. +dl <- -coef(m0)[1]/coef(m0)[2] + +# str(m0$family)$link + +plot(resp ~ vol, data = PaulaTb3.12) +curve(m0$family$linkinv(coef(m0)[1] + coef(m0)[2] * x), + add = TRUE) +abline(v = dl, h = 0.5, lty = 2) + +n <- nrow(PaulaTb3.12) +i <- 1:n + +# Estimativas por Jackknife. +DL <- sapply(i, + FUN = function(i) { + m0 <- glm(resp ~ vol, + data = PaulaTb3.12[-i, ], + family = binomial) + # Estimativa Parcial. + DL <- -coef(m0)[1]/coef(m0)[2] + # Pseudo-valor. + n * dl - (n - 1) * DL + }) + +m <- mean(DL) +e <- sd(DL)/sqrt(n) + +cbind(Est = rbind(MLE = dl, + Jack = m), + StdErr = rbind(MLE = car::deltaMethod(m0, g = "-(Intercept)/vol")["SE"], + Jack = e)) + +plot(ecdf(DL)) +rug(DL) + +plot(density(DL)) +rug(DL) + +# NOTE: alguma pista sobre porque a distribuição fica bimodal? +``` + +## Uma situação problemática + +```{r} +#----------------------------------------------------------------------- +# Aplicação na Mediana (derivada não suave) -> problema. + +# Ordena o vetor de valores. +x <- sort(precip) + +# Calcula a mediana com os dados originais. +M <- median(x) +M + +n <- length(x) +i <- 1:length(x) + +# Estimativas da mediana por Jackknife. +y <- sapply(i, + FUN = function(i) { + ep <- median(x[-i]) + pv <- n * M - (n - 1) * ep + return(pv) + }) + +stem(y) + +# NOTE: Explique porque o Jackknife para a mediana só retornou 2 +# valores? Considere que o tamanho da amostra é dado abaixo. +length(x) +``` + +# Bootstrap + +## Regressão não linear + +```{r} +#----------------------------------------------------------------------- +# Aplicação de bootstrap. Estudo de caso com modelos não lineares. + +library(alr3) +str(turk0) + +# Gráfico dos valores observados. +plot(Gain ~ A, data = turk0) + +# Lista com os valores iniciais. +start <- list(Int = 625, Ass = 180, Mei = 0.1) + +# Adiciona as curvas. +with(start, { + curve(Int + Ass * A/(Mei + A), + xname = "A", add = TRUE, col = 2) + curve(Int + Ass * (1 - 2^(-A/Mei)), + xname = "A", add = TRUE, col = 4)}) + +# Ajuste do primeiro modelo. +n0 <- nls(Gain ~ Int + Ass * A/(Mei + A), + data = turk0, + start = start) + +# Ajuste do segundo modelo. +n1 <- nls(Gain ~ Int + Ass * (1 - 2^(-A/Mei)), + data = turk0, + start = start) + +cbind(coef(n0), coef(n1)) + +#----------------------------------------------------------------------- +# Criando funções que fazem reamostragem dos dados e ajustam o modelo. + +n <- nrow(turk0) +i <- 1:n + +myboot0 <- function(formula, start) { + n0 <- nls(formula = formula, + data = turk0[sample(i, n, replace = TRUE), ], + start = start) + coef(n0) +} + +#----------------------------------------------------------------------- +# Replicando. + +# B = 999 reamostragens. +b0 <- replicate(999, + myboot0(Gain ~ Int + Ass * A/(Mei + A), start)) +b1 <- replicate(999, + myboot0(Gain ~ Int + Ass * (1 - 2^(-A/Mei)), start)) + +# Conjunto de 1000 estimativas bootstrap. +b0 <- cbind(b0, coef(n0)) +b1 <- cbind(b1, coef(n1)) +str(b0) + +# Calcula o vício absoluto (bootstrap - original). +rbind(n0 = rowMeans(b0) - coef(n0), + n1 = rowMeans(b1) - coef(n1)) + +# Variância do estimador. +rbind(n0 = apply(b0, MARGIN = 1, var), + n1 = apply(b1, MARGIN = 1, var)) + +# Função para calcular o erro quadrático médio. +eqm <- function(x) { + sum((x - tail(x, 1))^2)/length(x) +} + +# Erro quadrático médio. +rbind(n0 = apply(b0, 1, FUN = eqm), + n1 = apply(b1, 1, FUN = eqm)) +``` + +## Inferência para valores preditos + +```{r} +#----------------------------------------------------------------------- +# Curvas ajustadas de onde é possível determinar uma banda de confiança. + +bts <- cbind(rep(1:2, each = ncol(b0)), + as.data.frame(rbind(t(b0), t(b1)))) +splom(bts[, -1], groups = bts[, 1]) + +par(mfrow = c(1, 2)) +plot(Gain ~ A, data = turk0, type = "n") +apply(b0, + MARGIN = 2, + FUN = function(b) { + curve(b[1] + b[2] * x/(b[3] + x), + add = TRUE, col = rgb(0, 1, 1, 0.25), n = 51) + invisible() + }) +points(Gain ~ A, data = turk0) +abline(v = 0.2, lty = 2) +plot(Gain ~ A, data = turk0, type = "n") +apply(b1, + MARGIN = 2, + FUN = function(b) { + curve(b[1] + b[2] * (1 - 2^(-x/b[3])), + add = TRUE, col = rgb(1, 1, 0, 0.25), n = 51) + invisible() + }) +points(Gain ~ A, data = turk0) +abline(v = 0.2, lty = 2) + +#----------------------------------------------------------------------- +# Estimativa do valor da função em x = 0.2. + +p0 <- apply(b0, MARGIN = 2, + FUN = function(b){ + b[1] + b[2] * 0.2/(b[3] + 0.2) + }) +p1 <- apply(b1, MARGIN = 2, + FUN = function(b){ + b[1] + b[2] * (1 - 2^(-0.2/b[3])) + }) + +cbind(Est = rbind(mean(p0), mean(p1)), + StdErr = rbind(sd(p0), sd(p1))) +``` + +## Usando o pacote `boot` + +```{r} +#----------------------------------------------------------------------- +# Usando o pacote boot. + +library(boot) +library(latticeExtra) + +# dput(as.list(coef(n1))) +start <- list(Int = 622.958054146589, + Ass = 178.251908347242, + Mei = 0.097321927254495) + +# Criar uma função com dois argumentos: o data.frame original e um vetor +# que vai representar o índice das linhas usado para reamostrar dos +# dados. +fitmodel <- function(dataset, index) { + n0 <- nls(Gain ~ Int + Ass * (1 - 2^(-A/Mei)), + data = dataset[index, ], + start = start) + c(coef(n0), s2 = deviance(n0)/df.residual(n0)) +} + +set.seed(321) +b0 <- boot(data = turk0, + statistic = fitmodel, + R = 1999) + +class(b0) +methods(class = class(b0)) + +summary(b0) + +# Como são obtidos. +theta <- b0$t + +# Estimativas como conjunto de dados original. +b0$t0 + +# Vício. +apply(theta, MARGIN = 2, FUN = mean) - b0$t0 + +# Desvio-padrão boostrap. +apply(theta, MARGIN = 2, FUN = sd) + +# Mediana bootstrap. +apply(theta, MARGIN = 2, FUN = median) + +st <- summary(b0) +str(st) + +# Gráfico de pares. +pairs(b0) + +vcov(b0) +cov2cor(vcov(b0)) + +# Extrair os vetores de estativativas bootstrap. +str(b0) +colnames(b0$t) <- names(b0$t0) +best <- stack(as.data.frame(b0$t)) +names(best) + +st + +densityplot(~values | ind, + data = best, + scales = "free", + as.table = TRUE) + + layer(panel.abline(v = st$original[which.packet()] + + c(0, st$bootBias[which.packet()]), + col = c(1, 2), + lty = 2)) + +# Intervalos de confiança. +confint(b0, type = "norm") +confint(b0, type = "basic") +confint(b0, type = "perc") +confint(b0, type = "bca") +``` + +# Monte Carlo + +## Processo pontual + +```{r} +#----------------------------------------------------------------------- +# Teste para independência de processo pontual. + +plot(NULL, NULL, xlim = c(0, 1), ylim = c(0, 1), asp = 1) +lines(x = c(0, 1, 1, 0, 0), y = c(0, 0, 1, 1, 0)) +# xy <- locator(n = 20, type = "p", pch = 19) +# dput(lapply(xy, round, digits = 3)) + +xy <- structure(list(x = c(0.204, 0.186, 0.529, 0.529, 0.385, 0.579, + 0.918, 0.798, 0.634, 0.761, 0.704, 0.485, + 0.291, 0.341, 0.402, 0.833, 0.972, 0.625, + 0.732, 0.315), + y = c(0.829, 0.545, 0.526, 0.752, 0.674, 0.648, + 0.792, 0.33, 0.121, 0.127, 0.332, 0.352, + 0.188, 0.452, 0.221, 0.524, 0.957, 0.964, + 0.755, 0.332)), + .Names = c("x", "y")) + +#----------------------------------------------------------------------- + +# Transforma a lista em matriz. +xy <- do.call(cbind, xy) + +plot(xy, + NULL, + xlim = c(0, 1), + ylim = c(0, 1), + asp = 1, + axes = FALSE, + ann = FALSE) +lines(x = c(0, 1, 1, 0, 0), + y = c(0, 0, 1, 1, 0), + lty = 2) + +# Calcula todas as distâncias (euclidianas). +d <- dist(xy) +d + +# Obtém a menor distância. +m <- min(d) + +# Número de pontos. +n <- nrow(xy) + +# Geração de estatísticas por simulação do modelo assumido sob +# hipótese nula: localização uniforme no quadrado. +M <- replicate(9999, { + # As localizações de n pontos. + loc <- cbind(x = runif(n), + y = runif(n)) + # A menor distância entre eles sob H_0. + min(dist(loc)) +}) + +# Concatena as estatísticas simuladas com a observada. +M <- c(m, M) + +# Gráfico da distribuição acumulada empírica sob H_0. +plot(ecdf(M)) +abline(h = c(0.025, 0.975), lty = 2, col = 2) +abline(v = m, col = 2) + +# Gráfico da distribuição acumulada empírica sob H_0. +plot(density(M)) +abline(v = m, col = 2) +abline(v = quantile(M, c(0.025, 0.975)), lty = 2, col = 2) +rug(M) + +# P-valor. +2 * sum(M > m)/length(M) + +#----------------------------------------------------------------------- +# Moficando a estatística de teste. + +xy <- structure(list(x = c(0.088, 0.326, 0.577, 0.846, 0.857, 0.568, + 0.306, 0.077, 0.077, 0.328, 0.597, 0.883, + 0.863, 0.64, 0.337, 0.088, 0.077, 0.346, + 0.654, 0.619), + y = c(0.92, 0.922, 0.916, 0.935, 0.737, 0.674, + 0.67, 0.665, 0.452, 0.502, 0.461, 0.454, + 0.256, 0.26, 0.26, 0.219, 0.045, 0.06, 0.058, + 0.439)), + .Names = c("x", "y")) + +# Transforma a lista em matriz. +xy <- do.call(cbind, xy) + +plot(xy, + NULL, + xlim = c(0, 1), + ylim = c(0, 1), + asp = 1, + axes = FALSE, + ann = FALSE) +lines(x = c(0, 1, 1, 0, 0), + y = c(0, 0, 1, 1, 0), + lty = 2) + +# Todas as distância entre os pontos (a estatística de teste é um vetor +# e não um escalar). +d <- c(dist(xy)) +d + +# Gerando estatísticas de teste por simulação. +D <- replicate(499, { + dist(cbind(x = runif(n), y = runif(n))) +}) + +# Juntanto observado com simulado. +D <- cbind(d, D) +str(D) + +plot(ecdf(D[, 1]), cex = 0) +for (i in 2:ncol(D)) { + lines(ecdf(D[, i]), cex = 0, col = "gray50") +} +lines(ecdf(D[, 1]), cex = 0, col = 2, lwd = 2) +``` + +## Amostragem por conjuntos ordenados + +```{r} +#----------------------------------------------------------------------- +# Amostragem por Conjuntos Ordenados. + +# Extraí valores de uma população normal padrão. +rand <- function(n) { + rnorm(n, 0, 1) +} +rand(10) + +# Ranked Set Sampling (Perfect Ranking). Calcula a média. +rss <- function(m = 3) { + x <- matrix(rand(m * m), nrow = m) + x <- apply(x, MARGIN = 1, sort) + mean(diag(x)) +} +rss(m = 5) + +# Simple Random Sampling. Calcula a média. +srs <- function(m = 3) { + mean(rand(m)) +} +rss(m = 5) + +# Ranked Set Sampling with Unperfect Ranking. Calcula a média. +rssur <- function(m = 3, rho) { + x <- MASS::mvrnorm(m * m, + mu = c(0, 0), + Sigma = matrix(c(1, rho, rho, 1), nrow = 2)) + g <- gl(m, m) + b <- by(data = x, + INDICES = g, + FUN = function(y) { + o <- order(y[, 2]) + # cbind(y[o, 1], y[o, 2]) + y[o, 1] + }, simplify = TRUE) + mean(diag(do.call(rbind, b))) +} +rssur(m = 5, rho = 0.95) + +#----------------------------------------------------------------------- +# Simulação. + +# Tamanho da amostra final. +m <- 10 + +# Distribuição da média na amostra aleatória simples. +system.time(m1 <- replicate(1000, srs(m = m))) + +# Distribuição da média na amostra por conjuntos ordenados perfeito. +system.time(m2 <- replicate(1000, rss(m = m))) + +# Distribuição da média na amostra por conjuntos ordenados imperfeito. +system.time(m3 <- replicate(1000, rssur(m = m, rho = 0.75))) + +library(lattice) +library(latticeExtra) + +densityplot(~m1 + m2 + m3, + auto.key = TRUE, + layout = c(NA, 1)) + + layer(panel.abline(v = 0, lty = 2)) + +ecdfplot(~m1 + m2 + m3, + auto.key = TRUE, + layout = c(NA, 1)) + +qqmath(~m1 + m2 + m3, + auto.key = TRUE, + layout = c(NA, 1)) +```