# Resolução da Prova 1 - Programação Estatística
## Exercício 1
### (a) Cálculo de $ F^{-1}(u) $
Dada a função de distribuição acumulada:
$$
F(x) = \frac{1}{1 + (\beta/x)^\alpha}
$$
Queremos encontrar $ x = F^{-1}(u) $:
$$
u = \frac{1}{1 + (\beta/x)^\alpha}
$$
$$
1 + (\beta/x)^\alpha = \frac{1}{u}
$$
$$
(\beta/x)^\alpha = \frac{1}{u} - 1 = \frac{1 - u}{u}
$$
$$
\beta/x = \left( \frac{1 - u}{u} \right)^{1/\alpha}
$$
$$
x = \beta \left( \frac{u}{1 - u} \right)^{1/\alpha}
$$
Portanto:
$$
F^{-1}(u) = \beta \left( \frac{u}{1 - u} \right)^{1/\alpha}
$$
### (b) Pseudo-código para simular n amostras
```
ALGORITMO: Gerar n amostras da Log-Logística(α,β)
ENTRADA: n, α, β
SAÍDA: Amostras x₁, x₂, ..., xₙ
PARA i DE 1 ATÉ n FAÇA:
1. Gerar u ~ Uniforme(0,1)
2. Calcular xᵢ = β × (u/(1-u))^(1/α)
3. Armazenar xᵢ
RETORNAR {x₁, x₂, ..., xₙ}
```
### (c) Implementação em Python
```python
import numpy as np
def rloglogistica(n, alpha, beta):
"""
Gera n amostras de uma distribuição Log-Logística(α,β)
"""
u = np.random.uniform(0, 1, n)
x = beta * (u / (1 - u)) ** (1/alpha)
return x
# Exemplo de uso:
# amostras = rloglogistica(1000, 2, 1)
```
## Exercício 2
### (a) Cálculo de $P(X = m)$
$$
P(X = m) = P(Y = m | Y > 0) = \frac{P(Y = m)}{P(Y > 0)} =
\frac{P(Y = m)}{1-P(Y = 0)} = \frac{e^{-\lambda} \lambda^m / m!}{1 - e^{-\lambda}}
$$
para $m = 1, 2, 3, \ldots$
### (b) Demonstração da função de distribuição
Para $m \in \{1, 2, \ldots\}$:
$$
F_X(m) = P(X \leq m) = P(Y \leq m | Y > 0) = \frac{P(0 < Y \leq m)}{P(Y > 0)} = \frac{F_Y(m) - P(Y = 0)}{1 - P(Y = 0)}.
$$
Logo,
$$
F_X(m) = \frac{F_Y(m) - e^{-\lambda}}{1 - e^{-\lambda}}.
$$
Para $m = 0$:
$$
F_X(0) = P(X \leq 0) = 0 \quad \text{(pois X > 0 sempre)}
$$
### (c) Descrição do algoritmo por inversão
```
ALGORITMO: Gerar X ~ Poisson truncada em 0
ENTRADA: λ
SAÍDA: X
1. Gerar U ~ Uniforme(0,1)
2. Calcular u* = e^{-λ} + (1 - e^{-λ}) × U
3. Encontrar X = min{m ≥ 1: F_Y(m) ≥ u*}
Onde F_Y é a CDF da Poisson(λ)
RETORNAR X
```
### (d) Implementação em Python
```python
import numpy as np
from scipy.stats import poisson
def rpoisson_truncada(lambda_param):
"""
Gera uma observação da Poisson truncada em 0
"""
U = np.random.uniform(0, 1)
u_star = np.exp(-lambda_param) + (1 - np.exp(-lambda_param)) * U
m = 1
while poisson.cdf(m, lambda_param) < u_star:
m += 1
return m
# Exemplo de uso:
# amostra = rpoisson_truncada(2.5)
```
## Exercício 3
### (a) Cálculo da constante c
A densidade Beta é:
$$
f(x) = \frac{1}{B(\alpha, \beta)} x^{\alpha-1} (1-x)^{\beta-1}, \quad 0 < x < 1
$$
Para encontrar o máximo, derivamos o logaritmo:
$$
\ln f(x) = -\ln B(\alpha, \beta) + (\alpha-1)\ln x + (\beta-1)\ln(1-x)
$$
$$
\frac{d}{dx} \ln f(x) = \frac{\alpha-1}{x} - \frac{\beta-1}{1-x}
$$
Igualando a zero:
$$
\frac{\alpha-1}{x} = \frac{\beta-1}{1-x} \Rightarrow x = \frac{\alpha-1}{\alpha+\beta-2}
$$
Substituindo na densidade:
$$
c = \max_{x \in (0,1)} f(x) = \frac{1}{B(\alpha, \beta)} \left( \frac{\alpha-1}{\alpha+\beta-2} \right)^{\alpha-1} \left( \frac{\beta-1}{\alpha+\beta-2} \right)^{\beta-1}
$$
$$
c = \frac{(\alpha-1)^{\alpha-1}(\beta-1)^{\beta-1}}{B(\alpha, \beta)(\alpha+\beta-2)^{\alpha+\beta-2}}
$$
### (b) Algoritmo de rejeição e implementação
```
ALGORITMO: Gerar Beta(α,β) por rejeição
ENTRADA: α, β
SAÍDA: X ~ Beta(α,β)
1. Calcular c = (α-1)^{α-1}(β-1)^{β-1} / [B(α,β)(α+β-2)^{α+β-2}]
2. REPETIR:
2.1 Gerar X ~ Uniforme(0,1)
2.2 Gerar U ~ Uniforme(0,1)
2.3 Calcular razão = f(X)/(c × g(X)) = f(X)/c
2.4 SE U ≤ razão ENTÃO ACEITAR X
ATÉ QUE X seja aceito
RETORNAR X
```
Implementação em Python:
```python
import numpy as np
from scipy.special import beta as beta_func
def rbeta_rejeicao(alpha, beta):
"""
Gera uma amostra de Beta(α,β) usando rejeição
"""
# Constante c
if alpha > 1 and beta > 1:
numerador = (alpha-1)**(alpha-1) * (beta-1)**(beta-1)
denominador = beta_func(alpha, beta) * (alpha+beta-2)**(alpha+beta-2)
c = numerador / denominador
else:
# Para α ≤ 1 ou β ≤ 1, usar valor conservador
c = 2.0
while True:
X = np.random.uniform(0, 1)
U = np.random.uniform(0, 1)
f_X = (X**(alpha-1) * (1-X)**(beta-1)) / beta_func(alpha, beta)
razao = f_X / c
if U <= razao:
return X
# Exemplo de uso:
# amostra = rbeta_rejeicao(2, 3)
```
## Exercício 4
### (a) Constante c e simplificação do algoritmo
Temos:
- $X$: Poisson truncada em 0
- $Y$: Poisson(λ) completa
A densidade de X é:
$$
f_X(m) = \frac{e^{-\lambda} \lambda^m / m!}{1 - e^{-\lambda}}, \quad m = 1, 2, \ldots
$$
A densidade de Y é:
$$
f_Y(m) = e^{-\lambda} \lambda^m / m!, \quad m = 0, 1, 2, \ldots
$$
A constante c deve satisfazer:
$$
f_X(m) \leq c f_Y(m) \quad \text{para todo } m
$$
Calculando a razão:
$$
\frac{f_X(m)}{f_Y(m)} = \frac{1}{1 - e^{-\lambda}} \quad \text{para } m \geq 1
$$
e
$$
\frac{f_X(0)}{f_Y(0)} = 0
$$
Portanto:
$$
c = \frac{1}{1 - e^{-\lambda}} = \frac{1}{P(Y > 0)}
$$
Assim, o algoritmo de rejeição se reduz a:
- Gerar Y ~ Poisson(λ)
- Aceitar se Y > 0, caso contrário rejeitar
### (b) Taxa de aceitação e eficiência
A taxa de aceitação é:
$$
\text{Taxa} = \frac{1}{c} = 1 - e^{-\lambda} = P(Y > 0)
$$
A eficiência do algoritmo:
- Quando λ → 0: Taxa ≈ λ → 0 (ineficiente)
- Quando λ → ∞: Taxa → 1 (eficiente)
**Interpretação**: O algoritmo é mais eficiente para valores grandes de λ, pois a probabilidade de gerar Y = 0 diminui. Para λ pequeno, muitas amostras são rejeitadas, tornando o algoritmo ineficiente.