Universidade Federal do Paraná
Curso de Gradução em Estatística

CE 089 - Estatística Computacional II

http://www.leg.ufpr.br/ce089

Prof. Dr. Walmes M. Zeviani
Lab. de Estatística e Geoinformação - LEG
Departamento de Estatística - UFPR


Geração de números aleatórios

Geração de números aleatórios é ramo importante da Estatística Computacional. A geração de números aleatórios permitem fazer de sorteios de brindes até produzir jogos de azar mas não é somente isso, é claro.

A geração de números aleatórios permite simulação variáveis aleatórias e, assim, de modelos estocásticos. Permite a simulação de dados com propriedades conhecidas, por exemplo, provenientes de determinadas distribuições de probabilidade para avaliar o desempenho de um teste para detecção de outliers ou o grau com o que o afastamento da normalidade influencia o desempenho do teste t. Com a simulação, pode-se investigar tamanhos de amostra para sitauções complexas que não dispõem de abordagem teórica. Dá para se avaliar níveis níveis cobertura de intervalos de confiança ou grau de vício de estimadores, bem como acessar a qualidade de um método de classificação e a velocidade de processamento de certa tarefa.

A simulação de variaáveis aleatórias pode ser feita de várias formas. A mais conhecida e geral é por meio da transformação integral da probabilidade que estabelece que variáveis aleatórias podem ser geradas a partir de variáveis aleatórias uniformes (uniforme contínua no intervalo [0, 1]) usando a inversa da função de distribuição acumulada (\(F^{-1}\)).

Antes de simularmos v.a. de distribuições de probabilidade, vamos primeiro simular números aleatórios e definir o que é uma sequência aleatória de valores.


Uma proposta de gerador

Vamos começar com a tentativas obter um gerador de números aleatórios pelo emprego recursivo da função \(sin(x)\). Tomaremos cuidado de fazê-la ter domínio e contra domínio no intervalo unitário para que seja usada recursivamente sem problemas.

##----------------------------------------------------------------------
## Uma função para geração de números aleatórios no intervalo (0, 1).

## Divide para uma disposição 2x2.
par(mfrow=c(2,2))

## Domínio: [0, 2*pi].
## Imagem: [-1, 1].
curve(sin(x), from=0, to=2*pi)

## Domínio: [0, 1].
## Imagem: [-1, 1].
curve(sin(2*pi*x), from=0, to=1)

## Domínio: [0, 1].
## Imagem: [0, 1].
curve(0.5+sin(2*pi*x)/2, from=0, to=1,
      ylim=c(0, 1), asp=1)
abline(v=0:1, h=0:1, lty=2, col=2)

layout(1)

A função a ser usada é a \(0.5+0.5\sin(2\pi x)\). Para gerar números aleatórios, vamos fazer uso recursivo dessa função \[ x_{i+1} = 0.5+0.5\sin(2\pi x_{i}). \]

Um valor inicial (x0) é necessário para começar o processo. Sempre que o mesmo valor for usado, a mesma sequência será gerada. Daí que muitos preferem usar o termo pseudo aleatório para geradores assim. Embora a sequência gerada tenha propriedades aleatórias, na realidade é possível prever o próximo valor se conhecer o mecanísmo usado.

##----------------------------------------------------------------------

rand0 <- function(n, x0){
    ##-------------------------------------------
    ## Interrompe se x0 estiver fora do intervalo.
    ## 
    stopifnot(x0 > 0 & x0 < 1)
    n <- n+1
    ##-------------------------------------------
    ## Cria um vetor vazio para receber os números.
    ## 
    x <- vector(mode="numeric", length=n)
    x[1] <- x0
    for (i in 2:n){
        x[i] <- 0.5+sin(2*pi*x[i-1])/2
    }
    ##-------------------------------------------
    ## Retorna a série, exceto o número inicial.
    return(x[-1])
}

## Usando o gerador.
x <- rand0(n=1000, x0=0.3)  ## com 5*pi

## Gráfico da série de valores.
par(mfrow=c(2,2))
plot(x, main=1)
plot(x, type="l", main=2)
plot(x[1:50], type="l", main=3)
pacf(x, main=4)