From f474555b3ab957f0c3773e0a737fb362bfffbf9d Mon Sep 17 00:00:00 2001
From: Walmes Zeviani <walmes@ufpr.br>
Date: Mon, 21 Nov 2016 16:31:02 -0200
Subject: [PATCH] Adiciona scripts de Monte Carlo.

---
 scripts/ce089-07.R | 172 +++++++++++++++++++++++++++++++++++++++++++++
 scripts/ce089-08.R | 164 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 336 insertions(+)
 create mode 100644 scripts/ce089-07.R
 create mode 100644 scripts/ce089-08.R

diff --git a/scripts/ce089-07.R b/scripts/ce089-07.R
new file mode 100644
index 0000000..d91dbf4
--- /dev/null
+++ b/scripts/ce089-07.R
@@ -0,0 +1,172 @@
+#-----------------------------------------------------------------------
+# Distribuição do p-valor em um teste cuja estatística de teste tem
+# distribuição exata.
+
+simul <- function() {
+    x <- rnorm(20)
+    y <- rnorm(20)
+    t.test(x, y, var.equal = TRUE)$p.value
+    # wilcox.test(x, y)$p.value
+}
+simul()
+
+# P-valores do teste sob H0.
+p <- replicate(1000, simul())
+
+# Distribuição do teste é uniforme quando é exato.
+plot(ecdf(p))
+abline(a = 0, b = 1, col = 2)
+
+#-----------------------------------------------------------------------
+# O teste F tem distribuição exata?
+
+g <- gl(5, 4)
+
+simul <- function() {
+    y <- rnorm(g)
+    # plot(y ~ as.integer(g))
+    m0 <- lm(y ~ g)
+    anova(m0)[1, 5]
+}
+
+# P-valores do teste sob H0.
+p <- replicate(1000, simul())
+
+# Distribuição do teste é uniforme quando é exato.
+plot(ecdf(p))
+abline(a = 0, b = 1, col = 2)
+
+#-----------------------------------------------------------------------
+# O teste da deviance tem distribuição exata chi-quadrado?
+
+g <- gl(2, 5)
+
+simul <- function() {
+    y <- rpois(g, lambda = 5)
+    m0 <- glm(y ~ g, family = poisson)
+    anova(m0, test = "Chi")[2, 5]
+}
+
+# P-valores do teste sob H0.
+p <- replicate(1000, simul())
+
+# Distribuição do teste é uniforme quando é exato.
+plot(ecdf(p))
+abline(a = 0, b = 1, col = 2)
+
+#-----------------------------------------------------------------------
+# Cobertura de intervalos de confiança.
+
+# Gerando dados de um modelo de regressão linear simples.
+x <- 0:10
+X <- cbind(1, x)
+beta <- c(3, 0.5)
+y <- X %*% beta + rnorm(x, 0, 0.3)
+
+plot(y ~ x)
+
+m0 <- lm(y ~ x)
+confint(m0)
+
+simul <- function() {
+    y <- X %*% beta + rnorm(x, 0, 0.3)
+    m0 <- lm(y ~ x)
+    confint(m0)
+}
+
+ic <- replicate(100, simul())
+str(ic)
+
+# Com i = 1 é o intercepto e i = 2 é a taxa.
+i <- 1
+plot(NULL, NULL, xlim = c(0, dim(ic)[3]), ylim = range(ic[i, , ]))
+segments(1:ncol(ic[i, , ]),
+         ic[i, 1, ],
+         1:ncol(ic[i, , ]),
+         ic[i, 2, ])
+abline(h = beta[i])
+
+# Aumentando o número de simulações
+ic <- replicate(1000, simul())
+str(ic)
+
+# Conta quantos IC contem o valor paramétrico.
+sum(ic[1, 1, ] < 3 & ic[1, 2, ] > 3)
+sum(ic[2, 1, ] < 0.5 & ic[2, 2, ] > 0.5)
+
+#-----------------------------------------------------------------------
+# Taxa de cobertura em modelo não linear.
+
+A <- 10
+V <- 2
+x <- 0:10
+y <- A * x/(V + x) + rnorm(x, 0, 0.3)
+
+plot(y ~ x)
+curve(A * x/(V + x), add = TRUE)
+
+n0 <- nls(y ~ A * x/(V + x), start = list(A = 10, V = 2))
+
+# Intervalo de Wald.
+confint.default(n0)
+
+# Limite superior. Note que IC de Wald é est + z * stderror.
+summary(n0)$coefficients[, 1] +
+              qnorm(0.975) * summary(n0)$coefficients[, 2]
+
+# Intervalo de perfil de verossimilhança.
+confint(n0)
+
+par(mfrow = c(1, 2))
+plot(profile(n0))
+layout(1)
+
+# x <- 0:10
+# X <- cbind(1, x)
+# beta <- c(3, 0.5)
+# y <- X %*% beta + rnorm(x, 0, 0.3)
+#
+# n0 <- nls(y ~ b0 + b1 * x, start = list(b0 = 3, b1 = 0.5))
+# confint.default(n0)
+# confint(n0)
+#
+# summary(n0)$coefficients[, 1] +
+#               qnorm(0.975) * summary(n0)$coefficients[, 2]
+#
+# par(mfrow = c(1, 2))
+# plot(profile(n0))
+# layout(1)
+
+simul <- function() {
+    y <- A * x/(V + x) + rnorm(x, 0, 0.3)
+    n0 <- nls(y ~ A * x/(V + x),
+              start = list(A = 10, V = 2))
+    confint.default(n0)
+    # confint(n0)
+}
+
+ic <- replicate(100, simul())
+str(ic)
+
+# Com i = 1 é o intercepto e i = 2 é a taxa.
+i <- 1
+plot(NULL, NULL, xlim = c(0, dim(ic)[3]), ylim = range(ic[i, , ]))
+segments(1:ncol(ic[i, , ]),
+         ic[i, 1, ],
+         1:ncol(ic[i, , ]),
+         ic[i, 2, ])
+abline(h = c(A, V)[i])
+
+# Aumentando para ter uma estimativa mais precisa.
+n <- 1000
+ic <- replicate(n, simul())
+str(ic)
+
+# Taxas de cobertura.
+sum(ic[1, 1, ] < A & ic[1, 2, ] > A)/n
+sum(ic[2, 1, ] < V & ic[2, 2, ] > V)/n
+
+# TODO: substitua o IC de Wald pelo IC de perfil de verossimilhança e
+# repita tudo. Tire suas próprias conclusões.
+
+#-----------------------------------------------------------------------
diff --git a/scripts/ce089-08.R b/scripts/ce089-08.R
new file mode 100644
index 0000000..06c076d
--- /dev/null
+++ b/scripts/ce089-08.R
@@ -0,0 +1,164 @@
+#-----------------------------------------------------------------------
+# 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)
+lines(x = c(0, 1, 1, 0, 0), y = c(0, 0, 1, 1, 0))
+
+# 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.
+M <- replicate(9999, {
+    min(dist(cbind(x = runif(n), y = runif(n))))
+})
+
+# Concatena as estatísticas simuladas com a observada.
+M <- c(m, M)
+
+# Gráfico da distribuição acumulada empírica.
+plot(ecdf(M))
+abline(h = c(0.025, 0.975), lty = 2)
+abline(v = m, col = 2)
+
+# 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)
+lines(x = c(0, 1, 1, 0, 0), y = c(0, 0, 1, 1, 0))
+
+# 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(9999, {
+    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)
+}
+lines(ecdf(D[, 1]), cex = 0, col = 2, lwd = 2)
+
+#-----------------------------------------------------------------------
+# 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.
+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))
+
+#-----------------------------------------------------------------------
-- 
GitLab