next up previous
Next: B Código de S-Plus Up: MCB Previous: Reconocimientos

A Código de S-Plus para el Ejemplo A

# ANALISIS DEL MODELO WEIBULL #

#------
# Datos

n_30

x_c(23, 261, 87, 7, 120, 14, 62, 47, 225, 71, 246, 21, 42, 20, 5, 
    12, 120, 11, 3, 14, 71, 11, 14, 11, 16, 90, 1, 16, 52, 95)



#######################################################
# Algoritmo Newton Raphson para maximizar una funcion f

nr_function(f, D1f, D2f, x0, p)   # Dada p, la precision deseada
{
        i <- 0
        xt <- x0
        valor <- 0
        xt1 <- xt - (D1f(xt))/(D2f(xt))
        while((abs((xt - xt1)/xt)) > p) {
                i <- i+1
                xt <- xt1
                xt1 <- xt - (D1f(xt))/(D2f(xt))
                valor <- f(xt1)
        print(cbind(i, xt1, valor))
        }
        vgorro <- xt1
        Varv <- -1/D2f(vgorro)
        cbind(vgorro,Varv)
}


#---------------------------------
# Aproximacion normal asintotica

fv_function(v)
{
((exp((n-1) * v)) * ((prod(x))^(exp(v))))/(sum(x^(exp(v))))^n
}

gprima_function(v)
{
(n-1) + exp(v) * sum(log(x)) - 
(n * exp(v) * sum(x^exp(v) * log(x)))/sum(x^exp(v))
}

gbiprima_function(v)
{
exp(v) * sum(log(x)) - 
(n * exp(v) * sum((x^exp(v)) * log(x)))/sum(x^exp(v)) - 
(n * exp(2 * v) * sum(x^exp(v) * (log(x)^2)))/sum(x^exp(v)) + 
(n * exp(2 * v) * ((sum((x^exp(v)) * log(x)))^2))/((sum(x^exp(v)))^2)
}


ana_nr(fv,gprima,gbiprima,0,0.0000001)

vgorro_ana[1]

vgorro
>
> [1] -0.1781658
>

Varv_ana[2]

Varv
>
> [1] 0.02015616
>


#-----------------------------------------------
# Constante de Normalizacion para p(theta|x) via 
# aproximacion de Laplace

Sigvg_n*Varv

Is_(2*pi/n)^0.5*(Sigvg)^0.5*fv(vgorro)

Is
>
> [1] 1.277015e-054
>
 
#---------------------------------------
# E(theta|x) via aproximacion de Laplace 
# (Forma estandar)
 
Eths_exp(vgorro)

Eths
>
> [1] 0.8368037
>

#---------------------------------------
# E(theta|x) via aproximacion de Laplace
# (Forma exponencial)

fvp_function(v)
{
(exp(v) * ((exp((n-1) * v)) * ((prod(x))^(exp(v)))))/(sum(x^(exp(v))))^n
}

gpp_function(v)
{
1 + (n-1) + exp(v) * sum(log(x)) - 
(n * exp(v) * sum(x^exp(v) * log(x)))/sum(x^exp(v))
}

gbpp_function(v)
{
exp(v) * sum(log(x)) - 
(n * exp(v) * sum((x^exp(v)) * log(x)))/sum(x^exp(v)) - 
(n * exp(2 * v) * sum(x^exp(v) * (log(x)^2)))/sum(x^exp(v)) + 
(n * exp(2 * v) * ((sum((x^exp(v)) * log(x)))^2))/((sum(x^exp(v)))^2)
}


le_nr(fvp,gpp,gbpp,1,0.000001)

vgp_le[1]

vgp
>
> [1] -0.1583074
>

Sigvgp_n*le[2]

Sigvgp
>
> [1] 0.5870183
>

Sthe_exp(vgp)*(2*pi/n)^0.5*(Sigvgp)^0.5*fv(vgp)

