Você está na página 1de 16

Tecnicas Computacionais em Estatstica - Projeto 1

Thiago VedoVatto
18 de junho de 2013
Resumo
Neste trabalho implementa-se e estudam-se os geradores Congruencial e Fibonacci. Esses geradores s
ao usados para a construcao via Metodo de Monte Carlo da
tabela de distribuic
ao normal.

1
1.1

Introduc
ao
Gerador Congruencial

O gerador congruencial implementado gera uma sequencia de n


umeros pseudo-aleatorios
a` partir de uma semente x0 informada pelo usuario dada atraves da sequinte lei de recorrencia:
xn = (axn1 + c)mod(m)

(1)

O gerador deixa em aberto todos os parametros da equacao, mas atribui como valores
padrao:
a = 950706376
c = 0
m = 231 1
Para os efeitos desse trabalho o gerador congruencial foi ajustado conforme os valores
padroes dos parametros. O valor de x0 que corresponde a` semente do gerador sera tambem
um parametro da funcao e sera deixado a cargo do usuario o controle sobre o valor que a
semente deve assumir.
Para se gerar 10 valores pseudo-aleatorios atraves do gerador congruencial a partir da
semente x0 = 10 basta:
> s <- 10
> GeradorCongruencial(n=10,semente=s)
$sequencia.gerada
[1] 917129172 1290271678 1892380375 418010204
[7] 292177807 1550646805 1322288131 1514884016

468394860 2011906907

$sequencia.uniforme
[1] 0.4270716 0.6008296 0.8812083 0.1946512 0.2181134 0.9368672 0.1360559
[8] 0.7220762 0.6157384 0.7054228
1

1.2

Gerador Fibonacci

Para efeito de uma aprendizagem mais rica implementou-se tambem um modelo elementar
de gerador Fibonacci regido pela expressao de recorrencia:
xn = m(xni xnj )mod(m)

(2)

Sao deixados em aberto todos os parametros envolvidos para que o usuario possa
ajusta-los livremente. Nesse trabalho usou-se os valores padrao recomendados no proprio
algortmo:

i = 607
j = 273
m = 231
Nesse algortmo o usuario fornece uma semente x0 6= 0 e a partir dessa semente e
gerada uma sequencia de i valores pseudo-aleatorios atraves do gerador congruencial em
(1) ajustado com os valores padrao, essa sequencia e usada pelo gerador Fibonacci em (2)
para gerar os n valores requisitados pelo usuario.
Para se gerar 10 valores pseudo-aleatorios atraves do gerador Fibonacci a partir da
semente x0 = 10 basta:
> GeradorFibonacci(n=10,semente=s)
$sequencia.gerada
[1] 1851247587 418515232 1561740616 1460556881
[7] 1982208495 441658451 796130156 981068708

462303229

659066427

$sequencia.uniforme
[1] 0.8620543 0.1948863 0.7272421 0.6801248 0.2152767 0.3069017 0.9230378
[8] 0.2056632 0.3707270 0.4568457

1.3

Densidade da Normal Padr


ao

A funcao de densidade da normal padrao foi implementada na sua forma canonica:




1 2
1
x
para < x <
fX (x) = exp
2
2

(3)

A funcao retorna o valor da densidade para um dado valor de x informado pelo usuario.

1.4

M
etodo de Monte Carlo

Neste trabalho deseja-se calcular, pelo metodo de Monte Carlo, a integral:


Z z0
fX (x)dx
0

Para que esse procedimento seja possvel deve-se tomar y =

x
:
x0

(4)

z0

Z
fX (x)dx =

x0 fX (x0 y)dy

(5)

