Apellidos: Amagua Sandobalin
Nombre: Gabriel Sebastián
Observación Hay que notar que la función de distribución F, dada es discontinua en el punto \(x=0\), además dicha discontinuidad es inevitable.
Así pues en tal caso, no podriamos aplicar el método de Inversión para generar observaciones de está variable aleatoria, aun así. Procederemos ignorando la observación anterior.
Comenzamos determinando la inversa.
Para \(x \geq 0\), tenemos:
\[\begin{align*} \pi + \left( 1-\pi \right)\left(1-e^{-\lambda x}\right) &= \mu\\ \left( 1-\pi \right)\left(1-e^{-\lambda x}\right) &= \mu - \pi \\ e^{-\lambda x} &= \frac{\mu-\pi}{1-\pi} \\ e^{-\lambda x} &= 1 - \frac{\mu-\pi}{1-\pi} \\ \ln(e^{-\lambda x}) &= \ln\left(1 - \frac{\mu-\pi}{1-\pi}\right)\\ -\lambda x &= \ln\left(1 - \frac{\mu-\pi}{1-\pi}\right)\\ x &= -\frac{1}{\lambda} \ln\left(1 - \frac{\mu-\pi}{1-\pi}\right)\\ \end{align*}\]Observación Debemos notar que existen problemas en el argumento del logaritmo de la función inversa definida anteriormente. Se debe tener que:
\[\begin{align*} 0 &< 1 - \frac{\mu-\pi}{1-\pi} \\ -1 &< - \frac{\mu-\pi}{1-\pi} \\ 1 &> \frac{\mu-\pi}{1-\pi} \\ 1-\pi &< \mu-\pi \\ 1 &< \mu \end{align*}\]Observación Además como \(x \geq 0\), tenemos:
\[\begin{align*} 0 &\leq -\frac{1}{\lambda} \ln\left(1 - \frac{\mu-\pi}{1-\pi}\right) \\ 0 &\geq \ln\left(1 - \frac{\mu-\pi}{1-\pi}\right)\\ 1 &\geq 1 - \frac{\mu-\pi}{1-\pi}\\ 0 &\geq - \frac{\mu-\pi}{1-\pi}\\ 0 &\leq \frac{\mu-\pi}{1-\pi}\\ 0 &\geq \mu-\pi \\ \mu &\leq \pi \end{align*}\]Con lo cual basados en las observaciones anteriores tenemos que; \(\mu \sim U(1,\pi)\)
Asi pues proponemos el siguiente algoritmo:
# Ejercicio 1
# Amagua Sandobalin Gabriel Sebastian.
pF <- function(x,lambda){
ifelse((x<0),0,
(pi+((1-pi)*(1-exp(-lambda*x)))))
}
fR <- function(lambda){
#Generamos un numero aleatorio con distribucion
# U(1,pi) pues Segun los calculos anexados en las hojas U debe
# ser maypor que 1 y menor o igual que pi
U <- runif(1,1,pi)
return(x <- (-((1)/(lambda))*log(1-((U-pi)/(1-pi)))))
}
fRn <- function(lambda,n=10000) {
x <- numeric(n)
for(i in 1:n) x[i]<-fR(lambda)
return(x)
}
set.seed(1727)
u <- fRn(5)
hist(u,freq = FALSE)
dgamma(x, shape, rate)
de R
). Escribir el código necesario para generar, por el método de aceptación-rechazo, una muestra de \(n\) observaciones de una distribución \(Gamma(3,3)\) empleando como densidad auxiliar una exponencial (dexp(x, rate)
): \[g(x)=\lambda e^{-\lambda x}\text{ si }x\geq 0.\] (NOTA: No emplear las funciones de densidad implementadas en R).# Ejercicio 2
# Amagua Sandobalin Gabriel Sebastian.
# Funciones auxiliares para generar, por el método de
# aceptación-rechazo
#====================================================================================
# FUNCIÓN DE DENSIDAD PARA GAMMA(3,3)
#====================================================================================
df <- function(x){
(27/gamma(3))*(x^2)*(exp(-3*x))
}
#====================================================================================
# FUNCIÓN DE DISTRIBUCIÓN PARA GAMMA(3,3)
#====================================================================================
pF <- function(x){
ifelse((x<0),0,(1-((exp(-3*x)*(9*x^2 + 6*x + 2)/(2)))))
}
#====================================================================================
# FUNCIÓN AUXILIAR DE DENSIDAD PARA EXPONENCIAL(lambda)
#====================================================================================
daux <-function(x,lambda){
lambda*exp(-lambda*x)
}
#====================================================================================
# FUNCIÓN PARA GENERAR UN VALOR ALEATORIO CON DISTRIBUCIÓN EXPONENCIAL(lambda)
#====================================================================================
auxR <- function(lambda){
U <- runif(1)
return(x <- (-log((1-U)/lambda)))
}
1. Aproximar numéricamente el parámetro óptimo ($\lambda
_{opt}$) y la cota óptima ($c_{opt}$) de la densidad auxiliar y
compararlos con los valores teóricos.
#-----------------------------------------------------------------------------------
# Obtención de valores c y lambda óptimos aproximados
fopt <- function(lambda) {
# Obtiene c fijado lambda
optimize(f = function(x){df(x)/daux(x,lambda)},
maximum=TRUE, interval=c(0,10))$objective
}
# Encontar lambda que minimiza
res <- optimize(f=function(x){fopt(x)}, interval=c(0,10))
lambda.opt <- res$minimum
c.opt <- res$objective
#-----------------------------------------------------------------------------------
curve(c.opt*daux(x,lambda.opt), 0, 10, col = 3, lwd = 3)
curve(df(x),col='blue',add=TRUE)
#-----------------------------------------------------------------------------------
## Lambda obtenido numéricamente = 0.9999934
## C obtenido numéricamente = 1.827026
2. Generar una muestra de 1000 observaciones de la distribución de
interés tomando como semilla inicial los cuatro primeros dígitos
de la CI. Obtener el tiempo de CPU que tarda en generar la
secuencia y calcular el número medio de generaciones de la
distribución auxiliar. Realice un contraste de hipótesis de
Bondad de Ajuste
Así pues proponemos el siguiente algoritmo:
#-----------------------------------------------------------------------------------
rnormAR <- function() {
# Generación de un resultado aleatorio con dsitribución Gamma(3,3), usando
# como función auxiliar exp(lambda.opt)
while (TRUE) {
U <- runif(1)
X <- auxR(lambda.opt)
ngen <<- ngen+1
if (c.opt * U * daux(X,lambda.opt) <= df(X)) return(X)
}
}
rnormARn <- function(n=1000) {
# Generación de n resultados aleatorios con distribución Gamma(3,3)
x <- numeric(n)
for(i in 1:n) x[i]<-rnormAR()
return(x)
}
#-----------------------------------------------------------------------------------
set.seed(1727)
nsim <- 10^3
ngen <- 0
system.time(x <- rnormARn(nsim))
## user system elapsed
## 0.04 0.00 0.05
# El tiempo de computo es pracitamente 0, asi pues el
# algoritmo propuesto es bastante eficiente.
##
## Nº de generaciones = 1894
## Nº medio de generaciones = 1.894
## Proporcion de rechazos = 0.4720169
El número medio de comparaciones es 1.894, lo cual no es tan cercano a 1 como para afirmar que la función auxiliar usada sea la mas eficiente, asun asi es óptima.
# Kolmogorov-Smirnov Tests
ks.test(x,'pF')
##
## One-sample Kolmogorov-Smirnov test
##
## data: x
## D = 0.020647, p-value = 0.7875
## alternative hypothesis: two-sided
#Como el p-valor es aproximadamente 0.8, aceptamos que x sigue una
#distribucion Gamma(3,3)
3. Representar el histograma y compararlo con la densidad teórica.
hist(x, breaks="FD", freq=FALSE)
curve(df(x),col='red', add=TRUE)
# A simple vista el algoritmo propuesto funciona.
# x sigue una distribución Gamma(3,3)
Una compañia que vende ordenadores quiere determinar cuántas licencias de un determinado sistema operativo comprar a Microsoft para suministrarla con dichos ordenadores durante un año. Como el sistema operativo tiende a cambiar de un año para otro, la compañia querría comprar a Microsoft tantas licencias como ordenadores venda ese año, pero, evidentemente, esta cantidad le es desconocida de antemano.Una licencia del sistema operativo actual le cuesta a la compañia 75 euros y al suministrarla con el ordenador le genera unos ingresos brutos de 120 euros.
Cuando Microsoft lanza al mercado un nuevo sistema operativo, la compañia puede devolver las licencias sobrantes, recibiendo 60 euros por cada una (de los 75 que pagá). Además, la compañia ha estimado que la cantidad de ordenadores que puede vender en el año se distribuye según la siguiente distribución:
Demanda | Prob. |
---|---|
800 | 0.15 |
850 | 0.20 |
975 | 0.25 |
1200 | 0.30 |
1300 | 0.10 |
La cuestión que se plantea la compañia es cuántas licencias del sistema operativo solicita a Microsoft.
Se trata de un problema complicado, por lo que la empresa se plantea comparar las siguientes alternativas de pedido: 975, 1000, 1025, 1050, 1075 y 1100. Desarrolle un algoritmo para simular el beneficio y a partir de esto poder estimar el beneficio esperado de la compañia para cada uno de los tamaños de pedido contemplados.
Nota: Utilice los cuatro primeros dígitos de su CI, y utilice n=1000 escenarios (años) de simulación.
Como este ejercicio es un caso particular del problema del vendedor de periodicos, proponemos el siguiente algoritmo.
#====================================================================================
# DATOS INICIALES
#====================================================================================
s <- c(800,850,975,1200,1300)
p <- c(0.15,0.20,0.25,0.30,0.10)
#cp <- c(0.15,0.35,0.60,0.90,1)
#Ed <- sum(s*p)
#cv <- (120-75)/((120-75)+(75-60))
cu <- 120-75
co <- 75-60
ap <- c(975,1000,1025,1075,1100)
#====================================================================================
# GENERACIÓN POR TABLAS GUÍA.
#====================================================================================
rfmp.tabla <- function(x, prob = 1/length(x), m, nsim = 1000) {
Fx <- cumsum(prob)
g <- rep(1,m)
i <- 1
for(j in 2:m) {
while (Fx[i] < (j-1)/m) i <- i+1
g[j] <- i
}
# Generar valores
X <- numeric(nsim)
U <- runif(nsim)
for(j in 1:nsim) {
i <- g[floor(U[j]*m)+1]
while (Fx[i] < U[j]) i <- i + 1
X[j] <- x[i]
}
return(X)
}
#====================================================================================
# FIJAMOS LA SEMILLA Y EL TAMAÑO DE LA MUESTRA
#====================================================================================
set.seed(1727)
nsim <- 1000
#====================================================================================
#====================================================================================
# ALGORITMO PROPUESTO PARA DETERMINAR EL BENEFICIO PARA UNA ALTERNATIVA
#====================================================================================
benefit <- function(x,Q,nsim,cu){
beneficio <- numeric(nsim)
for (isim in 1:nsim) {
if(x[isim]>=Q ){beneficio[isim]<-(Q*cu)}
else{beneficio[isim]<-((x[isim])*cu)}
}
return(beneficio)
}
#====================================================================================
# ALGORITMO PROPUESTO PARA DETERMINAR LA PERDIDA PARA UNA ALTERNATIVA
#====================================================================================
loss <- function(x,Q,nsim,co){
perdida <- numeric(nsim)
for (isim in 1:nsim) {
if(x[isim]>=Q ){perdida[isim]<-(0)}
else{perdida[isim]<-((Q-x[isim])*co)}
}
return(perdida)
}
#=======================================================================================
#====================================================================================
# ALGORITMO PROPUESTO PARA DETERMINAR EL BENEFICIO, PERDIDA Y PROFIT
# PARA N ALTERNATIVAs
#====================================================================================
Beneficios_para_cada_alternativa <- function(y,nsim,cu,co){
beneficio_por_alternativa <- numeric(length(y))
perdida_por_alternativa <- numeric(length(y))
profit_por_alternativa <- numeric(length(y))
x <- rfmp.tabla(s,p,4,nsim)
for (asim in 1:length(y)) {
beneficio_por_alternativa[asim] <- (sum(benefit(x,y[asim],nsim,cu)))
perdida_por_alternativa[asim] <- (sum(loss(x,y[asim],nsim,co)))
profit_por_alternativa[asim] <- sum(benefit(x,y[asim],nsim,cu)-loss(x,y[asim],nsim,co))
}
return(data.frame("Alternativa"=y,"Beneficio"=beneficio_por_alternativa,"Perdida"=perdida_por_alternativa,"Profit"=profit_por_alternativa))
}
ejercicio_3 <- Beneficios_para_cada_alternativa(ap,nsim,cu,co)
## Alternativa Beneficio Perdida Profit
## 1 975 41560875 771375 40789500
## 2 1000 42005250 998250 41007000
## 3 1025 42449625 1225125 41224500
## 4 1075 43338375 1678875 41659500
## 5 1100 43782750 1905750 41877000