Sthe
>
> [1] 1.063443e-054
>

S1_Is
 
Ethe_Sthe/S1

Ethe
>
> [1] 0.8327572
>

#--------------------------------------------------------
# Densidad predictiva p^(y|x) via aproximacion de Laplace
# (Forma estandar)
# Constante de normalizacion obtenida analiticamente

py_function(y)
{
w_exp(vgorro)
n * ((w * y^(w - 1) * (sum(x^w))^n)/(y^w + sum(x^w))^(n+1))
}

grafica_function(f, a, b, np, nombre)
{
        win.graph()
        x <- seq(a, b, length = np)
        tabula <- x
        for(i in 1:np) {tabula[i] <- f(x[i])}
        plot(x, tabula, xlab = "y", ylab = "p(y|x)", type = "l")
        title(nombre)
}
 

grafica(py,0,500,100,"Densidad predictiva: Laplace")


################################################
# Regla trapezoidal

trapezoidal_function(f, a, b, N)
{
sumaf <- 0
k <- N - 1
for(i in 1:k) { sumaf <- sumaf + f(a + (i * (b - a))/N) }
((b - a)/N) * ((f(a) + f(b))/2 + sumaf)
}


#-----------------------------------------------
# Constante de normalizacion para p(theta|x) via 
# regla trapezoidal (N=1000)

N_1000

a_vgorro - 5*sqrt(Varv)
b_vgorro + 5*sqrt(Varv)

Cnpth_trapezoidal(fv,a,b,N)

Cnpth
>
> [1] 1.283785e-054
>

#--------------------------------------------
# Constante de normalizacion para p^(y|x) via 
# regla trapezoidal (N=1000)

fu_function(u)
{
w_exp(vgorro)
y <- u/(1 - u)
((w * y^(w - 1) * (sum(x^w))^n)/(y^w + sum(x^w))^(n+1)) * (1 - u)^(-2)
}


Cnpy_trapezoidal(fu,0.00001,0.99999,N)

Cnpy
>
> [1] 0.03333357
>


#################################################
# Metodo iterativo de Naylor-Smith, basado en la 
# regla de Gauss-Hermite.

ghc3_function(fv, mu0, s20, p){
r1_-1.2247448714
r2_0
r3_-r1
w1_0.29540898
w2_1.1816359
w3_w1

i_0
cn_-1
cnm1_1

while((abs( (cn - cnm1) / cn )) > p) {
i_i+1
cnm1_cn
u1_sqrt(2*sig2) * w1 * exp(r1*r1)
u2_sqrt(2*sig2) * w2 * exp(r2*r2)
u3_sqrt(2*sig2) * w3 * exp(r3*r3)

eta1_mu + sqrt(2*sig2) * r1
eta2_mu + sqrt(2*sig2) * r2 
eta3_mu + sqrt(2*sig2) * r3 

cn_u1*fv(eta1) + u2*fv(eta2) + u3*fv(eta3)

muh_( u1*eta1*fv(eta1) + u2*eta2*fv(eta2) + u3*eta3*fv(eta3) ) / cn

e2h_( u1*eta1*eta1*fv(eta1) + u2*eta2*eta2*fv(eta2) + u3*eta3*eta3*fv(eta3)) / cn
sig2h_e2h - muh*muh

mu_muh
sig2_sig2h
print(cbind(i,cn,mu,sig2))
}
cn
}