O Metodo de Monte Carlo garante que a expressao do lado direito de (5) sera equivalente a` E(h(U )) onde h(y) = x0 fX (x0 y).

Resultados

2.1

Qualidade dos Geradores

Para analisar a qualidade dos geradores implementados realizou-se tres testes:


1. Teste de alinhamento com os quantis teoricos da distribuicao uniforme qqplot;
2. Teste para subsequencias da sequencia gerada (sequencias dos ndices mpares e
pares);
3. Teste de Wilcoxon para verificar atraves de um teste de hipoteses se a distribuicao
gerada tem distribuicao uniforme.
Para efeitos de teste dos geradores produz-se uma amostra de tamanho 100000 utilizandose a semente x0 = 10 de modo que o leitor podera reproduzir esses resultados posteriormente. Para tanto assuma:
>
>

ensaios <- 10000


set.seed(seed = s)

Para os testes das subsequencias das sequencias geradas criemos os vetores dos ndides
pares e mpares:
>
>

pares <- seq(from = 2,to = ensaios,by = 2)


impares <- pares - 1

2.1.1

Gerador Congruencial

Os comandos a seguir criam uma sequencia SC de 10000 valores de uma distribuicao uniforme no intervalo (0, 1) atraves do algortmo congruencial e a partir dessa sequencia sao
criadas as sequencias sub1SC e sub2SC com os ndices pares e mpares, respectivamente,
da sequencia SC.
>
>
>

SC <- GeradorCongruencial(n=ensaios,semente = s)$sequencia.uniforme


sub1SC <- SC[pares]
sub2SC <- SC[impares]

Os boxplots da Figura 1 fornecem uma ideia do equilbrio entre os diferentes quantis


da sequencias geradas atraves do metodo congruencial:
Nos qqplots da Figura 2 pode-se apreciar o alinhamento da sequencia gerada com a
reta identidade.
Por fim o teste de Wilcox se as tres sequencias realmente se aproximam de uma distribuicao uniforme quando comparados com uma sequencia uniforme fornecida pelo R.
3

Congruencial

0.0

0.2

0.4

0.6

0.8

1.0

0.8

1.0

0.8

1.0

Congruencial Pares

0.0

0.2

0.4

0.6

Congruencial Impares

0.0

0.2

0.4

0.6

Figura 1: Boxplots - Metodo Congruencial


>
>

SR <- runif(n = ensaios ,min = 0,max = 1)


wilcox.test(SR,SC)
Wilcoxon rank sum test with continuity correction

data: SR and SC
W = 49735025, p-value = 0.5163
alternative hypothesis: true location shift is not equal to 0
>

wilcox.test(SR,sub1SC)
Wilcoxon rank sum test with continuity correction

data: SR and sub1SC


W = 24872547, p-value = 0.6102
alternative hypothesis: true location shift is not equal to 0
>

wilcox.test(SR,sub2SC)
Wilcoxon rank sum test with continuity correction

0.8
0.4
0.0

0.4

0.8

sequncia Gerada

Congruencial Pares

0.0

sequncia Gerada

Congruencial

2000

6000

10000

ndices

1000

3000

5000

ndices

0.8
0.4
0.0

sequncia Gerada

Congruencial Impares

1000

3000

5000

ndices

Figura 2: qqplots - Metodo Congruencial


data: SR and sub2SC
W = 24862478, p-value = 0.5823
alternative hypothesis: true location shift is not equal to 0
2.1.2

Gerador Fibonacci

Procedendo de modo analogo para a distribuicao Fibonacci obtem-se os resultados:


> SF <- GeradorFibonacci(n = ensaios,semente = s)$sequencia.uniforme
> sub1SF <- SF[pares]
> sub2SF <- SF[impares]
> wilcox.test(SR,SF)
Wilcoxon rank sum test with continuity correction
data: SR and SF
W = 50047125, p-value = 0.9081
alternative hypothesis: true location shift is not equal to 0
> wilcox.test(SR,sub1SF)
5

Fibonacci

0.0

0.2

0.4

0.6

0.8

1.0

0.8

1.0

0.8

1.0

Fibonacci Pares

0.0

0.2

0.4

0.6

Fibonacci Impares

0.0

0.2

0.4

0.6

Figura 3: boxplots - Metodo Fibonacci


Wilcoxon rank sum test with continuity correction
data: SR and sub1SF
W = 25068532, p-value = 0.784
alternative hypothesis: true location shift is not equal to 0
> wilcox.test(SR,sub2SF)
Wilcoxon rank sum test with continuity correction
data: SR and sub2SF
W = 24978593, p-value = 0.9318
alternative hypothesis: true location shift is not equal to 0

2.2
2.2.1

Tabela de Probabilidades Acumuladas da Normal


Usando o Gerador Congruencial

A matriz a` seguir relaciona as probabilidades da tabela normal calculadas atraves do metodo de monte carlo e utilizando-se o Gerador Congruencial implementado, os resultados
foram arredondados ate a quarta casa decimal:
6

