A simulação de Monte Carlo é utilizada para estimar esperanças matemáticas e calcular integrais numéricas. No entanto, a precisão do método pode ser limitada pela variância das amostras geradas. As técnicas de redução de variância visam minimizar essa variabilidade sem aumentar significativamente o número de amostras.
12.1 Técnica 1: Variáveis Antitéticas
12.1.1 Motivação
Queremos estimar uma integral \(\theta = E[X]\). O estimador de Monte Carlo usual é: \[
\hat{\theta} = \frac{1}{n} \sum_{i=1}^{n} X_i
\] onde \(X_1, ..., X_n\) são variáveis aleatórias iid com média \(\theta\). A variância desse estimador é dada por \[
\text{Var}(\hat{\theta}) = \frac{\text{Var}(X)}{n}
\]
Se conseguirmos construir um conjunto de amostras correlacionadas negativamente com a amostra de \(X\)’s, podemos reduzir essa variância.
12.1.2 Descrição
A ideia principal das variáveis antitéticas é gerar pares de amostras \(X_i\) e \(Y_i\) que sejam correlacionadas negativamente. Se tivermos uma segunda amostra \(Y_1, ..., Y_n\), não necessariamente independente de \(X\), com \[
E[Y] = E[X] = \theta
\] e \[
V[Y] = V[X] = \sigma^2,
\] então podemos definir um novo estimador: \[
\hat{\theta}_A = \frac{1}{2n} \sum_{i=1}^{n} (X_i + Y_i)
\] cuja esperança é \[
\text{E}(\hat{\theta}_A)=\theta \] e variância é \[
\text{Var}(\hat{\theta}_A) = \frac{1}{4n^2} \sum_{i=1}^{n} \left( \text{Var}(X) + \text{Var}(Y) + 2\text{Cov}(X,Y) \right)
\] ou, simplificando, \[
\text{Var}(\hat{\theta}_A) = \frac{\text{Var}(X)}{n} \left( \frac{1 + \rho}{2} \right)
\] onde \(\rho = \text{Corr}(X, Y)\). Se \(\rho < 0\), então \(\text{Var}(\hat{\theta}_A) < \text{Var}(\hat{\theta})\), tornando o estimador mais eficiente.
12.1.3 Algoritmo
Uma maneira de gerar variáveis negativamente correlacionadas é a partir de distribuições uniformes. Para isso, vamos assumir que \(X \sim h(U)\), para algum \(h\) conhecido, em que \(U \sim U(0,1)\). Sabemos, pelo método da transformação inversa, que sempre é possível encontrar \(h\) com essa propriedade.
A ideia chave é então usar que \(1-U\) também tem distribuição \(U(0,1)\). Assim \(h(1-U)\) tem a mesma distribuição de \(X\) e, em particular, a mesma média \(\theta\). Além disso, pode-se mostrar que se \(h\) é monótono, \(h(U)\) tem correlação negativa com \(h(1-U)\).
O método das variáveis antitéticas pode ser implementado da seguinte forma:
Ao estimar o valor esperado de uma variável aleatória \(X\), muitas vezes queremos melhorar a precisão da estimativa reduzindo a variância associada. Para isso, podemos introduzir uma variável auxiliar \(Y\), conhecida como variável de controle, que possui um valor esperado conhecido, \(\mathbb{E}[Y] = \mu\), e uma relação com \(X\) que nos ajuda a diminuir a variância.
12.2.2 Explicação do Método
Dado que queremos estimar \(\theta = \mathbb{E}[X]\), definimos uma nova estimativa ajustada:
\[
Z = X + c(Y - \mu),
\]
onde \(c\) é uma constante a ser escolhida para minimizar a variância de \(Z\) e \(\mathbb{E}[Y]=\mu\). Ao calcular a expectativa de \(Z\), temos:
Quanto maior a correlação entre \(X\) e \(Y\), maior será a redução da variância.
12.2.4 Estimativa Prática
Na prática, as quantidades \(\text{Cov}(X, Y)\) e \(\text{Var}(Y)\) podem ser estimadas a partir de uma amostra gerada via Monte Carlo. Suponha que temos \(n\) amostras de \(X\) e \(Y\): \(X_1, \dots, X_n\) e \(Y_1, \dots, Y_n\). Então:
Isso demonstra como o uso de variáveis de controle pode reduzir drasticamente a variância na estimativa.
12.3 Técnica 3: Uso de Condicionamento
12.3.1 Motivação
Queremos estimar \(\theta = \mathbb{E}[X]\). Considere uma variável \(Y\) para a qual sabemos simular \(\mathbb{E}[X \mid Y]\). Podemos usar a seguinte propriedade da expectativa condicional:
set.seed(42) # Para reprodutibilidade# Função para estimar pi sem condicionamentoestimate_pi_simple <-function(n) { U1 <-runif(n, -1, 1) U2 <-runif(n, -1, 1) Z <-ifelse(U1^2+ U2^2<=1, 1, 0)return(4*mean(Z))}# Função para estimar pi com condicionamentoestimate_pi_conditioning <-function(n) { X <-runif(n, -1, 1) # Gera X uniformemente em [-1,1] g_Y <-sqrt(1- X^2) # Esperança condicional E[Z | X]return(4*mean(g_Y))}# Número de simulaçõesn <-100000# Estimativaspi_simple <-estimate_pi_simple(n)pi_conditioning <-estimate_pi_conditioning(n)# Resultadoscat("Estimativa de pi sem condicionamento:", pi_simple, "\n")
Estimativa de pi sem condicionamento: 3.1378
Mostrar código
cat("Estimativa de pi com condicionamento:", pi_conditioning, "\n")
Estimativa de pi com condicionamento: 3.142653
Mostrar código
import numpy as npnp.random.seed(42) # Para reprodutibilidade# Função para estimar pi sem condicionamentodef estimate_pi_simple(n): U1 = np.random.uniform(-1, 1, n) U2 = np.random.uniform(-1, 1, n) Z = (U1**2+ U2**2<=1).astype(int)return4* np.mean(Z)# Função para estimar pi com condicionamentodef estimate_pi_conditioning(n): X = np.random.uniform(-1, 1, n) # Gera X uniformemente em [-1,1] g_Y = np.sqrt(1- X**2) # Esperança condicional E[Z | X]return4* np.mean(g_Y)# Número de simulaçõesn =100000# Estimativaspi_simple = estimate_pi_simple(n)pi_conditioning = estimate_pi_conditioning(n)# Resultadosprint("Estimativa de pi sem condicionamento:", pi_simple)
Estimativa de pi sem condicionamento: 3.14412
Mostrar código
print("Estimativa de pi com condicionamento:", pi_conditioning)
Estimativa de pi com condicionamento: 3.1401670733896316
12.3.3 Exemplo 2: Estimando \(\mathbb{P}(X > 1)\) com Condicionamento
Seja \(Y \sim \text{Exp}(1)\) e suponha que \(X \mid Y = y \sim \mathcal{N}(y, 4)\). Desejamos estimar \(\mathbb{P}(X > 1)\).
set.seed(42) # Para reprodutibilidade# Função para estimar P(X > 1) sem condicionamentoestimate_prob_simple <-function(n) { Y <-rexp(n, rate =1) # Y ~ Exp(1) X <-rnorm(n, mean = Y, sd =2) # X | Y ~ N(Y, 4) Z <-ifelse(X >1, 1, 0)return(mean(Z))}# Função para estimar P(X > 1) com condicionamentoestimate_prob_conditioning <-function(n) { Y <-rexp(n, rate =1) # Y ~ Exp(1) g_Y <-1-pnorm((1- Y) /2) # E[Z | Y] usando a CDF da normalreturn(mean(g_Y))}# Número de simulaçõesn <-100000# Estimativasprob_simple <-estimate_prob_simple(n)prob_conditioning <-estimate_prob_conditioning(n)# Resultadoscat("Estimativa de P(X > 1) sem condicionamento:", prob_simple, "\n")
Estimativa de P(X > 1) sem condicionamento: 0.4905
Mostrar código
cat("Estimativa de P(X > 1) com condicionamento:", prob_conditioning, "\n")
Estimativa de P(X > 1) com condicionamento: 0.4903664
Mostrar código
import numpy as npfrom scipy.stats import normnp.random.seed(42) # Para reprodutibilidade# Função para estimar P(X > 1) sem condicionamentodef estimate_prob_simple(n): Y = np.random.exponential(1, n) # Y ~ Exp(1) X = np.random.normal(Y, 2, n) # X | Y ~ N(Y, 4) Z = (X >1).astype(int)return np.mean(Z)# Função para estimar P(X > 1) com condicionamentodef estimate_prob_conditioning(n): Y = np.random.exponential(1, n) # Y ~ Exp(1) g_Y =1- norm.cdf((1- Y) /2) # E[Z | Y] usando a CDF da normalreturn np.mean(g_Y)# Número de simulaçõesn =100000# Estimativasprob_simple = estimate_prob_simple(n)prob_conditioning = estimate_prob_conditioning(n)# Resultadosprint("Estimativa de P(X > 1) sem condicionamento:", prob_simple)
Estimativa de P(X > 1) sem condicionamento: 0.48977
Mostrar código
print("Estimativa de P(X > 1) com condicionamento:", prob_conditioning)
Estimativa de P(X > 1) com condicionamento: 0.4900730050240222
12.4 Exercícios
Exercício 1. Implemente a técnica das variáveis antitéticas para estimar \(E[\sin(X)]\) onde \(X \sim U(0, \pi)\). Compare a variância do estimador com o estimador usual.