View
219
Download
0
Category
Preview:
Citation preview
8/7/2019 estat stica computacional usando R
1/108
UNIVERSIDADE FEDERAL DE LAVRASDEPARTAMENTO DE CINCIAS EXATAS
Estatstica ComputacionalUtilizando R
Daniel Furtado Ferreira
danielff@ufla.br
LAVRAS
Minas Gerais - Brasil
11 de setembro de 2008
8/7/2019 estat stica computacional usando R
2/108
ii
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
3/108
Prefcio
Nestas notas de aula tivemos a inteno de abordar o tema de estatstica com-
putacional que to importante para a comunidade cientfica e principalmente para
os estudantes dos cursos de ps-graduao em estatstica. Podemos afirmar sem
medo de errar que a estatstica computacional se tornou e hoje em dia uma das
principais reas da estatstica. Alm do mais, os conhecimentos desta rea podem
ser e, freqentemente, so utilizados em outras reas da estatstica, da engenharia e
da fsica. A inferncia Bayesiana um destes exemplos tpicos em que geralmente
utilizamos uma abordagem computacional. Quando pensamos nestas notas de aulas
tivemos muitas dvidas do que tratar e como abordar cada tpico escolhido. Assim,optamos por escrever algo que propiciasse ao leitor ir alm de um simples receitu-
rio, mas que, no entanto, no o fizesse perder em um emaranhado de demonstraes.
Por outro lado buscamos apresentar os modelos e os mtodos de uma forma bastante
abrangente e no restritiva.
Uma outra motivao que nos conduziu e nos encorajou a desenvolver este pro-
jeto, foi a nossa experincia pessoal em pesquisas com a estatstica computacional.
Tambm fizemos isso pensando no benefcio pessoal, no podemos negar, que isso nos
traria ao entrarmos em contato direto com a vasta publicao existente neste ramo
da estatstica. No temos, todavia, a inteno de estudarmos todos os assuntos e
nem mesmo pretendemos para um determinado tpico esgotar todas as possibilida-
des. Pelo contrrio, esperamos que estas notas sejam uma introduo a estatstica
computacional e que sirvam de motivao para que os alunos dos cursos de graduao
em estatstica possam se adentrar ainda mais nessa rea.
Estas notas so baseadas em um livro que estamos escrevendo sobre a estatstica
computacional utilizando a linguagem Pascal. A adaptao para o R de algumas das
rotinas implementadas neste livro foi uma tarefa bastante prazerosa e reveladora.
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
4/108
iv
Aproveitamos esta oportunidade para desvendar um pouco dos inmeros segredosque este poderoso programa possui e descobrir um pouco sobre seu enorme potencial
e tambm, por que no dizer, de suas fraquezas. Nesta primeira verso no esperamos
perfeio, mas estamos completamente cientes que muitas falhas devem existir e
esperamos contar com a colaborao dos leitores para san-las. Esperamos que
estas notas venham contribuir para o crescimento profissional dos alunos de nosso
programa de Estatstica e Experimentao Agropecuria ou de outros programas da
UFLA ou de outras instituies. Dessa forma nosso objetivo ter sido atingido.
Daniel Furtado Ferreira
11 de setembro de 2008
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
5/108
Sumrio
Prefcio iii
Lista de Tabelas vii
Lista de Figuras ix
1 Introduo ao Programa R 1
1.1 Introduo ao R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Estruturas de Controle de Programao . . . . . . . . . . . . . . . . 8
1.3 Funes no R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.4 Introduo a Estatstica Computacional . . . . . . . . . . . . . . . . 15
1.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2 Gerao de Variveis Uniformes 19
2.1 Nmeros Aleatrios Uniformes . . . . . . . . . . . . . . . . . . . . . 20
2.2 Nmeros Aleatrios Uniformes no R . . . . . . . . . . . . . . . . . . 25
2.3 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3 Gerao de Variveis No-Uniformes 293.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Mtodos Gerais para Gerar Variveis Aleatrias . . . . . . . . . . . . 30
3.3 Variveis Aleatrias de Algumas Distribuies Importantes . . . . . . 38
3.4 Rotinas R para Gerao de Variveis Aleatrias . . . . . . . . . . . . 50
3.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4 Gerao de Amostras Aleatrias de Variveis Multidimensionais 57
4.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
6/108
vi SUMRIO
4.2 Distribuio Normal Multivariada . . . . . . . . . . . . . . . . . . . . 584.3 Distribuio Wishart e Wishart Invertida . . . . . . . . . . . . . . . 62
4.4 Distribuio t de Student Multivariada . . . . . . . . . . . . . . . . . 66
4.5 Outras Distribuies Multivariadas . . . . . . . . . . . . . . . . . . . 68
4.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5 Algoritmos para Mdias, Varincias e Covarincias 71
5.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2 Algoritmos Univariados . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.3 Algoritmos para Vetores Mdias e Matrizes de Covarincias . . . . . 765.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6 Aproximao de Distribuies 79
6.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6.2 Modelos Probabilsticos Discretos . . . . . . . . . . . . . . . . . . . . 82
6.3 Modelos Probabilsticos Contnuos . . . . . . . . . . . . . . . . . . . 86
6.4 Funes Pr-Existentes no R . . . . . . . . . . . . . . . . . . . . . . 93
6.5 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Referncias Bibliogrficas 95
ndice Remissivo 97
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
7/108
Lista de Tabelas
3.1 Distribuies de probabilidades, nome R e parmetros dos principais
modelos probabilstico. . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
8/108
viii LISTA DE TABELAS
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
9/108
Lista de Figuras
3.1 Ilustrao do teorema fundamental da transformao de probabilida-
des para gerar uma varivel aleatria Xcom densidade f(x) = F(x). 31
3.2 Mtodo da rejeio para gerar um valor x0 da varivel aleatria X
com densidade f(x). . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.3 Ilustrao grfica do algoritmo Metropolis-Hastings, apresentando a
funo de transio q(x; xt) e a transio de x1 para x2 por meio do
algoritmo de passeio aleatrio. . . . . . . . . . . . . . . . . . . . . . . 36
3.4 Crculo unitrio mostrando um ponto aleatrio (u1, u2) com R2 =
u21 + u22 representando x1 e o ngulo que o ponto (u1, u2) determinaem relao ao eixo u1. . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
10/108
x LISTA DE FIGURAS
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
11/108
Captulo 1
Introduo ao Programa R
O programa R (R Development Core Team, 2006[13]) foi escolhido para minis-
trar este curso por uma srie de razes. Alm de ser um programa livre, no sentido
de possuir livre distribuio e cdigo fonte aberto, pode ser utilizado nas platafor-
mas Windows e Unix. Alm do mais, o R possui grande versatilidade no sentido de
possuir inmeros pacotes j prontos e nos possibilitar criar novas rotinas e funes.
O R a verso livre baseada na linguagem S, cuja verso comercial o S-Plus. Oprograma SAS, por outro lado, o programa estatstico mais comum, mas o R
o mais popular. O programa R por ser genuinamente um programa orientado por
objeto nos possibilita programar com muita eficincia e versatilidade. Outro aspecto
que bastante atrativo no R refere-se ao fato de o mesmo receber contribuies
de pesquisadores de todo o mundo na forma de pacotes. Essa uma caracterstica
que faz com que haja grande desenvolvimento do programa em relativamente curtos
espaos de tempo e que nos possibilita encontrar solues para quase todos os pro-
blemas com os quais nos deparamos em situaes reais. Para os problemas que no
conseguimos encontrar solues, o ambiente de programao R nos possibilita criar
nossas prprias solues.
Nestas notas de aulas pretendemos apresentar os conceitos bsicos da estatstica
computacional de uma forma bastante simples. Inicialmente obteremos nossas pr-
prias solues para um determinado mtodo ou tcnica e em um segundo momento
mostraremos que podemos ter a mesma soluo pronta do programa R quando esta
estiver disponvel. Particularmente neste captulo vamos apresentar algumas caracte-
rsticas do ambiente e da linguagem R para implementarmos nossas solues. Nosso
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
12/108
2 Introduo ao Programa R
curso no pretende dar solues avanadas e de eficincia mxima para os problemasque abordaremos, mas propiciar aos alunos um primeiro contato com a linguagem
R (ou S) e com os problemas da estatstica computacional. A linguagem R um
dialeto da linguagem S que foi desenvolvida em 1980 e se espalhou pela comunidade
cientfica desde ento.
A desvantagem que o R no um programa fcil de aprender. Alguns esfor-
os iniciais so necessrios at que consigamos obter algum benefcio. No temos a
inteno de apresentar neste curso os recursos do R para anlises de modelos linea-
res de posto completo ou incompleto, de modelos no-lineares, de modelos lineares
generalizados ou de grficos. Eventualmente poderemos utilizar algumas destas fun-
es como um passo intermedirio da soluo do problema que estaremos focando.
Este material ser construdo com a abordagem terica do tpico e associar exem-
plificaes prticas dos recursos de programao R para resolver algum problema
formulado, em casos particulares da teoria estudada.
Este material apenas uma primeira verso que dever ter muitos defeitos. As-
sim, o leitor que encontr-los ou tiver uma melhor soluo para o problema poder
contribuir enviando um e-mail para danielff@ufla.br.
1.1 Introduo ao R
No R os smbolos ou variveis so objetos e podem ter as mais variadas estruturas,
tais como matrizes, vetores, data frames, listas, funes, expresses e muitos outras.
Vamos descrever de forma sucinta e gradativa algumas destes objetos.
Os vetores so compostos de clulas contguas de dados homogneos. Os vetores
podem ser de vrios tipos como, por exemplo, lgicos, inteiros, reais e caracteres.
O modo mais simples de criar um vetor utilizar > x=c(5, 1.5, 4.5, 6.7, 3.1).Este comando faz com que concatenemos os 5 elementos anteriores com a funo c
(concatenao) e o resultado um vetor de tamanho 5. Podemos acessar qualquer
elemento deste vetor utilizando o comando > x[j], em que j = 1, 2, , 5 e otamanho do vetor por > length(x). Se queremos ver o resultado do objeto na
tela, devemos digitar o nome dele na linha de comando do R por > x. Podemos
criar um vetor combinando dois vetores x, intercalados por zero da seguinte forma:
> y = c(x, 0, x). Outro aspecto que devemos esclarecer que as atribuies no R
podem ser feitas por
do programa R, por considerar que foram digitados em um arquivo texto. Cada
linha deve conter uma funo, uma atribuio ou um comando. Podemos digitar
mais de um comando por linha se os separarmos por ponto e vrgula. Vamos ilustrar
o uso de vetores com o exemplo a seguir. Neste exemplo aproveitamos o ensejo para
apresentar outros comandos teis da linguagem R.
# programa R demonstrando o uso de vetores e de comandos
# teis para lidarmos com eles. Todos os textos aps #
# sero considerados comentrios
x = c(2, 3, 4, 5.1, 3.2) # cria um vetor de tamanho 5
x # imprime o vetor
y = c(x,0,1,x) # concatena x com o vetor [0, 1] e x
y # imprime o vetor
z = c(2.4, 1.3, 3.4, 2.1, 5.7) # cria um vetor de tamanho 5
w = 2*x+z+1 # realiza operaes elementares com os vetores
w # imprime o vetor w
rx = range(x) # retorna um vetor de tamanho dois c(min(x),max(x))
rx # imprime o vetor rx
lx=length(x) # retorna o tamanho do vetor x em lx
lx # imprime lx
x1=seq(from=1, to=10, by=0.5) # gera uma seqncia 1, 1, 5, , 10
x1 # imprime x1
xr1=rep(x,times=5) # replica x na ntegra 5 vezes
xr2=rep(x,each=5) # replica cada elemento de x, 5 vezes
xr1 # imprime xr1
xr2 # imprime xr2
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
14/108
4 Introduo ao Programa R
Os vetores podem ser utilizados em expresses aritmticas, sendo as operaes
realizadas elemento a elemento. As operaes elementares so +, , , / e para po-tenciao. Vrios outros operadores aritmticos so disponveis, como por exemplo,
log, exp, sin, cos, tan e sqrt. Funes como range retornam um vetor de tama-
nho dois composto pelos valores c(min(x),max(x)) e o operador length(x) retorna
o tamanho do vetor x.
Podemos gerar seqncias regulares no programa R facilmente. O comando
x = 1 : 5 gera um vetor x que seria obtido de forma equivalente por x = c(1, 2, 3, 4, 5).
O operador dois pontos possui a maior prioridade entre todos os operadores aritm-
ticos dentro de uma expresso. Assim, 2 1 : 5 ir gerar a seqncia 2, 4, 6, 8, 10. Sequeremos uma seqncia que se inicia em 2 (exemplo bvio) e termina em 5 com passo
igual a 1, devemos usar o comando (2 1) : 5, que ir produzir 2, 3, 4, 5. O comandox1 = seq(from = 1, to = 10, by = 0.5) gera uma seqncia que vai de 1 a 10 utili-
zando um passo igual a 0, 5. Podemos simplesmente utilizar x1 = seq(1, 10, by = 0.5).
Se o limite superior da seqncia no for um mltiplo exato do passo, ento o R ir
produzir uma seqncia que ir finalizar no mltiplo mais prximo, mas inferior, ao
limite superior. Um outro comando bastante til dizer qual o tamanho da seqn-cia, o valor inicial e o passo da seguinte forma: seq(length = 19,from = 1, by = 0.5).
Este comando ir produzir a mesma seqncia do programa anterior. Podemos
ainda utilizar passos negativos para a seqncia, como por exemplo, seq(length=19,
from=1, by=-0.5), que ir produzir uma seqncia de 1 a 8 com passo 0, 5.Um outro importante comando o rep() que podemos utilizar para replicar
um objeto das mais diferentes formas. No exemplo anterior utilizamos duas delas.
Utilizamos o comando rep(objeto, times) e o comando rep(objeto, each).
Podemos gerar vetores lgicos por condies (>, >=, < ,
8/7/2019 estat stica computacional usando R
15/108
1.1 Introduo ao R 5
importantes devem ser considerados. Vrias outras operaes vetoriais so possveise sero descritas oportunamente, na medida que necessitarmos deles.
# programa R demonstrando o uso de vetores lgicos
x = c(2.2, 1.3, 4.7, 5.1, 3.2) # cria um vetor de tamanho 5
x # imprime o vetor
y = x > 5.0 # cria um vetor lgico
y # imprime o vetor
z = !y # cria um vetor lgico de negao de y
z # imprime o vetor
w = x[x=3.0] # cria w2 com elementos de x >= 3 e adicionados de 1
w2 # imprime o vetor w2
O R nos possibilita lidar com arranjos de vrias dimenses. Vamos utilizar neste
material apenas o arranjo mais simples de duas dimenses que so as matrizes. A
forma mais simples de gerarmos uma matriz utilizar o comando matrix(0, n , p).
Este comando nos permite gerar uma matriz composta de elementos iguais a zero
e de dimenses linha e coluna iguais a n e p, respectivamente. Os elementos desta
matriz (A) so preenchidos atribuindo, por exemplo, na linha i e coluna j, o valor
desejado 10 da seguinte forma A[i, j] = 10. Variando-se o ndice da linha e da coluna
podemos atribuir valores a quaisquer outras posies da matriz A.
Alguns operadores aplicados a matriz so executados elemento a elemento. Por
exemplo, se fizermos A B, teremos uma matriz resultante do produto dos elemen-tos de A com os elementos correspondentes da matriz B. Se desejarmos o produto
matricial entre duas matrizes, devemos utilizar o operador % %. Assim, A% %Bretorna a matriz resultante da multiplicao matricial de A por B. Os operadores
nrow(A) e ncol(A) retornam o nmero de linhas e de colunas de A, respectivamente.
O operador diag depende do argumento. Se diag(x) aplicado a um vetor x, o re-
sultado uma matriz diagonal cujos elementos so iguais aos elementos do vetor x.
Se por outro lado utilizarmos diag(A), em que A uma matriz, obteremos um vetor
cujos elementos so os mesmos da diagonal principal de A. O comando solve(A)
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
16/108
6 Introduo ao Programa R
retorna a inversa de A, ou seja, A1. Tambm pode ser utilizado para resolversistemas de equaes lineares do tipo y = Ax, da seguinte forma x = solve(A, y).
Autovalores e autovetores de uma matriz simtrica A podem ser computados por
ev = eigen(A). Os autovalores so armazenados no objeto (vetor) ev$values e os
autovetores correspondentes, no objeto (matriz) ev$vec. Cada coluna desta matriz
contm um autovetor correspondente ao elemento associado do vetor de autovalores.
Uma matriz qualquer pode ser decomposta da seguinte forma A = U DVT. Esta
decomposio conhecida de decomposio do valor singular e a funo R dada
por udv = svd(A). O resultado uma lista com os objetos u, d e v com significados
bvios. Uma lista possui objetos de diferentes tipos que podem ser acessados por
objeto$componente. No exemplo, obtivemos os elementos da matriz diagonal D uti-
lizando o comando udv$d. Os exemplos apresentados no programa a seguir ilustram
as funes e os comandos retro mencionados.
# programa R demonstrando o uso de matrizes e de alguns de seus operadores
A = matrix(0,2,2) # cria uma matriz 2 2 de zeros
A[1,1] = 4; A[1,2] = 1; A[2,1] = 1; A[2,2] = 2 # atribui valores a matriz
A # imprime a matriz
B = matrix(c(8,-1,-1,1),2,2) # cria uma matriz 2 2 de outra forma
B # imprime a matriz
C=A*B # multiplicao elemento por elemento
C # imprime a matriz
nrow(C);ncol(C) # nmero de linhas e colunas de C
D=A%*%B # multiplicao matricial A por B
D # imprime a matriz resultante
v=diag(D) # vetor com a diagonal principal de D
v # imprime o vetor resultante
AI=solve(A) # inversa de A
AI # imprime a matriz resultante
ev=eigen(A) # autovalores e autovetores de A
ev$vec # imprime os autovetores
ev$values # imprime os autovalores
udv=svd(A) # decomposio do valor singular de A
udv # imprime todos os resultados da lista: DVS
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
17/108
1.1 Introduo ao R 7
Muitos outros objetos existem no R e sero descritos oportunamente, na medida
que aparecerem nas funes que desenvolveremos posteriormente. Vamos somente
descrever, para finalizar, como podemos ler um arquivo de dados no formato texto e
associ-lo a um objeto R. Vamos imaginar que tenhamos um arquivo de dados com
duas variveis X1 e X2 e n = 20 observaes. Devemos criar um arquivo com algum
editor de texto, onde na primeira linha colocamos a identificao de cada coluna
(varivel). Neste exemplo vamos criar um arquivo com o nome dados.txt.
X1 X2
13.4 14
14.6 15
13.5 19
15.0 23
14.6 17
14.0 20
16.4 2114.8 16
15.2 27
15.5 34
15.2 26
16.9 28
14.8 24
16.2 26
14.7 23
14.7 9
16.5 18
15.4 28
15.1 17
14.2 14
Para ler estes dados do arquivo e associ-lo a um objeto R do tipo data frame,
devemos utilizar o comando read.table(). O comando usado da seguinte forma:
read.table(dados.txt,header=TRUE) . A opo header=TRUEindica ao R que nosso
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
18/108
8 Introduo ao Programa R
arquivo possui na primeira linha a identificao das variveis. No exemplo a seguirapresentamos detalhes destes comandos em um pequeno programa R. conveniente
mudarmos o diretrio de trabalho para o local onde se encontra o arquivo dados.txt
no menu File\Change dirdo R. Se quisermos editar os dados e atribu-los a um novoobjeto (data frame), devemos utilizar o comando > edit(dados). Um planilha ser
aberta para que sejam efetuadas as trocas necessrias.
# programa R demonstrando a leitura de arquivos de dados
dados=read.table("dados.txt",header=TRUE) # l o arquivo de dados nodata frame
dadosdados # imprime a matriz
dados.novo=edit(dados) # editando o data frame
Finalmente, devemos enfatizar que o R diferencia entre comandos digitados em
maisculo e minsculo. Por exemplo na opo header=TRUE, a palavra TRUEdeve
estar em maisculo. Se for digitado header=Trueou header=trueo R acusar um
erro e o objeto dadosno ser criado. No entanto, para esta opo, o R aceita a
simplificao header=T.
1.2 Estruturas de Controle de Programao
O R um ambiente de programao cujos comandos so expresses. Estas ex-
presses podem ser organizadas em grupos com uso de chaves {expr_1; expr_2;
; expr_m}. O valor do grupo o resultado da ltima expresso avaliada. Os
comandos do R so separados por ponto e vrgula ou por uma nova linha. O ponto evrgula sempre indica o fim do comando, enquanto uma nova linha pode indicar ou
no o fim do comando. O comando pode ser associado a um objeto ou no. Quando
no estiver associado a um objeto, o valor do comando retornado imediatamente.
Assim, > x = 2 3 e > 2 3 faro a mesma coisa, mas no primeiro caso o resultado armazenado no objeto x e no segundo o seu valor retornado na janela de consoledo
R. Vejamos o exemplo de alguns comandos com uso de agrupamentos no programa a
seguir. Observe que nos comandos que se estendem por mais de uma linha, o prompt
> se altera para +, aguardando que a continuao do comando seja digitada.
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
19/108
1.2 Estruturas de Controle de Programao 9
# programa R demonstrando comandos agrupados e comandos
# em mais de uma linha e em apenas uma linha
x = 1; x=x+10
x
x = 1; x+10
{
x = 1
x+10
}
z={x=0;y=x+1;x=y+1}
z
O if/else um importante comando de controle que avalia condies para realizar
um determinado comando ou grupo de comandos, se o resultado for verdadeiro, ou
outro comando ou grupo, se o resultado for falso. Mltiplos comandos podem ser
hierarquizados. O comando formal feito da seguinte forma:> if (expr_1) expr_2 else expr_3
A expr_1 avaliada e se o resultado lgico for verdadeiro, ento expr_2 exe-
cutada; se o resultado for falso a expr_3 ser avaliada. Se o expr_2 no for um
bloco de comandos o else deve obrigatoriamente ficar na mesma linha de comando
de expr_1. O programa a seguir ilustra algumas das possibilidades para o uso do
comando if/else. O programa no faz nada de til e algumas comparaes no
fazem nenhum sentido, a no ser o de exemplificar o comando.
# programa R demonstrando alguns usos do if/else
x = 1
if (x>0.5) y=5 else y=x
y
z =c(0.5,-0.5, 4.5,10)
if (any(z
8/7/2019 estat stica computacional usando R
20/108
10 Introduo ao Programa R
w2
if (any(z
8/7/2019 estat stica computacional usando R
21/108
1.2 Estruturas de Controle de Programao 11
> repeat expr
O comando exprdeve ser necessariamente um grupo de comandos (comando
composto). Um destes comandos ir fazer uma avaliao da condio de parada e
se esta condio for satisfeita o comando breakser usado para interromper o loop.
O comando breakpode ser usado para cessar qualquer um dos outros comandos de
repetio, que , em geral, no normal, mas no caso do repeatconstitu-se na nica
forma. No programa apresentado a seguir, ilustramos o uso do comando repeat. Este
programa no faz nada de til e tem apenas a finalidade de ilustrar o comando.
# programa R demonstrando uso do repeat/break
i = 1
repeat {
print(i)
i = i + log(i+1)*3
if (i > 35) break
}
O comando while muito parecido com o repeate a sintaxe geral :
> while (condio) expr
Sero repetidos os comandos do grupo exprat que a condio de parada seja
satisfeita. Novamente necessrio frisar que deve-se tomar muito cuidado com a
condio imposta para evitarmos loopsinfinitos. Nos cdigos seguintes repetimos o
mesmo programa feito com o comando repeat, porm utilizando o comando while.
# programa R demonstrando uso do while
i = 1
while (i
8/7/2019 estat stica computacional usando R
22/108
12 Introduo ao Programa R
O comando for usado para repetirmos uma determinada seqncia ou grupo
de operaes em um nmero fixo de vezes. Os passos do loop no R so determinados
por um vetor ou seqncia do tipo ini : f im. A sintaxe geral do forpara uma dada
seqncia (seq) e um grupo de comandos (expr) dada por:
> for (i in seq) expr
Um exemplo de programa R para ilustrar o comando forde controle de loops
dado por:
# programa R demonstrando uso do f or
x = matrix(0,10,1)
for(i in 1:10) {
x[i] = i*2+3-log(i)
}
x
Como j salientamos dentro do grupo de comandos do forou do whilepodemos
utilizar o breakse alguma condio for satisfeita. Com o breako R ir executar o
prximo comando, se houver, aps o trmino do loop.
1.3 Funes no R
O R nos possibilita criar nossas prprias funes, que so genuinamente funes
R, sendo armazenadas internamente de uma forma especial e podendo ser utilizadasem novas expresses. Desta forma a linguagem ganha grande poder, convenincia
e elegncia. O aprendizado em escrever funes teis uma das muitas maneiras
de fazer com que o uso do R seja confortvel e produtivo. A sintaxe geral de uma
funo dada por:
> nome = function(arg_1, arg_2, ...) expr
em que expr , normalmente, um grupo de comandos e nome o objeto que receber
a funo. Sua chamada se dar por um comando nome(a1, a2, ...), em que a1, a2,
etc. so os valores que devero ser passados como argumentos dos objetos (arg_1,
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
23/108
1.3 Funes no R 13
arg_2, ...).Vamos apresentar uma funo simples para testar a hiptese H0 : = 0 a
partir de uma amostra simples de uma distribuio normal. Dois argumentos sero
utilizados: o vetor de dados x de tamanho n e o valor real hipottico 0. A funo
calcular o valor da estatstica tc do teste por:
tc =X 0
Sn
. (1.3.1)
A funo resultante, em linguagem R, apresentada a seguir. Neste exemplo
uma amostra de tamanho n = 8 foi utilizada para obter o valor da estatstica para
testar a hiptese H0 : = 5, 0. Podemos observar que o resultado final da funo
igual ao do ltimo comando executado, ou seja o valor da estatstica e do valor- p,
por meio de um objeto do tipo lista. Se o comando e return() no for utilizado, a
funo retornar sempre como resultado, o valor da ltima operao ou comando
executado. Esta funo utiliza no seu escopo trs outras funes do R (funes
bsicas do R). As duas primeiras, var() e mean() retornam a varincia e a mdia
do vetor utilizado como argumento, respectivamente, e a terceira, pt(), retorna a
probabilidade acumulada da distribuio t de Student para o primeiro argumento da
funo com graus de liberdade, que o seu segundo argumento.
# programa R demonstrando uso de uma funo
tteste = function(x,mu0){
n = length(x)
S2 = var(x)
xb = mean(x)
t=list(tc=c(0),pr=c(0))
t$tc = (xb-mu0)/sqrt(S2/n)
t$pr = 2*(1-pt(abs(t$tc),n-1 ))
return(t)
}
y=c(3.4,5.6,4.0,6.0,7.8,9.1,3.4,4.5)
t = tteste(y,5.0)
t
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
24/108
14 Introduo ao Programa R
Os argumentos xe mu0definem as variveis cujos valores sero fornecidos quando
a funo for chamada. Os nomes destes argumentos podem ser utilizados dentro do
escopo desta funo e os valores devem ser fornecidos no momento em que funo foi
chamada, como neste caso. No exemplo, os valores especificados anteriormente para
os componentes do vetor y e o valor 5, 0 para o valor hipottico foram utilizados como
argumentos da funo. Podemos utilizar valores defaultpara os argumentos, como
por exemplo varivel = valor. Poderamos utilizar o default mu0 = 0na declarao
da funo. Neste caso, se o valor hipottico no for passado, ento a hiptese testada
ser sempre H0 : = 0.
Assim, poderamos ter o seguinte programa resultante:
# programa R demonstrando uso de uma funo
tteste = function(x,mu0=0){
n = length(x)
S2 = var(x)
xb = mean(x)
t=list(tc=0,pr=0)
t$tc = (xb-mu0)/sqrt(S2/n)
t$pr = 2*(1-pt(abs(t$tc),n-1 ))
return(t)
}
y=c(3.4,5.6,4.0,6.0,7.8,9.1,3.4,4.5)
tc1 = tteste(x=y,mu0=5.0)
tc1tc2 = tteste(x=y) # testar H0: mu=0
tc2
tc3 = tteste(y,5.0) # testar H0:mu=5
tc3
Neste programa demonstramos diferentes formas de invocar a funo. No caso,
os argumentos que possuem defaultpodem ser omitidos, desde que a ordem de en-
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
25/108
1.4 Introduo a Estatstica Computacional 15
trada dos argumentos no seja alterada, ou desde que entremos com os argumentosnomeando-os, como foi o caso dos exemplos tc1 e tc2. O R, diferentemente do S-
plus, ir buscar um objeto utilizado em uma funo preferencialmente no prprio
escopo da funo e somente aps no encontr-lo localmente, ser buscado o objeto
global. O S-plus faz exatamente o contrrio, busca preferencialmente os objetos glo-
bais de mesmo nome dos objetos locais. Iremos dar preferncias s funes neste
material para executarmos tarefas e resolvermos problemas que eventualmente de-
frontaremos daqui por diante. O resultado de uma funo pode ser colocado em
uma lista e o objeto que ir invocar a funo herdar os objetos desta lista. Assim,
como vimos nesta funo, calculamos, alm do valor da estatstica, o valor-p (pr).
Se no tivssemos criado a lista t, poderamos ter calculado o valor-p e o valor da
estatstica separadamente e terminaramos a funo utilizando o seguinte comando:
> list(tc=t, valor.p=pr). Os objetos tc1, tc2e tc3possuem os componentes tce pr
como resultados e so chamados, por exemplo, por tc1$tce tc1$pr.
1.4 Introduo a Estatstica Computacional
Os mtodos de computao intensiva tm desempenhado um papel cada vez mais
importante para resolver problemas de diferentes reas da cincia. Vamos apresentar
algoritmos para gerar variveis aleatrias de diversas distribuies de probabilidade,
para realizar operaes matriciais, para realizar inferncias utilizando mtodos de
permutao e bootstrap, etc. Assim, buscamos realizar uma diviso deste material
em uma seo bsica e em outra aplicada. As tcnicas computacionais so denomina-
das de estatstica computacional se forem usadas para realizarmos inferncias, para
gerarmos variveis aleatrias ou para compararmos mtodos e tcnicas estatsticas.
Vamos explorar mtodos de gerao de variveis aleatrias de diversos modelosprobabilsticos, para manipularmos matrizes, para obtermos quadraturas de fun-
es de distribuio de diversos modelos probabilsticos e de funes especiais na
estatstica e finalmente vamos apresentar os mtodos de computao intensiva para
realizarmos inferncias em diferentes situaes reais. Temos a inteno de criar algo-
ritmos em linguagem R e posteriormente, quando existirem, apresentar os comandos
para acessarmos os mesmos algoritmos j implementados no R.
Temos a inteno de apresentar os mtodos de bootstrap e Monte Carlo, os
testes de permutao e o procedimento jackknife para realizarmos inferncias nas
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
26/108
16 Introduo ao Programa R
mais diferentes situaes reais. Assim, este curso tem basicamente duas intenes:possibilitar ao aluno realizar suas prprias simulaes e permitir que realizem suas
inferncias de interesse em situaes em que seria altamente complexo o uso da
inferncia clssica.
Seja na inferncia freqentista ou na inferncia Bayesiana, os mtodos de simu-
lao de nmeros aleatrios de diferentes modelos probabilsticos assumem grande
importncia. Para utilizarmos de uma forma mais eficiente a estatstica computacio-
nal, um conhecimento mnimo de simulao de variveis aleatrias uma necessidade
que no deve ser ignorada. Vamos dar grande nfase a este assunto, sem descui-
dar dos demais. Apresentaremos neste material diversos algoritmos desenvolvidos e
adaptados para a linguagem R.
Simular a arte de construir modelos segundo Naylor et al. (1971) [10], com
o objetivo de imitar o funcionamento de um sistema real, para averiguarmos o que
aconteceria se fossem feitas alteraes no seu funcionamento (Dachs, 1988 [2]). Este
tipo de procedimento pode ter um custo baixo, evitar prejuzos por no utilizarmos
procedimentos inadequados e otimizar a deciso e o funcionamento do sistema real.
Precaues contra erros devem ser tomadas quando realizamos algum tipo de
simulao. Podemos enumerar:
1. escolha inadequada das distribuies;
2. simplificao inadequada da realidade; e
3. erros de implementao.
Devemos fazer o sistema simulado operar nas condies do sistema real e verificar
por meio de alguns testes se os resultados esto de acordo com o que se observa no
sistema real. A este processo denominamos de validao. Ento, a simulao umatcnica que usamos para a soluo de problemas. Se a soluo alcanada for mais
rpida, de menor custo e de fcil interpretao em relao a outro mtodo qualquer,
o uso de simulao justificvel.
1.5 Exerccios
1.5.1 Criar no R os vetores AT= [1, 2, 4, 5] e BT= [3, 6, 8, 9] e concaten-los for-
mando um nico vetor. Obter o vetor C= 2A + B e o vetor D = ATB. Criar
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
27/108
1.5 Exerccios 17
uma seqncia cujo valor inicial igual a 2 e o valor final 30 e cujo passo igual a 4. Replicar cada valor da seqencia 3 vezes de duas formas diferentes
(valores replicados ficam agregados e a seqncia toda se replica sem que os
valores iguais fiquem agregados).
1.5.2 Selecionar o subvetor de xT= [4, 3, 5, 7, 9, 10] cujos elementos so menores ou
iguais a 5.
1.5.3 Criar a matriz
A =
10 11 2
e determinar os autovalores e a decomposio espectral de A.
1.5.4 Construir uma funo para verificar quantos elementos de um vetor de di-
menso n so menores ou iguais a 0. Utilize as estruturas de repeties for,
whilee repeatpara realizar tal tarefa (cada uma destas estruturas dever ser
implementada em uma diferente funo). Existe algum procedimento mais efi-
ciente para gerarmos tal funo sem utilizar estruturas de repeties? Se sim,
implement-lo.
1.5.5 Implementar uma funo R para realizar o teste t de Student para duas amos-
tras independentes.
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
28/108
18 Introduo ao Programa R
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
29/108
Captulo 2
Gerao de Variveis Uniformes
Neste captulo vamos considerar a gerao de nmeros aleatrios para o mo-
delo probabilstico uniforme. A partir do modelo uniforme podemos gerar variveis
aleatrias de qualquer outro modelo probabilstico. Para gerar realizaes de uma
distribuio uniforme, precisamos gerar nmeros aleatrios. Isso no pode ser reali-
zado por mquinas. Na verdade qualquer seqncia produzida por uma mquina
na verdade uma seqncia previsvel. Dessa forma, a denominamos de seqncia de
nmeros pseudo-aleatrios.
Uma seqncia de nmeros ser considerada aleatria do ponto de vista compu-
tacional se o programa que a gerar for diferente e estatsticamente no correlacionado
com o programa que a usar. Assim, dois geradores de nmeros aleatrios deveriam
produzir os mesmos resultados nas suas aplicaes. Se isso no ocorrer, um deles no
pode ser considerado um bom gerador de nmeros aleatrios (Press et al., 1992 [12]).
Os conceitos de nmeros uniformes e nmeros aleatrios podem ser muitas vezesconfundidos. Nmeros uniformes so aqueles que variam aleatoriamente em uma
faixa determinada de valores com probabilidade constante. No entanto, devemos di-
ferenciar nmeros aleatrios uniformes de outros tipos de nmeros aleatrios, como
por exemplo, nmeros aleatrios normais ou gaussianos. Estes outros tipos so geral-
mente provenientes de transformaes realizadas nos nmeros aleatrios uniformes.
Ento, uma fonte confivel para gerar nmeros aleatrios uniformes determina o su-
cesso de mtodos estocsticos de inferncia e de todo processo de simulao Monte
Carlo.
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
30/108
20 Gerao de Variveis Uniformes
2.1 Nmeros Aleatrios Uniformes
Nmeros uniformes aleatrios so aqueles que, a princpio, se situam dentro de
uma determinada amplitude, geralmente entre 0 e 1, para os quais no podemos
produzir uma seqncia previsvel de valores. Em vrios programas estes nmeros
so gerados utilizando o comando random ou comandos similares. Em pascal, por
exemplo, se este comando for utilizado com o argumento n, random(n), nmeros
aleatrios inteiros Udo intervalo 0 U n 1 so gerados e se o argumento n nofor usado, os nmeros gerados so valores aleatrios reais do intervalo [0;1[.
Em geral, os programas utilizam o mtodo da congruncia. Sejam os nmerosuniformes inteiros U1, U2, U3, . . . entre 0 e m 1, em que m representa um grandenmero inteiro. Podemos gerar estes nmeros utilizando o mtodo da congruncia
por meio da relao recursiva:
Ui+1 = (aUi + c) mod m (2.1.1)
em que m chamado de mdulo, a e c so inteiros positivos denominados de multipli-
cador e incremento, respectivamente. O operador mod retorna o resto da diviso
do argumento (aUi + c) por m. A seqncia recorrente (2.1.1) se repete em um pe-rodo que no maior que m, por razes bvias. Se a, c e m so adequadamente
escolhidos, a seqncia tem tamanho mximo igual a m. A escolha do valor inicial
U0 tambm muito importante. O valor do nmero uniforme correspondente no
intervalo de 0 a 1 dado por Ui+1/m, que sempre menor que 1 mas que pode ser
igual a zero.
Vamos apresentar um exemplo didtico para ilustrar o gerador de nmeros alea-
trios. Sejam U0 = a = c = 7 e m = 10, logo,
U1 = (7 7 + 7) mod 10 = 56 mod 10 = 6U2 = (7 6 + 7) mod 10 = 49 mod 10 = 9
e assim sucessivamente. Obtemos a seqncia de nmeros aleatrios:
{7, 6, 9, 0, 7, 6, 9, 0, 7, 6, 9, }
e verificamos que o perodo igual a 4 {7, 6, 9, 0, }, que menor do que m = 10.Este mtodo tem a desvantagem de ser correlacionado em srie. Se m, a ou c
no forem cuidadosamente escolhidos a correlao pode comprometer a seqncia
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
31/108
2.1 Nmeros Aleatrios Uniformes 21
gerada em srie. Por outro lado, o mtodo tem a vantagem de ser muito rpido.Podemos perceber que a cada chamada do mtodo, somente alguns poucos clculos
so executados. Escolhemos, em geral, o valor de m pelo maior inteiro que pode ser
representado pela mquina, qual seja, 232. Um exemplo que foi utilizado por muitos
anos nos computadores IBM mainframe, que representam uma pssima escolha
a = 65.539 e m = 231.
A correlao serial no o nico problema desse mtodo. Os bits de maior ordem
so mais aleatrios do que os bits de menor ordem (mais significantes). Devemos
gerar inteiros entre 1 e 20 por j = 1 + int(20
random(semente)), ao invs de
usar o mtodo menos acurado j = 1+ mod (int(1000000 random(semente)), 20),que usa bits de menor ordem. Existem fortes evidncias, empricas e tericas, que o
mtodo da congruncia
Ui+1 = aUi mod m (2.1.2)
to bom quanto o mtodo da congruncia com c = 0, se o mdulo m e o multiplica-dor a forem escolhidos com cuidado (Press et al., 1992[12]). Park e Miller (1988)[11]
propuseram um gerador padro mnimo baseado nas escolhas:
a = 75 = 16.807 m = 231 1 = 2.147.483.647 (2.1.3)
Este gerador de nmeros aleatrios no perfeito, mas passou por todos os testes
a qual foi submetido e tem sido usado como padro para comparar e julgar outros
geradores. Um problema que surge e que devemos contornar que no possvel
implementarmos diretamente em uma linguagem de alto-nvel a equao (2.1.2) com
as constantes de (2.1.3), pois o produto de a e Ui excede, em geral, o limite mximo
de 32 bits para inteiros. Podemos usar um truque devido a Schrage (1979)[14] para
multiplicar inteiros de 32-bits e aplicar o operador de mdulo e que permite umaportabilidade para ser implementado em praticamente todas as linguagens e em
todas as mquinas. O algoritmo de Schrage baseia-se na fatorao aproximada de m
dada por:
m = aq + r; i.e., q = m/a; r = m mod a (2.1.4)
em que z denota a parte inteira do nmero z utilizado como argumento. Para umnmero Ui entre 1 e m
1 e para r pequeno, especificamente para r < q, Schrage
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
32/108
22 Gerao de Variveis Uniformes
(1979) [14] mostraram que ambos a(Ui mod q) e rUi/q pertencem ao intervalo0 m 1 e que
aUi mod m =
a(Ui mod q) rUi/q se maior que 0a(Ui mod q) rUi/q + m caso contrrio
(2.1.5)
Computacionalmente observamos que a relao:
a(Ui mod q) = a(Ui qUi/q)
se verifica. No R pode-se optar por usar o operador %% (mod), que retorna o resto da
operao entre dois inteiros e o operador %/% (div), que retorna o resultado do divi-
dendo para operaes com inteiros. A quantidade Ui mod q = Ui(Ui div q)qpode ser obtida em R simplesmente com Ui %% q. Atribumos o resultado a uma
varivel qualquer definida como inteiro. Para aplicarmos o algoritmo de Schrage s
constantes de (2.1.3) devemos usar os seguintes valores: q = 127.773 e r = 2.836.
A seguir apresentamos o algoritmo do gerador padro mnimo de nmeros alea-
trios:
# gerador padro mnimo de nmeros aleatrios adaptado de Park and
# Miller. Retorna desvios aleatrios uniformes entre 0 e 1. Fazer
# sem igual a qualquer valor inteiro (no pode ser o improvvel
# valor mask) para iniciar a seqncia; sem no pode ser
# alterado entre sucessivas chamadas da seqncia - se sem for
# zero ou negativo, um valor dependente do valor do relgio do sistema no
# momento da chamada usado como semente. Constantes
# usadas a = 75
= 16.807, m = 231
1 = 2.147.483.647
# e c = 0
gna0
8/7/2019 estat stica computacional usando R
33/108
2.1 Nmeros Aleatrios Uniformes 23
if (sem
8/7/2019 estat stica computacional usando R
34/108
24 Gerao de Variveis Uniformes
valor da semente definido pelo usurio e declarado na funo como parmetrode referncia. Isso significa que a varivel do programa que chama a funo e que
passada como semente deve ser atualizada com o novo valor modificado em gna0.
Se o seu valor inicial for zero ou negativo, a funo atribui um inteiro dependente
da hora do sistema no momento da chamada; c) o sinal # indica comentrio no
R; d) o comando > list(u=amostra$ran0, sem=amostra$sem) passa o valor de
amostra para o resultado da funo em uma lista contendo o novo valor da semente
e o nmero aleatrio ran0 gerado; e) a funo tem dependncia do pacote R.utils,
que por sua vez depende dos pacotes R.methodsS3e R.oo. Essa dependncia se
caracteriza por usar uma funo para capturar a hora do sistema.
A rotina iniciada com os valores de n e da semente fornecidos pelo usurio.
Se a semente for nula ou negativa, atribumos um novo valor dependente do relgio
do sistema no momento da chamada usando funes do R para isso. A partir deste
ponto o programa deve chamar reiteradas vezes a funo gna0, que retorna o valor
do nmero aleatrio 0 e 1 utilizando o algoritmo descrito anteriormente, at que a
seqncia requerida pelo usurio seja completada. Nas sucessivas chamadas desta
funo, o valor da semente sempre igual ao valor do ltimo passo, uma vez que
sem da ltima chamada deve ser passada como parmetro de referncia para afuno gna0 a partir do bloco do programa que a chamou.
O perodo de gna0 da ordem de 231 2, 15109, ou seja, a seqncia completa superior a 2 bilhes de nmeros aleatrios. Assim, podemos utilizar gna0 para a
maioria dos propsitos prticos. Evitamos o valor zero na funo gna0 devido ao
fato de todos os valores da seqncia serem nulos para um valor inicial de semente
igual a zero. No entanto, para sementes positivas nunca ocorrer o valor 0 na gerao
da seqncia.
Como j salientamos o gerador padro mnimo de nmeros aleatrios possui duaslimitaes bsicas, quais sejam, seqncia curta e correlao serial. Assim, como
existem mtodos para eliminar a correlao serial e que aumentam o perodo da
seqncia, recomendamos que sejam adotados. Claro que a funo apresentada teve
por objetivo ilustrar como podemos programar nossas prprias funes para gerar-
mos nmeros aleatrios uniformes. O R, no entanto, possui seu prprio gerador de
nmeros uniformes, que veremos na seqncia. Um dos melhores e mais interessantes
geradores de nmeros aleatrios o Mersenne Twister(MT). Mersenne Twister um
gerador de nmeros pseudo-aleatrios desenvolvido por Makoto Matsumoto e Takuji
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
35/108
2.2 Nmeros Aleatrios Uniformes no R 25
Nishimura nos anos de 1996 e 1997 [8]. MT possui os seguintes mritos segundo seusdesenvolvedores:
1. foi desenvolvido para eliminar as falhas dos diferentes geradores existentes;
2. possui a vantagem de apresentar o maior perodo e maior ordem de eqi-
distribuio do que de qualquer outro mtodo implementado. Ele fornece um
perodo que da ordem de 219.9371 4, 3154106001, e uma equidistribuio623-dimensional;
3. um dos mais rpido geradores existentes, embora complexo;
4. faz uso de forma muito eficiente da memria.
Existem muitas verses implementadas deste algoritmo, inclusive em Fortran e
C e que esto disponveis na internet. Como o R nos possibilita incorporar funes
escritas nestas linguagem, podemos utilizar este algoritmo. Felizmente, o R j possui
este algoritmo implementado, sendo inclusive usado como default. Por se tratar de
um tpico mais avanado, que vai alm do que pretendemos apresentar nestas notas
de aulas, no descreveremos este tipo de procedimento para incorporaes de funes
escritas em outras linguagens.
2.2 Nmeros Aleatrios Uniformes no R
No SAS o comando usado para gerarmos nmeros uniformes aleatrios Ra-
nuni(semente). Neste caso devemos usar o argumento semente para especificar
uma seqncia reproduzvel de nmeros aleatrios, sendo que seu valor deve ser um
inteiro. Se o valor 0 for especificado como argumento, o programa escolher auto-
maticamente um valor para semente que depende da hora e da data do sistema. Noprograma R podemos gerar nmeros aleatrios uniformes contnuos utilizando uma
funo pr-programada. Os nmeros aleatrios uniformes so gerados pelo comando
runif(n, min, max), em que n o tamanho da seqncia, min e max so ar-
gumentos que delimitam o valor mnimo e mximo da seqncia a ser gerada. O
controle da semente para se gerar uma seqncia reproduzvel de nmeros unifor-
mes dada pelo comando set.seed(semente), onde o argumento semente deve ser
um nmero inteiro. O R automaticamente determina a cada chamada uma nova
semente. Conseguimos gerar diferentes seqncias em cada chamada do comando
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
36/108
26 Gerao de Variveis Uniformes
runif(n, min, max), sem nos preocuparmos com a semente aleatria. Devemosreiterar que o programa R utiliza por defaulto algoritmo Mersenne Twister.
No programa apresentado a seguir ilustramos como podemos gerar n nmeros
aleatrios uniformes entre 0 e 1 utilizando a funo runifdo R. O programa resultante
compacto, simples e eficiente.
# programa R demonstrando o uso de gerao de n nmeros aleatrios uniformes
# por meio do comando runif
n
8/7/2019 estat stica computacional usando R
37/108
2.3 Exerccios 27
tempo1.seg
8/7/2019 estat stica computacional usando R
38/108
28 Gerao de Variveis Uniformes
em relao aos novos multiplicador q e resto r da fatorao de m?
2.3.4 Comparar a velocidade de processamento das funes apresentadas (runife
rna0) nesse captulo para gerar 10.000.000 de nmeros aleatrios uniformes
entre 0 e 1. Como voc poderia implementar um teste estatstico simples para
avaliar a aleatoreidade da seqncia de nmeros uniformes gerados por esses
algoritmos? Implementar sua idia.
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
39/108
8/7/2019 estat stica computacional usando R
40/108
30 Gerao de Variveis No-Uniformes
probabilidade e a sua inversa analiticamente. Para os modelos mais complexos, em-bora o mtodo determinado pela lei fundamental de transformao de probabilidades
seja adequado, apresentaremos apenas mtodos alternativos, uma vez que este, em
geral, pouco eficiente em relao ao tempo gasto para gerarmos cada varivel ale-
atria. Isso se deve ao fato de termos que obter a funo inversa numericamente da
funo de distribuio de probabilidade dos modelos probabilsticos mais complexos.
3.2 Mtodos Gerais para Gerar Variveis Aleatrias
Podemos obter variveis aleatrias de qualquer distribuio de probabilidade a
partir de nmeros aleatrios uniformes. Para isso um importante teorema pode ser
utilizado: o teorema fundamental da transformao de probabilidades.
Teorema 3.1 (Teorema fundamental da transformao de probabilidades). Sejam
Uuma varivel uniformeU(0, 1) eXuma varivel aleatria com densidadefe
funo de distribuio Fcontnua e invertvel, ento X= F1(U) possui densidade
f. Sendo F1 a funo inversa da funo de distribuio F.
Demonstrao: Seja Xuma varivel aleatria com funo de distribuio Fe
funo de densidade f. Se u = F(x), ento du/dx = F(x) = f(x) e, portanto,
dx/du = 1/f(x). Assim, a varivel aleatria U= F(X) tem densidade g dada por:
g(u) = f(x)
dxdu = f(x)f(x) = 1, 0 < u < 1
e g(u) = 0 para outros valores de u. Em outras palavras a varivel aleatria U=
F(X) distribui-se uniformemente em (0, 1), uma vez que F uma funo montona
crescente e contnua, com funo inversa F1. Resolvendo para X, temos que:
X= F1(U). Logo,
G(u) = P(U u) = P[F(X) u] = P[X F1(u)] = F[F1(u)] = u,
e conseqentemente, a funo de densidade de U g(u) = G(u) = 1. Isto estabelece
o resultado que almejamos de outra forma. Assim, a prova fica completa.
Para variveis aleatrias discretas, devemos modificar o teorema para podermos
contemplar funes de distribuies Fem escada, como so as funes de distribuio
de probabilidades associadas a essas variveis aleatrias.
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
41/108
3.2 Mtodos Gerais para Gerar Variveis Aleatrias 31
Na Figura 3.1 representamos como podemos gerar uma varivel aleatria Xcomdensidade fe funo de distribuio F. Assim, basta gerarmos um nmero uniforme
u0 e invertermos a funo de distribuio Fneste ponto. Computacionalmente a di-
ficuldade obtermos analiticamente uma expresso para a funo F1 para muitos
modelos probabilsticos. Em geral, essas expresses no existem e mtodos numricos
so requeridos para inverter a funo de distribuio. Neste captulo vamos apresen-
tar este mtodo para a distribuio exponencial e nos prximos captulos estudaremos
os mtodos numricos de obteno das funes de distribuies de inmeros modelos
probabilsticos.
-2.4 -1.2 0.0 1.2 2.4
0.2
0.4
0.6
0.8
1.0
x
u0
x0
u=F(x)
Figura 3.1: Ilustrao do teorema fundamental da transformao de probabilidades
para gerar uma varivel aleatria Xcom densidade f(x) = F(x). Apartir de um nmero aleatrio uniforme u0 a funo de distribuio
invertida neste ponto para se obter x0, com densidade f(x).
Um outro mtodo bastante geral que utilizaremos denominado de mtodo da
amostragem por rejeio. Esse mtodo tem um forte apelo geomtrico. Procura-
remos, a princpio, descrever esse mtodo de uma forma bastante geral. Posterior-
mente, aplicaremos este mtodo para gerarmos variveis aleatrias de alguns modelos
probabilstico. A grande vantagem deste mtodo contempla o fato de no precisar-
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
42/108
32 Gerao de Variveis No-Uniformes
mos obter a funo de distribuio de probabilidade e nem a sua inversa. Estasestratgias s podem ser aplicadas em muitos dos modelos probabilsticos existentes,
se utilizarmos mtodos numricos iterativos. Seja f(x) a densidade para a qual que-
remos gerar uma amostra aleatria. A rea sob a curva para um intervalo qualquer
de x corresponde probabilidade de gerar um valor x nesse intervalo. Se pudssemos
gerar um ponto em duas dimenses, digamos (X, Y), com distribuio uniforme sob
a rea, ento a coordenada Xteria a distribuio desejada.
Para realizarmos de uma forma eficiente a gerao de variveis aleatrias com
densidade f(x), evitando as complicaes numricas mencionadas anteriormente,
poderamos definir uma funo qualquer g(x). Essa funo tem que ter algumas pro-
priedades especiais para sua especificao. Deve possuir rea finita e ter para todos
os valores x densidade g(x) superior a f(x). Essa funo denominada de funo
de comparao. Outra caracterstica importante que g(x) deve ter possuir funo
de distribuio G(x) analiticamente computvel e invertvel, ou seja, x = G1(u).
Como a funo g(x) no necessariamente uma densidade, vamos denominar a rea
sob essa curva no intervalo para x de interesse por A = g(x)dx. Como G
1
conhecida, podemos gerar pontos uniformes (x, y) que pertencem rea sob a curva
g(x) facilmente. Para isso basta gerarmos um valor de uma varivel aleatria uni-forme u1 entre 0 e A e aplicarmos o teorema (3.1). Assim, obtemos o primeiro valor
do ponto (x0, y0) por x0 = G1(u1). Para gerarmos a segunda coordenada do ponto
no podemos gerar um valor de uma varivel aleatria uniforme no intervalo de 0
a A, sob pena de gerarmos um ponto que no est sob a curva g(x). Assim, calcu-
lamos o valor de g no ponto x0 por g(x0). Geramos y0 = u2, sendo u2 o valor de
uma varivel aleatria uniforme entre 0 e g(x0). Assim, obtemos um ponto (x0, y0)
uniforme sob a curva g(x). A dificuldade deste mtodo justamente estabelecer essa
funo g(x) com as propriedades exigidas.Vamos agora traar as curvas correspondentes a g(x) e f(x) no mesmo grfico.
Se o ponto uniforme (x0, y0) est na rea sob a curva f(x), ou seja se y0 f(x0),ento aceitamos x0 como um valor vlido de f(x); se por outro lado o ponto estiver
na regio entre as densidades f(x) e g(x), ou seja se f(x0) < y0 g(x0), entorejeitamos x0. Uma forma alternativa de apresentarmos esse critrio tomarmos y0
de uma distribuio U(0, 1) e aceitarmos ou rejeitarmos x0 se y0 f(x0)/g(x0) ou sey0 > f(x0)/g(x0), respectivamente. Ilustramos esse mtodo na Figura (3.2), sendo
que a A representa a rea total sob a curva g(x).
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
43/108
3.2 Mtodos Gerais para Gerar Variveis Aleatrias 33
0
Rejeitar x0
g(x0)
f(x)
A
x0
g(x)
Aceitar x0
G(x)
u1
0
u2
Figura 3.2: Mtodo da rejeio para gerar um valor x0 da varivel aleatria Xcom
densidade f(x) que menor do que g(x) para todo x.
Vamos ilustrar o primeiro mtodo e salientar que o segundo mtodo o que
ocorre na maioria dos casos de gerao de variveis aleatrias. A exponencial uma
distribuio de probabilidade em que facilmente podemos aplicar o teorema 3.1 para
gerarmos amostras aleatrias. Assim, optamos por iniciar o processo de gerao
de nmeros aleatrios nesta distribuio, uma vez que facilmente podemos obter a
funo de distribuio e a sua inversa. Seja Xuma varivel aleatria cuja densidade
apresentamos por:
f(x) = ex (3.2.1)
em que > 0 o parmetro da distribuio exponencial e x > 0.
A funo de distribuio exponencial dada por:
F(x) = x
0
etdt
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
44/108
34 Gerao de Variveis No-Uniformes
F(x) = 1 ex. (3.2.2)
E a funo de distribuio inversa x = F1(u) dada por:
x = F1(u) = ln(1 u)
(3.2.3)
em que u um nmero uniforme (0, 1).
Devido distribuio uniforme ser simtrica, podemos substituir 1u na equao(3.2.3) por u. Assim, para gerarmos uma varivel exponencial X, a partir de umavarivel aleatria uniforme, utilizamos o teorema 3.1 por intermdio da equao:
x = ln(u)
(3.2.4)
O algoritmo R para gerarmos variveis aleatrias exponenciais dado por:
# programa R demonstrando a gerao de n realizaes de variveis aleatrias exponenciais
# com parmetro lamb, utilizamos o algoritmo runifpara
# gerarmos nmeros aleatrios uniformes
rexpon = function(n,lamb)
{
u = runif(n,0,1) # gera o vetor u (U(0,1))
x = -log(u)/lamb # gera o vetor x com distrib. exp.
x # retorna o vetor x
}
Podemos utilizar a funo pr-existente do R para realizarmos a mesma tarefa
denominada rexp. Simplesmente digitamos rexp(n,lamb) e teremos uma amostra
aleatria de tamanho n de uma exponencial com parmetro = lamb. O R faz com
que a estatstica computacional seja ainda menos penosa e portanto acessvel para a
maioria dos pesquisadores.
Um mtodo muito utilizado em matemtica, fsica ou estatstica para gerar-
mos dados de uma densidade para a qual difcil obter amostras diretamente
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
45/108
3.2 Mtodos Gerais para Gerar Variveis Aleatrias 35
o Metropolis-Hastings. Este algoritmo um caso particular do mtodo da rejeio.Na inferncia bayesiana possvel utilizar este mtodo na simulao Monte Carlo
em cadeias de Markovpara aproximar distribuies, gerar o histograma, ou calcular
integrais para obter, por exemplo, o valor esperado. Este algoritmo recebeu este
nome em referncia a Nicholas Metropolis e W.K. Hastings que apresentaram este
algoritmo para uma situao particular, no primeiro caso, e para uma situao geral,
no segundo.
Para gerarmos dados de uma densidade f(x), precisamos apenas obter o valor
da densidade no ponto x. Ao aplicarmos o algoritmo, iremos gerar uma cadeia de
Markovem que a realizao da varivel aleatria no estgio t + 1, (xt+1), depende
apenas da realizao no estgio prvio t (xt). O algoritmo usa uma funo auxiliar,
denominada funo candidata, q(x; xt), que depende do estado corrente xt, para
gerar o novo valor x, candidato a ser o valor do prximo estgio xt+1. Assim, se o
valor x poder ser aceito ou rejeitado de acordo com o seguinte critrio:
u < min
1,
f(x)q(xt; x)f(xt)q(x; xt)
ento, xt+1 = x
u min
1,f(x)q(xt; x)f(xt)q(x; xt)
ento, xt+1 = xt
(3.2.5)
A funo de densidade candidata q(x; xt) deve ser escolhida a partir de algumas
caractersticas especficas, como possuir o mesmo domnio da distribuio alvo, em-
bora no haja necessidade de ser um envelope, q(x) > f(x), para todos os valores
da varivel aleatria, alm de possuir funo de distribuio e inversa da funo de
distribuio conhecidas ou algum mtodo simples de gerar observaes. Assim, a
funo candidata, para fins de ilustrao, poderia ser a distribuio normal centrada
no ponto xt e com varincia 2, ou seja,
q(x; xt) N(xt, 2),
que neste caso representa o algoritmo denominado passeio aleatrio.
Esta funo candidata nos permitiria gerar realizaes da varivel aleatria em
torno do estado atual xt com varincia 2. natural admitirmos que este processo
possa ser generalizado para dimenses maiores do que 1. Na sua forma original,
o algoritmo Metropolis requeria que a funo candidata fosse simtrica, ou seja,
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
46/108
36 Gerao de Variveis No-Uniformes
q(x; xt) = q(xt; x), mas, a partir do trabalho de Hastings, esta restrio foi elimi-nada. Alm do mais, permitido que a funo q(x; xt) no dependa de xt, o que
denominado de algoritmo de cadeias de Markovindependentes para o Metropolis-
Hastings, que difere do exemplo anterior, onde se ilustrou o algoritmo passeio aleat-
rio. Este algoritmo muito eficiente se a escolha da funo candidata for adequada,
mas pode possuir fraco desempenho se a escolha for inadequada, o que requer algum
tipo de conhecimento da f(x). Recomenda-se que a taxa de aceitao esteja em torno
de 60%. Se o seu valor for muito alto, a amostra caminhar lentamente em torno do
espao e convergir lentamente para f(x); se por outro lado, a aceitao for muito
baixa, a funo candidata est gerando valores em uma regio de densidade muito
pequena. Na Figura 3.3 ilustramos o algoritmo Metropolis-Hastings, para um caso
particular do passeio aleatrio, onde a funo de transio inicialmente est centrada
em x1 e, no passo seguinte, est centrada em x2.
f(x)
q(x; x1) q(x; x2)
x1 x2 x
Figura 3.3: Ilustrao grfica do algoritmo Metropolis-Hastings, apresentando a fun-
o de transio q(x; xt) e a transio de x1 para x2 por meio do algo-
ritmo de passeio aleatrio.
No exemplo a seguir ilustramos a gerao de realizaes de variveis normais com
mdia e varincia 2 utilizando o algoritmo Metropolis-Hastings. Denominamos
o algoritmo de MH_Norme utilizamos a funo auxiliar rtdfpara gerar realizaes
de variveis t da distribuio t com mdia media, parmetro de disperso sigma2
e graus de liberdade df. Da mesma forma utilizamos a funo dtdfpara calcular-
mos a densidade da distribuio t, com os parmetros recm definidos. A funo
candidata escolhida foi a t e, importante que se enfatize que utilizamos inclusive
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
47/108
3.2 Mtodos Gerais para Gerar Variveis Aleatrias 37
recursos redundantes, embora no entraremos neste mrito, uma vez que o objetivo ilustrarmos o uso do algoritmo Metropolis-Hastings. Devemos tambm enfatizar
que o R capaz de gerar amostras aleatrias da normal diretamente por algoritmos
mais eficiente que este. Novamente reiteramos, que escolhemos o modelo normal pela
familiaridade que possumos com este modelo e com seus resultados e para que hou-
vesse uma maior facilidade de ilustrarmos as caractersticas do algoritmo. Neste caso
iniciamos com o valor inicial igual ao parmetro e o valor candidato da segunda
realizao geramos de uma t com mdia igual ao valor anterior (inicial no segundo
passo) e parmetro de disperso igual a varincia da normal 2. Escolhemos uma t
com = 3 graus de liberdade como funo candidata. Em geral, como j dissemos, o
ponto crtico na utilizao deste algoritmo justamente a determinao apropriada
da funo candidata.
# retorna uma v.a. de uma t univariada com df graus de liberdade, e
# parmetros media e sigma2
rtdf = function (n, media=0, sigma2 = 1, df = 1)
{
return( (rmvnorm(n, mean=c(0),sigma=as.matrix(sigma2,1,1))/sqrt(rchisq(n, df)/df))
+ media)}
# retorna a densidade de uma t univariada com df graus de liberdade, e par media e sigma2
dtdf = function (x, media=0, sigma2 = 1, df = 1)
{
dt = gamma((df+1)/2)/((pi*df)**0.5*gamma(df)*sigma2**0.5)*(1+
(x-media)**2/(df*sigma2))**(-(df+1)/2)
}
# Funo para exemplificar o uso do Metropolis-Hastings
# Este exemplo pretende mostrar a gerao de normais (mu=0, sig=1) com
# uso de uma candidata t(nu=3).
# Vamos utilizar rtdf(n,media,sigma2,df) para gerar dados da t.
MH_Norm = function(n,mu=0, sig=1)
{
nu = 3
x0 = mu # valor inicial da cadeia
x = x0
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
48/108
38 Gerao de Variveis No-Uniformes
for (i in 2:n)
{
y0 = rtdf(1,x0,sig**2,nu) # valor candidato com random walk
qy0 = dtdf(y0,x0,nu*sig**2/(nu-2),nu) # densidade da t no ponto y0
if (i>2) qx0 = dtdf(x0,x[i-2],nu*sig**2/(nu-2),nu) # densidade da t no ponto x0
qx0 = dtdf(x0,x[1],nu*sig**2/(nu-2),nu) # densidade da t no ponto x0
px0 = dnorm(x0,mu,sig) # densidade da normal no ponto x0
py0 = dnorm(y0,mu,sig) # densidade da normal no ponto y0
axy = min(1,qx0*py0/(px0*qy0))
u = runif(1) # nmero uniforme para verificar se aceita ou descarta
if (u
8/7/2019 estat stica computacional usando R
49/108
3.3 Variveis Aleatrias de Algumas Distribuies Importantes 39
nfase a outros processos. Para utilizarmos o mesmo mtodo anterior teramos queimplementar uma funo parecida com rexpon, digamos rnormal. No lugar do
comando x = -log(u)/lamb deveramos escrever x= invnorm(u)* + , sendo
que invnorm(u) a funo de distribuio normal padro inversa. A distribuio
normal padro dentro da famlia normal, definida pelos seus parmetros e 2,
aquela com mdia nula e varincia unitria. Esta densidade ser referenciada por
N(0, 1). Essa deve ser uma funo externa escrita pelo usurio. Os argumentos e
da funo so a mdia e o desvio padro da distribuio normal que pretendemos
gerar. A funo de densidade da normal :
f(x) =1
22e
(x)2
22 (3.3.1)
Nenhuma outra funo utilizando o teorema 3.1 ser novamente apresentada, uma
vez que podemos facilmente adaptar as funes rexpon se tivermos um eficiente
algoritmo de inverso da funo de distribuio do modelo probabilstico alvo. A
dificuldade deste mtodo a necessidade de uma enorme quantidade de clculo para
a maioria das densidades. Isso pode tornar ineficiente o algoritmo, pois o tempo deprocessamento elevado.
Podemos ainda aproveitar a relao entre algumas funes de distribuies para
gerarmos variveis aleatrias de outras distribuies. Por exemplo se X normal
com densidade (3.3.1), N(, 2), podemos gerar Y= eX . Sabemos que fazendo tal
transformao Yter distribuio log-normal, cuja densidade com parmetros de
locao () e escala () :
f(y) =1
y
2e 12
ln(y)
2y > 0. (3.3.2)
Um importante mtodo usado para gerar dados da distribuio normal o de
Box-Mller, que baseado na generalizao do mtodo da transformao de pro-
babilidades para mais de uma dimenso. Para apresentarmos esse mtodo, vamos
considerar p variveis aleatrias X1, X2, . . . , X p com funo de densidade conjunta
f(x1, x2, . . . , xp) e p variveis Y1, Y2, . . . , Y p, funes de todos os Xs, ento a funo
de densidade conjunta dos Ys :
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
50/108
40 Gerao de Variveis No-Uniformes
f(y1, . . . , yp)dy1 . . . d yp = f(x1, . . . , xp)
x1y1
. . . x1yp...
. . ....
xpy1
. . . xpyp
dx1 . . . d xp (3.3.3)
em que J= |()/()| o Jacobiano da transformao dos Xs em relao aos Ys.Vamos considerar a transformao (3.3.3) para gerar dados Ynormais com densi-
dade dadas por (3.3.1), devidamente adaptada para acomodar Ye no X. Para apli-
carmos a transformao de Box-Mller, vamos considerar duas variveis aleatrias
uniformes entre 0 e 1, representados por X1 e X2 e duas funes delas, representadaspor Y1 e Y2 e dadas por:
y1 =
2 ln x1 cos(2x2)(3.3.4)
y2 =
2 ln x1 sin (2x2)
Ao explicitarmos X1 e X2 em (3.3.4) obtemos alternativamente:
x1 = e 1
2(y21+y
22)
(3.3.5)
x2 =1
2arctan
y2y1
Sabendo que a seguinte derivada dk arctan(g)/dx dada por k(dg/dx)/(1 + g2),
em que g uma funo de X, ento o Jacobiano da transformao :
x1y1 x1y2x2y1
x2y2
=
y1e0,5(y21+y
22)
y2e0,5(y21+y
22)
y22y21
1+
y22y21
12y1
1+
y22y21
= 12
e0,5(y21+y
22)
(3.3.6)
Assim, a funo de densidade conjunta de Y1 e Y2 dada por f(x1, x2)|J|, sendoportanto:
f(y1, y2) =
12
ey212
12
ey222
. (3.3.7)
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
51/108
3.3 Variveis Aleatrias de Algumas Distribuies Importantes 41
Desde que a densidade conjunta de Y1 e Y2 o produto de duas normais in-dependentes, podemos afirmar que as duas variveis geradas so normais padro
independentes, como pode ser visto em Johnson e Wichern (1998)[5].
Assim, podemos usar esse resultado para gerarmos variveis aleatrias normais.
A dificuldade, no entanto, apenas computacional. A utilizao de funes trigo-
nomtricas como seno e co-seno pode limitar a performance do algoritmo gerado
tornando-o lento. Um truque apresentado por Press et al. (1992)[12] bastante inte-
ressante para evitarmos diretamente o uso de funes trigonomtricas. Esse truque
representa uma melhoria do algoritmo de Box-Mller e devido a Marsaglia e Bray
(1964)[7].
Ao invs de considerarmos os valores das variveis aleatrias uniformes x1 e x2 de
um quadrado de lado igual a 1 (quadrado unitrio), tomarmos u1 e u2 como coorde-
nadas de um ponto aleatrio em um crculo unitrio (de raio igual a 1). A soma de
seus quadrados R2 = u21+u22 um valor de uma varivel aleatria uniforme que pode
ser usada como x1. J o ngulo que o ponto (u1, u2) determina em relao ao eixo
u1 pode ser usado como um ngulo aleatrio dado por = 2x2. Podemos apontar
que a vantagem da no utilizao direta da expresso (3.3.4) refere-se ao fato do
co-seno e do seno poderem ser obtidos alternativamente por: cos(2x2) = u1/R2e sin (2x2) = u2/
R2. Evitamos assim as chamadas de funes trigonomtricas.
Na Figura 3.4 ilustramos os conceitos apresentados e denominamos o ngulo que o
ponto (u1, u2) determina em relao ao eixo u1 por .
Agora podemos apresentar o funo BoxMullerpara gerar dados de uma normal
utilizando o algoritmo de Box-Mller. Essa funo utiliza a funo Polarpara gerar
dois valores aleatrios, de variveis aleatrias independentes normais padro Y1 e Y2.
A funo BoxMuller:
# funo BoxMullerretorna uma amostra de tamanho n de
# uma distribuio normal com mdia e varincia 2
# utilizando o mtodo de Box-Mller modificado (polar)
BoxMuller = function(n,mu=0,sigma=1)
{
# Polar a funo que retorna dois nmeros normais
# padro em cada chamada do procedimento
Polar = function (){ #funo sem argumento
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
52/108
42 Gerao de Variveis No-Uniformes
u1
u2
(u1,u
2)
r = 1
Figura 3.4: Crculo unitrio mostrando um ponto aleatrio (u1, u2) com R2 = u21+u22
representando x1 e o ngulo que o ponto (u1, u2) determina em relao
ao eixo u1.
repeat
{
u = runif(2,-1,1) # gera dois nmeros uniformes U(-1,1)
r2 =u%*%u # toma o seu quadrado
if ((r2>0) & (r2
8/7/2019 estat stica computacional usando R
53/108
3.3 Variveis Aleatrias de Algumas Distribuies Importantes 43
} else { # n mpar
k = n %/% 2
if (k==0) {
x=Polar()[1]
} else {
for (ki in 1:k) {
if (ki==1) x=c(Polar()) else x=c(x,Polar())
} # for
x=c(x,Polar()[1])
} #else interno
} #else n par
x=x*sigma+mu
} # fim de BoxMuller
# Exemplos de utilizao
x = BoxMuller(12)
x
y =BoxMuller(12,100,10)
y
Algumas aproximaes so apresentadas em Atkinson e Pearce (1976) [1] e se-
ro apenas descritas na seqncia. Uma das aproximaes faz uso da densidade
Tukey-lambda e aproxima a normal igualando os quatro primeiros momentos. Esse
algoritmo, alm de ser uma aproximao, tem a desvantagem de utilizar a exponen-
ciao que uma operao lenta. Utilizando essa aproximao podemos obter uma
varivel normal Xa partir de uma varivel uniforme U U(0, 1) por:
X= [U0,135 (1 U)0,135]/0, 1975.
Outro mtodo baseado na soma de 12 ou mais variveis uniformes (Ui U(0, 1))independentes. Assim, a varivel X=
12i Ui6 tem distribuio aproximadamente
normal com mdia 0 e varincia 1. Isso ocorre em decorrncia do teorema do limite
central e em razo de cada uma das 12 variveis uniformes possurem mdia 1/2 e
varincia 1/12.
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
54/108
44 Gerao de Variveis No-Uniformes
Estas duas aproximaes tem valor apenas didtico e no devem ser recomenda-das como uma forma de gerar variveis normais. Muitas vezes esse fato ignorado
em problemas que requerem elevada preciso e confiabilidade dos resultados obti-
dos. Quando isso acontece concluses incorretas ou no mnimo imprecisas podem ser
obtidas.
Vamos ilustrar a partir deste instante a gerao de variveis aleatrias discre-
tas. Escolhemos a distribuio binomial para exemplificar. A distribuio binomial
de forma surpreendente extremamente importante nas aplicaes da estatstica.
Esta distribuio aparece nas mais variadas situaes reais e tericas. Por exem-
plo, o teste no-paramtrico do sinal utiliza a distribuio binomial, a ocorrncia
de animais doentes em uma amostra de tamanho n pode ser muitas vezes mode-
lada pela distribuio binomial. Inmeros outros exemplos poderiam ser citados. A
distribuio binomial a primeira distribuio discreta de probabilidade, entre as
distribuies j estudadas. A varivel aleatria Xcom distribuio de probabilidade
binomial tem a seguinte funo de probabilidade:
P(X= x) =n
x
px
(1 p)nx
, x = 0, 1, , n e n 1, (3.3.8)
em que os parmetros n e p referem-se, respectivamente, ao tamanho da amostra e a
probabilidade de sucesso de se obter um evento favorvel em uma amostragem de 1
nico elemento ao acaso da populao. O termonx
o coeficiente binomial definido
por:
n
x =n!
x!(n
x)!
.
A probabilidade de sucesso p, em amostras de tamanho n da populao, ou seja,
em n ensaios de Bernoulli, deve permanecer constante e os sucessivos ensaios devem
ser independentes. O parmetro n em geral determinado pelo pesquisador e deve
ser um inteiro maior ou igual a 1. Se n = 1, ento a distribuio binomial se
especializa na distribuio Bernoulli. Assim, a distribuio binomial a repetio
de n ensaios Bernoulli independentes e com probabilidade de sucesso constante. Os
seguintes teoremas e lemas so importantes, para a definio de alguns mtodos que
apareceram na seqncia. Estes lemas sero apresentados sem as provas.
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
55/108
3.3 Variveis Aleatrias de Algumas Distribuies Importantes 45
Teorema 3.2 (Gnese). SejaXo nmero de sucessos em uma seqncia denensaios Bernoulli com probabilidade de sucesso p, ou seja,
X=ni=1
I(Ui p)
em queU1, U2, , Un so variveis uniformes(0, 1) i.i.d. eI() uma funoindicadora. Ento, Xtem distribuio binomial(n, p).
Lema 3.1 (Soma de binomiais). SeX1, X2, , Xk so variveis aleatrias binomi-ais independentes com(n1, p),
, (nk, p), entoki=1 Xi tem distribuio binomial,
com parmetros(k
i=1 ni, p).
Lema 3.2 (Tempo de espera - propriedade 1). SejamG1, G2, variveis aleatriasgeomtricas independentes e, X, o menor inteiro tal que
X+1i=1
Gi > n.
Assim, Xtem distribuio binomial(n, p).
As variveis geomtricas citadas no lema 3.2 so definidas a seguir. Se G tem
distribuio geomtrica com probabilidade de sucesso constante p (0, 1), ento, afuno de probabilidade :
P(G = g) = p(1 p)g1, g = 1, 2 (3.3.9)
A geomtrica a distribuio do tempo de espera at a ocorrncia do primeiro
sucesso no g-simo evento, numa seqncia de ensaios Bernoulli independentes, in-
cluindo o primeiro sucesso. Assim, supe-se que venham a ocorrer g 1 fracassos,
cada um com probabilidade de ocorrncia constante 1 p, antes da ocorrncia deum sucesso no g-simo ensaio, com probabilidade p. Finalmente, o segundo lema do
tempo de espera pode ser anunciado por:
Lema 3.3 (Tempo de espera - propriedade 2). SejamE1, E2, variveis aleatriasexponenciais i.i.d., eXo menor inteiro tal que
X+1i=1
Ein i + 1 > ln(1 p).
Logo, Xtem distribuio binomial(n, p).
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
56/108
46 Gerao de Variveis No-Uniformes
As propriedades especiais da distribuio binomial, descritas no teorema e noslemas, formam a base para dois algoritmos binomiais. Estes dois algoritmos so
baseados na propriedade de que uma varivel aleatria binomial soma de n
variveis Bernoulli obtidas em ensaios independentes e com probabilidade de sucesso
constante p. O algoritmo binomial mais bsico baseia-se na gerao de n variveis
independentes U(0, 1) e no cmputo do total das que so menores ou iguais a p. Este
algoritmo denominado por Kachitvichyanukul e Schmeiser (1988) [6] de BU dado
por:
1. Faa x = 0 e k = 0
2. Gere u de uma U(0, 1) e faa k = k + 1
3. Se u p, ento faa x = x + 1
4. Se k < n v para o passo 2
5. Retorne x de uma binomial (n, p)
O algoritmo BU tem velocidade proporcional a n e depende da velocidade dogerador de nmeros aleatrios, mas possui a vantagem de no necessitar de variveis
de setup. O segundo algoritmo atribudo a Devroy 1980 [3] denominado de BG e
baseado no lema 3.2. O algoritmo BG pode ser descrito por:
1. Faa y = 0, x = 0 e c = ln(1 p)
2. Se c=0 v para o passo 6
3. Gere u de uma U(0, 1)
4. y = y + ln(u)/c + 1, em que denotam a parte inteira do argumento
5. Se y n, faa x = x + 1 e v para o passo 3
6. Retorne x de uma binomial (n, p)
O algoritmo utilizado no passo 4 do algoritmo BG baseado em truncar uma
varivel exponencial para gerar uma varivel geomtrica, conforme descrio feita
por Devroy (1986) [4]. O tempo de execuo desse algoritmo proporcional a np, o
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
57/108
3.3 Variveis Aleatrias de Algumas Distribuies Importantes 47
que representa uma considervel melhoria da performance. Assim, p > 0, 5, pode-se melhorar o tempo de execuo de BG explorando a propriedade de que se X
binomial com parmetro n e p, ento n X binomial com parmetros n e 1 p.Especificamente o que devemos fazer substituir p pelo min(p, 1 p) e retornar xse p 12 ou retornar n x, caso contrrio. A velocidade, ento, proporcional a nvezes o valor min(p, 1 p). A desvantagem desse procedimento que so necessriasvrias chamadas do gerador de variveis aleatrias uniformes, at que um sucesso
seja obtido e o valor x seja retornado. Uma alternativa a esse problema pode ser
conseguida se utilizarmos um gerador baseado na inverso da funo de distribuio
binomial.
Como j havamos comentado em outras oportunidades o mtodo da inverso o
mtodo bsico para convertermos uma varivel uniforme Uem uma varivel aleatria
X, invertendo a funo de distribuio. Para uma varivel aleatria contnua, temos
o seguinte procedimento:
Gerar um nmero uniforme u
Retornar x = F1(u)
O procedimento anlogo para o caso discreto requer a busca do valor x, tal que:
F(x 1) =i
8/7/2019 estat stica computacional usando R
58/108
48 Gerao de Variveis No-Uniformes
2. Gere u de uma U(0, 1) e faa x = 0
3. Se u r, ento v para o passo 5
4. Faa u = u r, x = x + 1, r = (ax s)r e v para o passo 3
5. Se p 12 , ento retorne x de uma binomial (n, p), seno retorne n x de umabinomial (n, p)
A velocidade deste algoritmo proporcional a n vezes o valor min(p, 1 p). A
vantagem desse algoritmo que apenas uma varivel aleatria uniforme geradapara cada varivel binomial requerida. Um ponto importante o tempo consumido
para gerar qqn substancial e dois problemas potenciais podem ser destacados. O
primeiro a possibilidade de underflowno clculo de r = qqn, quando n muito
grande e, o segundo, a possibilidade do clculo recursivo de r ser uma fonte de
erros de arredondamento, que se acumulam e que se tornam srios na medida que
n aumenta (Kachitvichyanukul e Schmeiser, 1988 [6]). Devroy (1986) [4] menciona
que o algoritmo do tempo de espera BG baseado no lema 3.2 deve ser usado no lugar
de BINV para evitarmos esses fatos. Por outro lado, Kachitvichyanukul e Schmeiser
(1988) [6] mencionam que basta implementar o algoritmo em preciso dupla que
esses problemas so evitados.
# Exemplificao de algoritmos para gerar variveis aleatrias binomiais B(n, p)
# Os algoritmos BU, BG e BINV foram implementados
BU = function(n,p)
{
x=0;k=0
repeat
{
u = runif(1,0,1)
k = k +1
if (u
8/7/2019 estat stica computacional usando R
59/108
3.3 Variveis Aleatrias de Algumas Distribuies Importantes 49
} # function BU
BG = function(n,p)
{
if (p>0.5) pp=1-p else pp=p
y=0;x=0; c = log(1 - pp)
if (cf)
{
u = u - f
x = x + 1
Estatstica Computacional Ferreira, D.F.
8/7/2019 estat stica computacional usando R
60/108
50 Gerao de Variveis No-Uniformes
f = f * (g / x - r)
} # while
if (p>0.5) x=n-x
return(x)
} # function BINV
# Exemplo de utilizao da funo BINV
m=1000
x=BINV(3,0.5)
for (i in 2:m) x=c(x,BINV(3,0.5))
hist(x)
mean(x)
var(x)
Procedimentos de gerao de nmeros aleatrios poderiam ser apresentados para
muitas outras distribuies de probabilidades. Felizmente no R no temos este tipo
de preocupao, pois estas rotinas j existem e esto implementadas em linguagemno interpretada. Inclusive para os modelos considerados temos rotinas prontas em
R. Veremos uma boa parte delas na prxima seo.
3.4 Rotinas R para Gerao de Variveis Aleatrias
Nesta seo, veremos alguns dos principais comandos R para acessarmos os pro-
cessos de gerao de realizaes de variveis aleatrias de diferentes modelos pro-
babilsticos. Os modelos probabilsticos contemplados pelo R esto apresentados naTabela 3.1.
Se acrescentarmos os prefixos d para densidade, p para CDF(funo de dis-
tribuio de probabilidades), q para quantis e r para simulao (realizaes de
variveis aleatrias), ento poderemos utilizar as funes bsicas da Tabela 3.1 em
diferentes contextos. No caso particular deste captulo temos interesse na gerao
de realizaes de variveis aleatrias e, portanto, no comando rmodelo. O primeiro
argumento x para dmodelo, q para pmodelo, p para qmodelo and n for rmodelo
(exceto para rhyper e rwilcox, nos quais o primeiro argumento nn). Estas excees
Ferreira, D.F. Estatstica Computacional
8/7/2019 estat stica computacional usando R
61/108
3.4 Rotinas R para Gerao de Variveis Aleatrias 51
Tabela 3.1: Distribuies de probabilidades, nome R e parmetros dos principaismodelos probabilstico.
Distribuio Nome R Parmetros
beta beta shape1, shape2, ncp
binomial binom size, prob
Cauchy cauchy location, scale
qui-quadrado chisq df, ncp
exponencial exp rate
F f df1, df1, ncp
gama gamma shape, scale
geomtrica geom prob
hipergeomtri
Recommended