0.8
0.0

0.4

0.4

0.8

sequncia Gerada

Fibonacci Pares

0.0

sequncia Gerada

Fibonacci

2000

6000

10000

1000

ndices

3000

5000

ndices

0.8
0.4
0.0

sequncia Gerada

Fibonacci Impares

1000

3000

5000

ndices

Figura 4: qqplots - Metodo Fibonacci


> Tabela(n = 10000,semente = s)$Tabela.Calculada

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1.1
1.2
1.3
1.4
1.5
1.6

0
0.0000
0.0398
0.0793
0.1179
0.1554
0.1914
0.2256
0.2578
0.2879
0.3156
0.3408
0.3637
0.3841
0.4022
0.4180
0.4318
0.4436

1
0.0040
0.0438
0.0832
0.1217
0.1591
0.1949
0.2289
0.2610
0.2907
0.3182
0.3432
0.3658
0.3860
0.4039
0.4195
0.4330
0.4446

2
0.0080
0.0478
0.0871
0.1255
0.1627
0.1984
0.2322
0.2640
0.2936
0.3208
0.3456
0.3680
0.3879
0.4055
0.4210
0.4343
0.4457

3
0.0120
0.0517
0.0909
0.1293
0.1664
0.2019
0.2355
0.2671
0.2964
0.3234
0.3479
0.3701
0.3898
0.4072
0.4224
0.4355
0.4467

4
0.0160
0.0557
0.0948
0.1330
0.1700
0.2053
0.2388
0.2701
0.2992
0.3260
0.3503
0.3721
0.3916
0.4088
0.4238
0.4367
0.4478
7

5
0.0199
0.0596
0.0987
0.1368
0.1736
0.2087
0.2420
0.2731
0.3020
0.3285
0.3526
0.3742
0.3934
0.4104
0.4252
0.4379
0.4488

6
0.0239
0.0636
0.1026
0.1405
0.1772
0.2122
0.2452
0.2761
0.3048
0.3310
0.3548
0.3762
0.3952
0.4120
0.4265
0.4391
0.4498

7
0.0279
0.0675
0.1064
0.1443
0.1808
0.2156
0.2484
0.2791
0.3075
0.3335
0.3571
0.3782
0.3970
0.4135
0.4279
0.4402
0.4507

8
0.0319
0.0714
0.1102
0.1480
0.1843
0.2189
0.2516
0.2820
0.3102
0.3360
0.3593
0.3802
0.3988
0.4150
0.4292
0.4414
0.4517

9
0.0359
0.0753
0.1141
0.1517
0.1879
0.2223
0.2547
0.2850
0.3129
0.3384
0.3615
0.3822
0.4005
0.4166
0.4305
0.4425
0.4526

1.7
1.8
1.9
2
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9

0.4536
0.4620
0.4689
0.4747
0.4793
0.4830
0.4860
0.4883
0.4900
0.4914
0.4924
0.4931
0.4936
0.4940
0.4942
0.4944
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944

0.4545
0.4627
0.4696
0.4752
0.4797
0.4833
0.4862
0.4885
0.4902
0.4915
0.4925
0.4932
0.4937
0.4940
0.4942
0.4944
0.4944
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4554
0.4635
0.4702
0.4757
0.4801
0.4837
0.4865
0.4887
0.4903
0.4916
0.4925
0.4932
0.4937
0.4940
0.4942
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4562
0.4642
0.4708
0.4762
0.4805
0.4840
0.4867
0.4888
0.4905
0.4917
0.4926
0.4933
0.4937
0.4941
0.4943
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4571
0.4649
0.4714
0.4766
0.4809
0.4843
0.4870
0.4890
0.4906
0.4918
0.4927
0.4933
0.4938
0.4941
0.4943
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4580
0.4656
0.4719
0.4771
0.4813
0.4846
0.4872
0.4892
0.4908
0.4919
0.4928
0.4934
0.4938
0.4941
0.4943
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4588
0.4663
0.4725
0.4776
0.4816
0.4849
0.4874
0.4894
0.4909
0.4920
0.4928
0.4934
0.4938
0.4941
0.4943
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4596
0.4670
0.4731
0.4780
0.4820
0.4852
0.4876
0.4896
0.4910
0.4921
0.4929
0.4935
0.4939
0.4942
0.4943
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4604
0.4676
0.4736
0.4784
0.4823
0.4854
0.4878
0.4897
0.4911
0.4922
0.4930
0.4935
0.4939
0.4942
0.4943
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