ghc5_function(fv, mu0, s20, p){
r1_-2.0201828705
r2_-0.9585724646
r3_0
r4_-r2
r5_-r1
w1_0.019953242
w2_0.39361932
w3_0.94530872
w4_w2
w5_w1

i_0
cn_-1
cnm1_1

while((abs( (cn - cnm1) / cn )) > p) {
i_i+1
cnm1_cn
u1_sqrt(2*sig2) * w1 * exp(r1*r1)
u2_sqrt(2*sig2) * w2 * exp(r2*r2)
u3_sqrt(2*sig2) * w3 * exp(r3*r3)
u4_sqrt(2*sig2) * w4 * exp(r4*r4)
u5_sqrt(2*sig2) * w5 * exp(r5*r5)

eta1_mu + sqrt(2*sig2) * r1
eta2_mu + sqrt(2*sig2) * r2 
eta3_mu + sqrt(2*sig2) * r3 
eta4_mu + sqrt(2*sig2) * r4 
eta5_mu + sqrt(2*sig2) * r5 

cn_u1*fv(eta1) + u2*fv(eta2) + u3*fv(eta3) + u4*fv(eta4) + u5*fv(eta5)

muh_( u1*eta1*fv(eta1) + u2*eta2*fv(eta2) + u3*eta3*fv(eta3) + 
u4*eta4*fv(eta4) + u5*eta5*fv(eta5) ) / cn

e2h_( u1*eta1*eta1*fv(eta1) + u2*eta2*eta2*fv(eta2) + u3*eta3*eta3*fv(eta3) 
 + u4*eta4*eta4*fv(eta4) + u5*eta5*eta5*fv(eta5) ) / cn
sig2h_e2h - muh*muh

mu_muh
sig2_sig2h
print(cbind(i,cn,mu,sig2))
}
cn
}


#-----------------------------------------------
# Constante de normalizacion para p(theta|x) via
# regla de Gauss-Hermite (N=3)

mu_vgorro
sig2_Varv

fv_function(v)
{
((exp((n-1) * v)) * ((prod(x))^(exp(v))))/(sum(x^(exp(v))))^n
}

Cnpthgh_ghc3(fv, mu, sig2,0.0000001)

Cnpthgh
>
> [1] 1.278927e-054
>


#--------------------------------------------
# Constante de normalizacion para p^(y|x) via 
# regla de Gauss-Hermite (N=5)

mu_3.5
sig2_2

pyr_function(yr)
{
wh_exp(vgorro) 
( wh * exp(yr*wh) * (sum(x^wh))^n )/( exp(yr*wh) + sum(x^wh))^(n+1) 
}

 
Cnpygh_ghc5(pyr, mu, sig2,0.0000001)

Cnpygh
>
> [1] 0.03253937
> 

###################################################################
# Monte Carlo (Muestreo por Importancia)


importancia_function(u, f, N, m, var)
{
# u: funcion cuyo valor esperado se desea calcular
# f: densidad con respecto a la cual se calcula la esperanza
# N: Tamanio de la muestra simulada
# m: media para la aproximacion normal
# var: Varianza para la aproximacion normal

s <- var^0.5
muestra <- seq(0, 0, length = N)
for(i in 1:N) {
aleatorio <- rnorm(1, m, s)
muestra[i] <- (u(aleatorio) * f(aleatorio))/(dnorm(aleatorio, m, s))
}
mean(muestra)
}


#----------------------------------------
# E(w|x) via Monte Carlo

u_function(v){ exp(v) }

pv_function(v)
{
(1/Cnpth) * exp((n-1) * v + exp(v) * sum(log(x)) - n * log(sum(x^exp(v))))
}

N_5000

Ethmc_importancia(u,pv,N,vgorro,Varv)

Ethmc
>
> [1] 0.8321348
>

###################################################################
# Algoritmo de Metropolis-Hastings  (Independencia)

