-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGaussiana-Inversa.R
121 lines (102 loc) · 3.41 KB
/
Gaussiana-Inversa.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#################################################################################
# Arquivo: Gaussiana-Inversa.R
#
# USO: Simulacao de Monte Carlo dos estimadores de maxima
# verossimilhanca dos parametros da distribuiCao Gaussiana Inversa, IG(m,l).
#
# OTIMIZACAO NAO-LINEAR: Feita por com gradiente analitico, método BFGS
#
# ARGUMENTOS DA FUNCAO: nobs -> numero de observacoes testados foram
# (T =25,50,75,100,250,400);
# nrep -> numero de replicas de Monte Carlo (R = 10000);
# semente -> semente do gerador (2000);
# shape1 -> valor de mu
# shape2 -> valor de lambda
#
# Autora: Gabrielle Carvalho
#
# Data: 07/07/2022
#
############################################################################
# pacote para geracao aleatoria
install.packages( "statmod")
library("statmod")
# Criação da funcao
gaussInv.mc.bfgs = function(nrep=10000, nobs=100, semente=2000,
shape1 = 1.5, shape2= 2)
{
# função de log-verossimilhança
logLikGaussInv = function(theta){
a = abs(theta[1])
b = abs(theta[2])
logLik = sum( 0.5*log(b) - 1.5*log(y) - (b*(y - a)^2 )/(2* a^2 *y) )
return(logLik)
}
# funcao escore (gradiente)
scoreFn = function(theta){
a = abs(theta[1]); b = abs(theta[2])
cbind( sum((b/(a^3*y)) * (a*(y-a) + (y-a)^2 )),
sum(1/(2*b) - ((y-a)^2 )/(2* a^2 *y) ))
}
# início da cronometragem
tempo.inicio = Sys.time()
# vetores para armanezar as estimativas
emva = rep(0, nrep)
emvb = rep(0, nrep)
set.seed(2000) # semente do gerador
contadorFalhas = 0 # contador de falhas
# laço de Monte Carlo
i = 1
while(i <= nrep){
# amostra gerada
y = rinvgauss(nobs, mean = shape1, dispersion = 1/shape2)
# chute inicial
shoot1 = cbind(1.3)
shoot2 = cbind(1.7)
# maximização da log-verossimilhança
ir = optim(c(shoot1, shoot2), logLikGaussInv, gr=scoreFn, method="BFGS",
control=list(fnscale=-1, reltol = 1e-12))
# checagem de convergencia
if(ir$convergence == 0){
emva[i] = ir$par[1]
emvb[i] = ir$par[2]
i = i + 1
}
else{
contadorFalhas = contadorFalhas + 1
}
} # fim do laco de Monte Carlo
# estimativas
amedio = mean(emva)
bmedio = mean(emvb)
avies = amedio - shape1
bvies = bmedio - shape2
aviesrel = avies/shape1*100
bviesrel = bvies/shape2*100
amax = max(emva)
bmax = max(emvb)
amin = min(emva)
bmin = min(emvb)
# erros quadraticos madios
aeqm = avies^2 + var(emva)
beqm = bvies^2 + var(emvb)
# resultados armazenados em matriz
mResultados = matrix(c(amedio, bmedio, avies,
bvies, aviesrel, bviesrel,
aeqm, beqm, amax, bmax,
amin,bmin), 6, 2, byrow=TRUE)
rownames(mResultados) = c("média", "viés",
"viés rel.", "eqm", "max", "min")
colnames(mResultados) = c("evm a", "emv b")
# calculo do tempo de execucao
tempo.fim = Sys.time()
tempo.exec = tempo.fim - tempo.inicio
# resultados colecionados em uma lista
resultado = list(nobs=nobs, nrep=nrep, semente=semente, a=shape1,
b=shape2, falhas=contadorFalhas, resultados=mResultados,
horario=tempo.inicio, tempoexec=tempo.exec)
return(resultado)
}
#res50 = gaussInv.mc.bfgs(nobs=50)
#res50$resultados
sessioninfo()