0.4612
0.4683
0.4741
0.4789
0.4827
0.4857
0.4881
0.4899
0.4913
0.4923
0.4930
0.4936
0.4939
0.4942
0.4943
0.4944
0.4945
0.4945
0.4945
0.4945
0.4944
0.4944
0.4944

Os desvios cometidos em relacao `a tabela interna do R podem ser vistos na matrix a`


seguir:
> Tabela(n = 10000,semente = s)$Tabela.Erro

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8

0
0.0000
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0003
0.0004
0.0005
0.0007
0.0008
0.0010
0.0012
0.0014
0.0016
0.0019
0.0021

1
0.0000
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0003
0.0004
0.0005
0.0007
0.0008
0.0010
0.0012
0.0014
0.0017
0.0019
0.0021

2
0.0000
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0003
0.0004
0.0005
0.0007
0.0009
0.0010
0.0012
0.0015
0.0017
0.0019
0.0022

3
0.0000
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0003
0.0004
0.0006
0.0007
0.0009
0.0011
0.0013
0.0015
0.0017
0.0019
0.0022

4
0.0000
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0003
0.0004
0.0006
0.0007
0.0009
0.0011
0.0013
0.0015
0.0017
0.0020
0.0022
8

5
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0002
0.0003
0.0004
0.0006
0.0007
0.0009
0.0011
0.0013
0.0015
0.0018
0.0020
0.0022

6
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0002
0.0003
0.0005
0.0006
0.0008
0.0009
0.0011
0.0013
0.0015
0.0018
0.0020
0.0023

7
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0002
0.0003
0.0005
0.0006
0.0008
0.0009
0.0011
0.0013
0.0016
0.0018
0.0020
0.0023

8
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0003
0.0004
0.0005
0.0006
0.0008
0.0010
0.0012
0.0014
0.0016
0.0018
0.0021
0.0023

9
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0002
0.0003
0.0004
0.0005
0.0006
0.0008
0.0010
0.0012
0.0014
0.0016
0.0018
0.0021
0.0023

1.9
2
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9

0.0024
0.0026
0.0028
0.0031
0.0033
0.0035
0.0038
0.0040
0.0042
0.0043
0.0045
0.0047
0.0048
0.0050
0.0051
0.0052
0.0053
0.0054
0.0054
0.0055
0.0056

2.2.2

0.0024
0.0026
0.0029
0.0031
0.0033
0.0036
0.0038
0.0040
0.0042
0.0044
0.0045
0.0047
0.0048
0.0050
0.0051
0.0052
0.0053
0.0054
0.0054
0.0055
0.0056

0.0024
0.0026
0.0029
0.0031
0.0034
0.0036
0.0038
0.0040
0.0042
0.0044
0.0045
0.0047
0.0048
0.0050
0.0051
0.0052
0.0053
0.0054
0.0055
0.0055
0.0056

0.0024
0.0027
0.0029
0.0032
0.0034
0.0036
0.0038
0.0040
0.0042
0.0044
0.0046
0.0047
0.0049
0.0050
0.0051
0.0052
0.0053
0.0054
0.0055
0.0055
0.0056

0.0025
0.0027
0.0029
0.0032
0.0034
0.0036
0.0038
0.0040
0.0042
0.0044
0.0046
0.0047
0.0049
0.0050
0.0051
0.0052
0.0053
0.0054
0.0055
0.0055
0.0056

0.0025
0.0027
0.0030
0.0032
0.0034
0.0037
0.0039
0.0041
0.0043
0.0044
0.0046
0.0047
0.0049
0.0050
0.0051
0.0052
0.0053
0.0054
0.0055
0.0055
0.0056

0.0025
0.0027
0.0030
0.0032
0.0035
0.0037
0.0039
0.0041
0.0043
0.0044
0.0046
0.0048
0.0049
0.0050
0.0051
0.0052
0.0053
0.0054
0.0055
0.0055
0.0056