metro_function(f, N, R, m, var)
{
# f: Funcion de la que desea muestrear
# N: Tamanio de la muestra
# R: Numero de iteraciones
# m: Media de la distribucion candidato (Normal)
# var: Varianza de la distribucion candidato (Normal)
        sal_list(mv=0,me=0)
        v0 <- rnorm(N, m, sqrt(var))
        vme <- seq(0, 0, length = R) 
        v2me <- seq(0, 0, length = R) 
        thme <- seq(0, 0, length = R) 
# Iteraciones del algoritmo de Metropolis
        for(i in 1:R) {
                v1 <- rnorm(N, m, sqrt(var))
                w1 <- f(v1)/dnorm(v1, m, sqrt(var))
                w0 <- f(v0)/dnorm(v0, m, sqrt(var))
                alfa <- w1/w0
                u <- runif(N, 0, 1)
                aux <- ifelse(u < alfa, v1, v0)
                v0 <- aux
                vme[i] <- mean(v0)
                v2me[i] <- mean(v0*v0)
                thme[i] <- mean(exp(v0))
                print(i)
        }
        sal$mv <- v0
        sal$me <- cbind(vme,v2me,thme)
        sal
}



fvm_function(v)
{
k <- length(v)  
c <- seq(0, 0, length = k)
for(i in 1:n) { c <- c + x[i]^exp(v) }
exp((n-1) * v + exp(v) * sum(log(x)) - n * log(c))
}


N_1000
R_1100

mm_metro(fvm,N,R,vgorro,Varv)


#------------
# Diagnostico

ITC_trunc(R/11)
mcal_mm$me
mgra_mcal[(ITC+1):R,1:3]

merg_cbind(cumsum(mgra[,1]),cumsum(mgra[,2]),cumsum(mgra[,3]))/(1:(R-ITC))

win.graph()
par(mfrow=c(2,2))

plot(merg[,1], xlab="Iteracion", ylab="v", type="l")
title("Promedios ergodicos: v")

plot(merg[,2], xlab="Iteracion", ylab="v^2", type="l")
title("Promedios ergodicos: v^2")

plot(merg[,3], xlab="Iteracion", ylab="theta", type="l")
title("Promedios ergodicos: theta")


#------------------------------------------------
# Histograma y densidad final estimada para theta

win.graph()

mtheta_exp(mm$mv)
hist(mtheta,xlab="theta",ylab="p(theta|x)",nclass=20,probability=T)

denth_density(mtheta,width=0.2)
lines(denth,lty=1)

title("Distribucion final de theta")


#-------------------------------------------
# Muestra de lambda via muestreo condicional

genlam_function(w)
{
        r <- length(w)
        b <- seq(0, 0, length = r)
        lambda <- seq(0, 0, length = r)
        for(i in 1:r) {
                a <- n
                b[i] <- sum(x^w[i])
                lambda[i] <- rgamma(1, a)/b[i]
        }
        lambda
}

mlamb_genlam(mtheta) 


#-------------------------------------------
# Media y varianza finales de theta y lambda

c(mean(mtheta),var(mtheta))
>
> [1] 0.83497586 0.01428637
>

c(mean(mlamb),var(mlamb))
>
> [1] 0.0402371634 0.0004886204
>


#--------------------------------------------------
#Densidad predictiva p(y|x) via Metropolis-Hastings

weibull_function(x, th, l)
{
l * th * x^(th - 1) * exp( - l * x^th)
}


predic_function(y)
{
suma <- 0
{
for(i in 1:N)
suma <- suma + weibull(y, mtheta[i], mlamb[i])
}
promedio <- suma/N
promedio
} 


#--------
# Grafica

grafsobre_function(f, a, b, np,ltype)
{
        x <- seq(a, b, length = np)
        tabula <- x
        for(i in 1:np) {tabula[i] <- f(x[i])}
        lines(x, tabula, lty = ltype)
}
 

grafica(predic,0,500,100,"Densidad predictiva: Monte Carlo")

#----------------------------------------
# Compara las aproximacion de Laplace con 
# la de Metropolis-Hastings

grafica(py,0,500,100,"Densidad predictiva")
grafsobre(predic,0,500,100,2)

legend(locator(1),
legend=c("Aproximacion de Laplace","Aproximacion de Monte Carlo"), 
lty=c(1,2),cex=0.65,bty="n")