Modelos de probabilidad en R Contents Probabilidades Discretas 1 Ejemplo: suma de la cara de dos dados................................. 1 Distribución Binomial:........................................... 3 Distribución Poisson:............................................ 8 Probabilidades Continuas 11 Ejemplo: una varible distribuida normalmente (estándar)....................... 11 Cambiando los parámetros de una curva normal............................ 14 Distribucion T Student.......................................... 16 Distribucion Log Normal.......................................... 18 Chi Cuadrado................................................ 21 Distribución Beta.............................................. 22 Ejemplo: a una variable específica, ajustar la curva normal...................... 27 Estimar los parametros: normal...................................... 29 Estimar los parametros: t student.................................... 31 Comparamos el ajuste normal y t student................................ 32 En este tutorial vamos a R para reforzar los conceptos de probabilidad vistos en clase y darles un mayor sentido y aplicabilidad. Se abordarán los principales modelos de probabilidad discreta y continua. Más adelante se verá su utilidad en finanzas. Probabilidades Discretas Ejemplo: suma de la cara de dos dados Gráfico de la Función de Masa (o densidad) y la Función de Distribución #Sabemos que la suma de dos dados se encuentra entre 2 y 12 x<-2:12 #Conocemos también la cantidad de casos favorables para cada suma #y lo divimos entre el total de casas (36) p<-c(1:6,5:1)/36 #Graficamos la función de masa f(x) plot(x,p,type="h",ylim=c(0,0.2),xlab=expression(x[i]),ylab=expression(p[i])) points(x,p,pch=19) 1
p i 0.00 0.05 0.10 0.15 0.20 2 4 6 8 10 12 x i #Graficamos la función de distribución F(x) plot.ecdf(outer(1:6,1:6,"+"),ylab=expression(f[x](x)),main="") 2
F X (x) 0.0 0.2 0.4 0.6 0.8 1.0 2 4 6 8 10 12 x Distribución Binomial: Suponga que un gerente de crédito de American Express ha descubierto que históricamente 7.82% (p) de los usurios de tarjetas han experimentado problemas con el róbo o pérdida de su tarjeta. Por lo cual para efectos de preveer la cantidad de reposiciones en el próximo año desea saber la probabilidad de que: De una sucursal que atiende 1,000 personas, exactamente 68 personas necesiten reponer su tarjeta #Identifico los parámetros x<-68 p<-0.0782 n<-1000 #uso la función de masa o densidad (esto es la probabilidad puntual) dbinom(x,size=n,prob=p) ## [1] 0.02358542 De una sucursal que atiende 1,000 personas, menos de 80 personas necesiten reponer su tarjeta #Identifico los parámetros x<-80 3
p<-0.0782 n<-1000 #uso la función de distribución (acumulada hacia atrás) pbinom(x,size=n,prob=p) ## [1] 0.612633 De una sucursal que atiende 1,000 personas, más de 80 personas necesiten reponer su tarjeta #Identifico los parámetros x<-80 p<-0.0782 n<-1000 #uso la función de distribución 1-pbinom(x,size=n,prob=p) ## [1] 0.387367 De una sucursal que atiende 1,000 personas, entre 25 y 85 personas necesiten reponer su tarjeta #Identifico los parámetros x1<-85 x2<-25 p<-0.0782 n<-1000 #uso la función de distribución p1<-pbinom(x1,size=n,prob=p) p2<-pbinom(x2,size=n,prob=p) p1-p2 ## [1] 0.8062933 De una sucursal que atiende 1,000 personas, más de 110 personas necesiten reponer su tarjeta #Identifico los parámetros x<-110 p<-0.0782 n<-1000 #uso la función de distribución 1-pbinom(x,size=n,prob=p) ## [1] 0.0001503321 Podemos ver graficamente el fenómeno 4
#Primer forma es con una función creada por nosotros mismos #Defino los parámetros p<-0.0782 n<-1000 #Uso la función de densidad (que brinda las probabilidades no acumuladas como en pbinom) x<-dbinom(0:n,size=n,prob=p) #Grafico barplot(x,names.arg=0:n,main=sprintf(paste('bin. dist. ',n,p,sep=':')), xlab="personas que reponen tarjeta",ylab="densidad") #Ahora podemos agrupar todo dentro de una nueva función g.bin<-function(n,p){ x<-dbinom(0:n,size=n,prob=p) barplot(x,names.arg=0:n,main=sprintf(paste('bin. dist. ',n,p,sep=':')), xlab="personas que reponen tarjeta",ylab="densidad") } p<-0.0782 n<-1000 g.bin(n,p) bin. dist. :1000:0.0782 Densidad 0.00 0.01 0.02 0.03 0.04 0 58 135 221 307 393 479 565 651 737 823 909 995 Personas que reponen tarjeta 5
#Ahora puedo reducir el eje x en el gráfico para amplificar el área donde ocurren los casos g.bin<-function(n,p,r){ x<-dbinom(0:n,size=n,prob=p) barplot(x,names.arg=0:n,main=sprintf(paste('bin. dist. ',n,p,sep=':')), xlab="personas que reponen tarjeta",ylab="densidad",xlim=c(0,n/r)) } #La mitad del largo del eje p<-0.0782 n<-1000 r<-2 g.bin(n,p,r) bin. dist. :1000:0.0782 Densidad 0.00 0.01 0.02 0.03 0.04 0 24 52 80 112 148 184 220 256 292 328 364 400 436 Personas que reponen tarjeta #Un quinto del largo del eje p<-0.0782 n<-1000 r<-5 g.bin(n,p,r) 6
bin. dist. :1000:0.0782 Densidad 0.00 0.01 0.02 0.03 0.04 0 8 18 30 42 54 66 78 90 103 118 133 148 163 178 Personas que reponen tarjeta #Un décimo del largo del eje p<-0.0782 n<-1000 r<-10 g.bin(n,p,r) 7
bin. dist. :1000:0.0782 Densidad 0.00 0.01 0.02 0.03 0.04 0 4 8 13 19 25 31 37 43 49 55 61 67 73 79 85 91 Personas que reponen tarjeta Distribución Poisson: Suponga que en el mercado cambiario se espera que sucedan en promedio 25 calces o transacciones cada hora. Si se asume que las transacciones siguen una distribución de Poisson. Entonces encuentre la probabilidad de que: En una hora específica, sucedan exactamente 19 transacciones #Identifico los parámetros x<-19 h<-25 #uso la función de distribución (acumulada hacia atrás) dpois(x,lambda=h) ## [1] 0.04153397 En una hora específica, suceda al menos 30 transacciones #Identifico los parámetros x<-30 h<-25 #uso la función de distribución (acumulada hacia atrás) 1-ppois(x,lambda=h) 8
## [1] 0.1366911 ppois(x,lambda=h,lower=false) ## [1] 0.1366911 En una hora específica, sucedan menos de 10 transacciones #Identifico los parámetros x<-10 h<-25 #uso la función de distribución (acumulada hacia atrás) ppois(x,lambda=h) ## [1] 0.0005864616 Podemos ver graficamente el fenómeno #Creo una nueva función g.poi<-function(y,h){ x<-dpois(0:x,lambda=h) barplot(x,names.arg=0:y,main=sprintf(paste('poi. dist. ',y,h,sep=':')), xlab="calces en el mercado",ylab="densidad") } x<-20 h<-25 g.poi(x,h) 9
poi. dist. :20:25 Densidad 0.00 0.01 0.02 0.03 0.04 0.05 0 1 2 3 4 5 6 7 8 9 11 13 15 17 19 Calces en el mercado #Ampliamos la cantidad de calces de interés x<-75 h<-25 g.poi(x,h) 10
poi. dist. :75:25 Densidad 0.00 0.02 0.04 0.06 0 4 8 13 19 25 31 37 43 49 55 61 67 73 Calces en el mercado Probabilidades Continuas Ejemplo: una varible distribuida normalmente (estándar) #Se fija la "semilla" para la generación de números aleatorios set.seed(3000) #Creamos un vector de los valores para el eje x xseq<-seq(-4,4,0.01) #Creamos un vector de los valores para el eje y de la densidad den<-dnorm(xseq,0,1) #Creamos un vector de los valores para el eje y de la densidad acumulada cumul<-pnorm(xseq,0,1) #Generar numeros aleatorios random<-rnorm(1000,0,1) #1000 numeros aleatorios de una normal estándar (media=0 y sd=1) #Gráfico de la densidad plot(xseq,den,col="darkgreen",xlab="",ylab="densidad",type="l",lwd=2, cex=2,main="f(x) Normal Estándar",cex.axis=.8) 11
f(x) Normal Estándar Densidad 0.0 0.1 0.2 0.3 0.4 4 2 0 2 4 plot(xseq,cumul,col="darkorange",xlab="",ylab="probabilidad Acumulada", type="l",lwd=2,cex=2,main="f(x) Normal Estándar", cex.axis=.8) 12
F(x) Normal Estándar Probabilidad Acumulada 0.0 0.2 0.4 0.6 0.8 1.0 4 2 0 2 4 hist(random,main="números Aleatorios Normal Estándar", cex.axis=.8, xlim=c(-4,4)) 13
Números Aleatorios Normal Estándar Frequency 0 50 100 150 200 4 2 0 2 4 random Cambiando los parámetros de una curva normal #Creamos un vector de los valores para el eje x x1<-seq(-15,25,0.1) mu<-5 sig1<-1 sig2<-2 sig3<-4 sig4<-8 #Creamos un vector de los valores para el eje y de la densidad den1<-dnorm(x1,mu,sig1) den2<-dnorm(x1,mu,sig2) den3<-dnorm(x1,mu,sig3) den4<-dnorm(x1,mu,sig4) plot(x1,den1,col="black",xlab="",ylab="densidad",type="l",lwd=2, cex=2,main="f(x) Normal Estándar",cex.axis=.8) lines(x1,den2,col="blue",type="l",lwd=2,cex=2) lines(x1,den3,col="green",type="l",lwd=2,cex=2) lines(x1,den4,col="red",type="l",lwd=2,cex=2) legend(-14,0.4,legend=c("n~(5,1)","n~(5,2)","n~(5,4)","n~(5,8)"),lty=1, col=c("black","blue","green","red")) 14
f(x) Normal Estándar Densidad 0.0 0.1 0.2 0.3 0.4 N~(5,1) N~(5,2) N~(5,4) N~(5,8) 10 0 10 20 #Creamos un vector de los valores para el eje y de la densidad acumulada cum1<-pnorm(x1,mu,sig1) cum2<-pnorm(x1,mu,sig2) cum3<-pnorm(x1,mu,sig3) cum4<-pnorm(x1,mu,sig4) plot(x1,cum1,col="black",xlab="",ylab="probabilidad Acumulada", type="l",lwd=2,cex=2,main="f(x) Normal Estándar", cex.axis=.8) lines(x1,cum2,col="blue",type="l",lwd=2,cex=2) lines(x1,cum3,col="green",type="l",lwd=2,cex=2) lines(x1,cum4,col="red",type="l",lwd=2,cex=2) 15
F(x) Normal Estándar Probabilidad Acumulada 0.0 0.2 0.4 0.6 0.8 1.0 10 0 10 20 Distribucion T Student #Vamos a observar cual es la forma de la distribucion #con 1 grado de libertad x<-seq(-3,to=3,length=100) plot(x,dt(x,1),type="l",ylab="density") 16
Density 0.05 0.15 0.25 3 2 1 0 1 2 3 x #Generamos varias T Student con distintos grados de libertad plot(x,dt(x,1),type="n",ylab="density",ylim=c(0,0.4)) for (i in 0:6){ lines(x,dt(x,df=2^i),col=i+2) legend("topright",legend=2^(0:6),col=2:8,lty=1,bty="n") } 17
Density 0.0 0.1 0.2 0.3 0.4 1 2 4 8 16 32 64 3 2 1 0 1 2 3 x Distribucion Log Normal #Vamos a observar cual es la forma de la distribucion log normal x<-seq(-1,to=5,length=100) plot(x,dlnorm(x),type="l",ylab="density") 18
Density 0.0 0.1 0.2 0.3 0.4 0.5 0.6 1 0 1 2 3 4 5 x #Generamos valores aleatorio log normal x<-rlnorm(1000,2,1) hist(x,prob=true,ylim=c(0,0.1)) curve(dlnorm(x,mean=2,sd=1), add=true,col="red",lwd=2) 19
Histogram of x Density 0.00 0.02 0.04 0.06 0.08 0.10 0 20 40 60 80 100 120 x #Entonces si sacamos el logaritmo, se debe parece a una normal y<-log(x) hist(y,prob=true) curve(dnorm(x,mean=2,sd=1), add=true,col="red",lwd=2) 20
Histogram of y Density 0.0 0.1 0.2 0.3 0.4 1 0 1 2 3 4 5 y Chi Cuadrado #Vamos a observar cual es la forma de la distribucion #con 1 grado de libertad x<-seq(0,to=50,length=150) plot(x,dchisq(x,df=1),type="l",ylab="density") #Generamos varias Chi cuadrado con distintos grados de libertad plot(x,dchisq(x,df=1),type="l",ylab="density") for (i in 1:6){ lines(x,dchisq(x,df=2^i),col=i+1) legend("topright",legend=2^(0:6),col=1:7,lty=1,bty="n") } 21
Density 0.0 0.1 0.2 0.3 0.4 0.5 0.6 1 2 4 8 16 32 64 0 10 20 30 40 50 x Distribución Beta #Vamos a observar cual es la forma de la distribucion #Parámetros alpha y beta #con parámetros (1,1) grado de libertad x<-seq(0,to=1,length=100) plot(x,dbeta(x,1,1),type="l",ylab="density") #Corresponde a una uniforme 22
Density 0.6 0.8 1.0 1.2 1.4 0.0 0.2 0.4 0.6 0.8 1.0 x #con parámetros (1,2) grado de libertad x<-seq(0,to=1,length=100) plot(x,dbeta(x,1,2),type="l",ylab="density") 23
Density 0.0 0.5 1.0 1.5 2.0 0.0 0.2 0.4 0.6 0.8 1.0 x #con parámetros (2,1) grado de libertad x<-seq(0,to=1,length=100) plot(x,dbeta(x,2,1),type="l",ylab="density") 24
Density 0.0 0.5 1.0 1.5 2.0 0.0 0.2 0.4 0.6 0.8 1.0 x #con parámetros (2,2) grado de libertad x<-seq(0,to=1,length=100) plot(x,dbeta(x,2,2),type="l",ylab="density") 25
Density 0.0 0.5 1.0 1.5 0.0 0.2 0.4 0.6 0.8 1.0 x #Generamos varias beta con distintos parámetros #Se definen vectores con los valores de parámetrso de la distribución y del gráfico a.seq<-c(1:6,0.8,0.4,0.2,1,0.5,2) b.seq<-c(1:6,0.8,0.4,0.2,4,4,4) col<-c(1:6,1:6) lty<-rep(1:2,each=6) plot(x,dbeta(x,1,1),type="l",ylab="density",xlab="x",xlim=c(0,1.3),ylim=c(0,3)) for(i in 2:length(a.seq)){ lines(x,dbeta(x,a.seq[i],b.seq[i]),col=col[i],lty=lty[i]) legend("topright",legend=c(expression(list(alpha,beta)), paste(a.seq,b.seq)),col=c(na,col),lty=c(na,lty),cex=0.9,bty=n) } 26
Density 0.0 0.5 1.0 1.5 2.0 2.5 3.0 α, β 1 1 2 2 3 3 4 4 5 5 6 6 0.8 0.8 0.4 0.4 0.2 0.2 1 4 0.5 4 2 4 0.0 0.2 0.4 0.6 0.8 1.0 1.2 x Ejemplo: a una variable específica, ajustar la curva normal #Cargamos paquetes library(timeseries) ## Loading required package: timedate #Cargamos una base de datos nueva rm(list=ls()) setwd("g:/ucr TR-ESTADISTICA/Curso 21-07-17/Clase 1") data<-as.timeseries(read.csv("simmac.csv",sep=";")) head(data) ## GMT ## Bond.US r1 US.Stock r2 Latin.Stock r3 ## 2000-01-03 143.565 0.0002577 11357.51-0.0316592 1106.84-0.0740486 ## 2000-01-04 143.602 0.0002577 10997.94-0.0316592 1024.88-0.0740486 ## 2000-01-05 143.625 0.0001602 11122.66 0.0113403 1047.38 0.0219538 ## 2000-01-06 143.660 0.0002437 11253.27 0.0117427 1031.75-0.0149230 ## 2000-01-07 143.692 0.0002227 11522.56 0.0239299 1073.75 0.0407075 ## 2000-01-10 143.750 0.0004036 11572.20 0.0043081 1115.37 0.0387614 #Redondeamos los retornos de los índices y los convertimos en puntos básicos ret.datos<-round(returns(data),6)*100 ## Warning in log(data): Se han producido NaNs 27
head(ret.datos) ## GMT ## Bond.US r1 US.Stock r2 Latin.Stock r3 ## 2000-01-10 0.0404 59.4599 0.4299-171.4632 3.8029-4.8987 ## 2000-01-14 0.0139-33.6780 1.2061 149.8206 2.6466-48.1271 ## 2000-01-26 0.0160 65.0849 0.0281-194.8651 1.0297 373.6607 ## 2000-03-01 0.0228-8.6902 0.0949-224.0976 2.8484 226.9099 ## 2000-03-02 0.0166-31.8563 0.2659 103.0694 3.5632 22.7523 ## 2000-03-03 0.0138-18.2804 1.9704 201.1519 1.8614-65.7876 #Hacemos el histograma y sobreponemos la curva x<-seq(-4,4,.01) hist(ret.datos$r3,prob=true,ylim=c(0,0.004),breaks=20) curve(dnorm(x,mean(ret.datos$r3),sd(ret.datos$r3)), add=true,col="darkblue",lwd=2) Histogram of ret.datos$r3 Density 0.000 0.001 0.002 0.003 0.004 400 200 0 200 400 ret.datos$r3 #Probar estadisticamente la normalidad shapiro.test(ret.datos$r3) ## ## Shapiro-Wilk normality test ## ## data: ret.datos$r3 ## W = 0.98078, p-value = 3.115e-05 #Si el p value es menor que 0.05, entonces se puede asumir normalidad 28
#Usar QQ plot #Famoso grafico QQ-Plot qqnorm(ret.datos$r3) qqline(ret.datos$r3, col=2) Normal Q Q Plot Sample Quantiles 400 0 200 400 3 2 1 0 1 2 3 Theoretical Quantiles Estimar los parametros: normal #Instalo el paquete #install.packages("fitdistrplus") library(fitdistrplus) ## Warning: package 'fitdistrplus' was built under R version 3.4.1 ## Loading required package: MASS ## Loading required package: survival #Comando para la estimacion f1<-fitdist(ret.datos$r3,"norm") f1 ## Fitting of the distribution ' norm ' by maximum likelihood ## Parameters: ## estimate Std. Error ## mean 1.472484 6.712510 ## sd 135.419521 4.746456 29
names(f1) ## [1] "estimate" "method" "sd" "cor" "vcov" ## [6] "loglik" "aic" "bic" "n" "data" ## [11] "distname" "fix.arg" "fix.arg.fun" "dots" "convergence" ## [16] "discrete" "weights" plot(f1) Empirical and theoretical dens. Q Q plot Density 0.0000 0.0025 600 200 0 200 400 Empirical quantiles 400 200 400 200 0 200 400 Data Theoretical quantiles CDF 0.0 0.6 Empirical and theoretical CDFs 600 200 0 200 400 Empirical probabilities 0.0 0.6 P P plot 0.0 0.2 0.4 0.6 0.8 1.0 Data Theoretical probabilities #No hay mucha diferencia con las estimaciones de la media y desviacion que calculamos antes hist(ret.datos$r3,prob=true,ylim=c(0,0.004),breaks=20) curve(dnorm(x,mean(ret.datos$r3),sd(ret.datos$r3)), add=true,col="darkblue",lwd=2) curve(dnorm(x,f1$estimate[1],f1$estimate[2]), add=true,col="red",lwd=2) 30
Histogram of ret.datos$r3 Density 0.000 0.001 0.002 0.003 0.004 400 200 0 200 400 ret.datos$r3 Estimar los parametros: t student #Instalar paquete #install.packages("metrology") library(metrology) ## Warning: package 'metrology' was built under R version 3.4.1 ## ## Attaching package: 'metrology' ## The following objects are masked from 'package:base': ## ## cbind, rbind #Comando para la estimacion x<-seq(-4,4,.01) f2<-fitdistr(ret.datos$r3,"t",start=list(m=mean(ret.datos$r3),s=sd(ret.datos$r3),df=1)) ## Warning in dt((x - m)/s, df, log = TRUE): NaNs produced ## Warning in dt((x - m)/s, df, log = TRUE): NaNs produced ## Warning in dt((x - m)/s, df, log = TRUE): NaNs produced ## Warning in dt((x - m)/s, df, log = TRUE): NaNs produced 31
## Warning in dt((x - m)/s, df, log = TRUE): NaNs produced f2 ## m s df ## 2.548267 104.322667 4.522365 ## ( 6.020630) ( 6.929205) ( 1.135969) names(f2) ## [1] "estimate" "sd" "vcov" "loglik" "n" #Sobreponemos la curva t hist(ret.datos$r3,prob=true,ylim=c(0,0.004),breaks=20) curve(dt.scaled(x,df=f2$estimate[3],mean=f2$estimate[1],sd=f2$estimate[2]), add=true,col="darkblue",lwd=2) Histogram of ret.datos$r3 Density 0.000 0.001 0.002 0.003 0.004 400 200 0 200 400 ret.datos$r3 Comparamos el ajuste normal y t student #Sobreponemos la curva t y la normal hist(ret.datos$r3,prob=true,ylim=c(0,0.004),breaks=20) curve(dt.scaled(x,df=f2$estimate[3],mean=f2$estimate[1],sd=f2$estimate[2]), add=true,col="darkblue",lwd=2) curve(dnorm(x,f1$estimate[1],f1$estimate[2]),add=true,col="red",lwd=2) 32
Histogram of ret.datos$r3 Density 0.000 0.001 0.002 0.003 0.004 400 200 0 200 400 ret.datos$r3 33