0.0025
0.0028
0.0030
0.0032
0.0035
0.0037
0.0039
0.0041
0.0043
0.0045
0.0046
0.0048
0.0049
0.0050
0.0052
0.0053
0.0053
0.0054
0.0055
0.0055
0.0056

0.0025
0.0028
0.0030
0.0033
0.0035
0.0037
0.0039
0.0041
0.0043
0.0045
0.0046
0.0048
0.0049
0.0051
0.0052
0.0053
0.0053
0.0054
0.0055
0.0056
0.0056

0.0026
0.0028
0.0031
0.0033
0.0035
0.0037
0.0039
0.0041
0.0043
0.0045
0.0047
0.0048
0.0049
0.0051
0.0052
0.0053
0.0054
0.0054
0.0055
0.0056
0.0056

Usando o Gerador Fibonacci

Analogamente para o caso de se usar o algortmo Fibonacci


> Tabela(n = 10000,Fibonacci = TRUE,semente = s)$Tabela.Calculada

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9

0
0.0000
0.0398
0.0793
0.1179
0.1554
0.1915
0.2257
0.2580
0.2881
0.3159
0.3413
0.3643
0.3849
0.4032
0.4193
0.4332
0.4453
0.4555
0.4642
0.4714

1
0.0040
0.0438
0.0832
0.1217
0.1591
0.1950
0.2291
0.2611
0.2910
0.3186
0.3437
0.3665
0.3869
0.4049
0.4207
0.4345
0.4464
0.4565
0.4650
0.4721

2
0.0080
0.0478
0.0871
0.1255
0.1628
0.1985
0.2324
0.2642
0.2939
0.3212
0.3461
0.3686
0.3888
0.4066
0.4222
0.4358
0.4474
0.4574
0.4657
0.4727

3
0.0120
0.0517
0.0910
0.1293
0.1664
0.2019
0.2356
0.2673
0.2967
0.3238
0.3485
0.3707
0.3906
0.4082
0.4237
0.4370
0.4485
0.4583
0.4665
0.4734

4
0.0160
0.0557
0.0948
0.1331
0.1700
0.2054
0.2389
0.2703
0.2995
0.3264
0.3508
0.3728
0.3925
0.4099
0.4251
0.4383
0.4496
0.4592
0.4672
0.4740
9

5
0.0199
0.0596
0.0987
0.1368
0.1736
0.2088
0.2421
0.2734
0.3023
0.3289
0.3531
0.3749
0.3943
0.4115
0.4265
0.4395
0.4506
0.4600
0.4680
0.4746

6
0.0239
0.0636
0.1026
0.1406
0.1772
0.2123
0.2454
0.2764
0.3051
0.3315
0.3554
0.3770
0.3962
0.4131
0.4279
0.4407
0.4516
0.4609
0.4687
0.4752

7
0.0279
0.0675
0.1064
0.1443
0.1808
0.2157
0.2486
0.2793
0.3078
0.3340
0.3577
0.3790
0.3980
0.4147
0.4292
0.4418
0.4526
0.4617
0.4694
0.4758

8
0.0319
0.0714
0.1103
0.1480
0.1844
0.2190
0.2517
0.2823
0.3106
0.3364
0.3599
0.3810
0.3997
0.4162
0.4306
0.4430
0.4536
0.4626
0.4701
0.4763

9
0.0359
0.0753
0.1141
0.1517
0.1879
0.2224
0.2549
0.2852
0.3133
0.3389
0.3621
0.3830
0.4015
0.4177
0.4319
0.4441
0.4546
0.4634
0.4708
0.4769

2
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9

0.4775
0.4824
0.4864
0.4896
0.4922
0.4943
0.4959
0.4971
0.4981
0.4988
0.4993
0.4998
0.5001
0.5003
0.5004
0.5005
0.5006
0.5007
0.5007
0.5007

0.4780
0.4828
0.4868
0.4899
0.4924
0.4944
0.4960
0.4972
0.4981
0.4989
0.4994
0.4998
0.5001
0.5003
0.5005
0.5006
0.5006
0.5007
0.5007
0.5007

0.4785
0.4833
0.4871
0.4902
0.4927
0.4946
0.4961
0.4973
0.4982
0.4989
0.4994
0.4998
0.5001
0.5003
0.5005
0.5006
0.5006
0.5007
0.5007
0.5007

0.4790
0.4837
0.4874
0.4905
0.4929
0.4948
0.4963
0.4974
0.4983
0.4990
0.4995
0.4999
0.5001
0.5003
0.5005
0.5006
0.5006
0.5007
0.5007
0.5007

0.4795
0.4841
0.4878
0.4907
0.4931
0.4949
0.4964
0.4975
0.4984
0.4990
0.4995
0.4999
0.5002
0.5004
0.5005
0.5006
0.5006
0.5007
0.5007
0.5007

0.4800
0.4845
0.4881
0.4910
0.4933
0.4951
0.4965
0.4976
0.4985
0.4991
0.4996
0.4999
0.5002
0.5004
0.5005
0.5006
0.5006
0.5007
0.5007
0.5007

0.4805
0.4849
0.4884
0.4913
0.4935
0.4953
0.4966
0.4977
0.4985
0.4991
0.4996
0.5000
0.5002
0.5004
0.5005
0.5006
0.5006
0.5007
0.5007
0.5007

0.4810
0.4853
0.4887
0.4915
0.4937
0.4954
0.4968
0.4978
0.4986
0.4992
0.4996
0.5000
0.5002
0.5004
0.5005
0.5006
0.5006
0.5007
0.5007
0.5007

0.4815
0.4857
0.4890
0.4917
0.4939
0.4956
0.4969
0.4979
0.4987
0.4992
0.4997
0.5000
0.5002
0.5004
0.5005
0.5006
0.5007
0.5007
0.5007
0.5007

0.4819
0.4860
0.4893
0.4920
0.4941
0.4957
0.4970
0.4980
0.4987
0.4993
0.4997
0.5000
0.5003
0.5004
0.5005
0.5006
0.5007
0.5007
0.5007
0.5007

A matrix de desvios em relacao ao valor tabelado pelo R sera:


> Tabela(n = 10000,Fibonacci = TRUE,semente = s)$Tabela.Erro

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2
2.1
2.2

0
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

1
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

2
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

3
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

4
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04
10

5
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

6
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

7
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

8
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-3e-04
-3e-04

9
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
0e+00
-1e-04
-1e-04
-1e-04
-2e-04
-2e-04
-2e-04
-3e-04
-4e-04

2.3
2.4
2.5
2.6
2.7
2.8
2.9
3
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9

-4e-04
-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-4e-04
-5e-04
-6e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

-4e-04
-5e-04
-5e-04
-6e-04
-6e-04
-7e-04
-7e-04
-7e-04
-7e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-8e-04
-7e-04
-7e-04

Conclus
ao

Os resultados obtidos nos mostram que as sequencia geradas apresentam todas as boas
caractersticas desejadas em uma distribuicao uniforme:
Uniformidade: Os testes de Wilcoxon e os graficos gerados para as sequencias Congruencial e Fibonacci garantem que em todas as sequencias geradas as distribuicoes
sao estatisticamente uniformes. Cabe aqui notar que para algumas poucas sementes
as sequencias geradas por ambos os geradores sao rejeitadas pelo teste de Wilcoxon apenas de que nos graficos de boxplot e qqplot sua aparencia seja claramente
uniforme;
Independ
encia: Conforme visto nos testes para as sequencias dos ndices pares e mpares da sequencia gerada pode-se afirmar que os diferentes valores gerados sao
independentes;
Perodo Longo: O perodo do gerador congruencial para os parametros padroes sera de
231 2 a sequencia Fibonacci apresenta periodo superior `a 2100 ;
Facilidade de implementac
ao e efici
encia: Como se pode ver nos algortmos em anexo
nao sao necessarias grandes habilidades de programacao para se projetar qualquer
um dos dois algortmos usados no texto. Alem disso qualquer um dos dois algortmos usa poucas operacoes aritmeticas para se obter qualquer um dos valores da
sequencia;
Reprodutibilidade: Para o leitor obter os mesmos resultados desse texto basta executar
os algortmos usando a semente s = 10, para uma mesma semente as sequencias
geradas sempre serao iguais o que permite repetir as simulacoes feitas.
Com relacao a` tabela normal obtida observou-se que o erro obtido aumenta a` medida
em que z0 assume valores cada vez mais positivos, esse erro pode ser tanto a maior quanto a
11

menor e varia aleatoriamente em funcao da semente escolhida e da quantidade de n


umeros
interessante notar que se ocorrer um erro a menor
gerados pelo gerador congruencial. E
todos os erros serao a` menor e se ocorrer um erro `a maior todos os erros serao a` maior,
isso ocorre porque usam-se os mesmos pontos gerados para calcular a mesma integral onde
o que muda de um quantil para outro e apenas o valor do coeficiente x0 na substituicao
feita na equacao (5).

Anexos
Em ambos os geradores a seguir a sada e um data frame formado pela sequencia de
inteiros gerada e pela sequencia de valores correspondente `a distribuicao uniforme no
intervalo (0, 1).

Gerador Congruencial
> GeradorCongruencial <- function(
+
a = 950706376,
+
c = 0,
+
m = 2^31-1,
+
semente = 1,
+
n = 1
+
){
+
#PARAMETROS
+
# a, c e m: coeficientes da express~
ao congruencial;
+
# n: n
umero de n
umeros a serem gerados;
+
# semente: valor do x0 que ser
a usado pelo algoritmo para iniciar o
+
# processo iterativo
+
# Outros valores adequados para a ser~
ao:
+
# a = 16807;
+
# a = 950706376;
+
# a = 742938285;
+
# a = 1226874159;
+
# a = 62089911;
+
# a = 1343714438;
+
# Para qualquer um dos valores de a sequ\^encia obtida ter
a tamanho 2^31-2
+
# e ser
a pr
oximo de uma normal;
+
# O valor a seguir
e um dos valores mais adequados se o computador for de
+
#32 bits equivale a
` 2^31-1;
+
u <- as.vector(n);
+
x <- semente; #Provavelmente h
a maneiras
+
# mais inteligentes de se gerar essa semente!!!
+
for(i in 1:n){
+
x[i+1] <- (a*x[i] + c) %% m;
+
u[i] <- x[i+1]/m;
+
}
+
return(
+
list(
+
#semente = x[1], #Semente para gera
c~
ao da sequ\^encia uniforme;
12

+
+
+
+
+
)
+
)
+ }

sequencia.gerada = x[2:(n+1)], #sequ\^encia gerada pela express~


ao do
# algor
tmo interativo;
sequencia.uniforme = u #sequ\^encia normal correspondente `
a sequ\^encia
#gerada

Gerador Fibonacci
O codigo a seguir pressupoe que o codigo anterior do Gerador Congruencial ja esta carregado na memoria do R, pois a semente usada nesse gerador e uma sequencia de tamanho fixo do gerador escolhido. Varios parametros desse gerador estao em aberto, mas
recomenda-se utilizar os valores padroes para i, j e m.
> GeradorFibonacci <- function(
+
i = 607,
+
j = 273,
+
m = 2^31,
+
semente = 1,
+
n = 1
+
){
+
#PARAMETROS
+
# i: Indice de um valor qualquer do vetor semente;
+
# j: Indice de um valor qualquer do vetor semente (necessariamente j<i);
+
# m: Parametro da expressao congruencial modulo m, geralmente deve ser
+
# pot^
encia de 2;
+
# semente: semente para o gerador congruencial;
+
# n: n
umero de n
umeros a serem gerados;
+
# No gerador Fibonacci se utilizam valores de m iguais a pot^
encias de 2.
+
if(j>=i){
+
erro <- "E necess
ario informar j<i";
+
return(erro);
+
}
+
x <- as.vector(0);
+
u <- GeradorCongruencial(semente = semente, n = i)$sequencia.uniforme;
+
for(k in (i+1):(i+n)){
+
x[k] <- (m*(u[k-i]-u[k-j])) %% m;
+
u[k] <- x[k]/m;
+
}
+
return(
+
list(
+
#semente = u[1:i], #Semente para gera
c~
ao da sequ\^encia uniforme;
+
sequencia.gerada = x[(i+1):(i+n)], #sequ\^encia gerada pela express~
ao
+
#do algor
tmo interativo;
+
sequencia.uniforme = u[(i+1):(i+n)] #sequ\^encia normal correspondente
+
#`
a sequ\^encia gerada;
+
)

13

+
)
+ }

Densidade da Normal Padr


ao
Funcao simples que calcula o valor da Densidade da Normal Padrao para um dado valor
de x R.
> DensidadeNormalPadrao <- function(x){
+
Densidade <- (1/sqrt(2*pi))*exp(-(x^2)/2);
+
return(Densidade);
+ }

Probabilidade da Normal Padr


ao
A funcao a seguir calcula pelo metodo de monte carlo o valor da area sob a curva da densidade normal no intervalo (0, z0 ). No algoritmo a seguir deve-se informar uma sequencia
de valores aleatorios de uma distribuicao uniforme no intervalo (0, 1).
> ProbabilidadeNormalPadrao <- function(z0,pontos){
+
#PARAMETROS
+
# z0: extremo direito do intervalo para o qual de deseja calcular a
area
+
# na densidade da normal padr~
ao.
+
# pontos: vetor de n
umeros aleat
orios de uma distribui
c~
ao unifome(0,1)
+
total <- as.real(0);
+
for(i in 1:length(pontos)){
+
total <- total + z0*DensidadeNormalPadrao(x = z0*pontos[i])
+
}
+
Area <- total/length(pontos);
+
Tabela.Oficial <- pnorm(q=z0) - 0.5;
+
return(
+
list(
+
Probabilidade.Calculada = Area,
+
Tabela = Tabela.Oficial,
+
Erro = Tabela.Oficial - Area
+
)
+
)
+ }

Constru
c
ao da Tabela Normal
A funcao que constroi a matrix com os valores da tabela normal padrao usado nesse
trabalho e a seguinte:
> Tabela <- function(n = 10000, semente = 1, r = 4, Fibonacci = FALSE){
+
#Verifica qual gerador o usu
ario deseja usar.
+
if(Fibonacci){
+
pontos <- GeradorFibonacci(
+
n = n,
14

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

semente = semente
)$sequencia.uniforme
}else{
pontos <- GeradorCongruencial(
n = n,
semente = semente
)$sequencia.uniforme
}
#Gera a parte inteira da tabela normal
inteiros <- seq(from = 0, to = 3.9 , by = 0.1);
#Geram os cent
esimos da tabela normal
centesimos <- seq(from = 0, to = 9);
#Constr
oi os
ndices das margens da tabela normal
margens <- expand.grid(
inteiros = inteiros,
centesimos = centesimos
);
#Constr
oi todos os valores que devem ser usados paza z0
intervalo <- sort(margens$centesimos/100 + margens$inteiros);
#Calcula todas as probabilidades da normal
ResultadoPrevio <- ProbabilidadeNormalPadrao(
z0 = intervalo,
pontos = pontos);
#Calculas os valores das probabilidades
normal.calculada <- matrix(
ncol = 10,
round(
ResultadoPrevio$Probabilidade.Calculada,
digits=r
),
byrow = TRUE
)
normal.R <- matrix(
ncol = 10,
round(
ResultadoPrevio$Tabela,
digits=r
),
byrow=TRUE
)
normal.Erro <- matrix(
ncol = 10,
round(
ResultadoPrevio$Erro,
digits=r
),
byrow=TRUE)
#Monta uma tabela da normal com layout desconfigurado
15

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }

class.calculada <- transform(


cbind(margens,normal.calculada),
inteiros = factor(inteiros),
centesimos = factor(centesimos)
)
class.R <- transform(
cbind(margens,normal.R),
inteiros = factor(inteiros),
centesimos = factor(centesimos)
)
class.Erro <- transform(
cbind(margens,normal.Erro),
inteiros = factor(inteiros),
centesimos = factor(centesimos)
)
#Configura o layout da tabela
Tabela.Calculada <- with(
class.calculada,
tapply(normal.calculada, list(inteiros, centesimos), sum)
)
Tabela.R <- with(
class.R,
tapply(normal.R, list(inteiros, centesimos), sum)
)
Tabela.Erro <- with(
class.Erro,
tapply(normal.Erro, list(inteiros, centesimos), sum)
)
return(
list(
Tabela.Calculada = Tabela.Calculada,
Tabela.R = Tabela.R,
Tabela.Erro = Tabela.Erro
)
)

16

Você também pode gostar