La variabile prezzo fra anni è data da
prezzo.corrente=1 rinfl= 1.02 spread=0.3 anno.corrente=2007 prezzofuturo = function(anno) { n=anno-anno.corrente s = rnorm(n,sd=spread) prezzo.corrente * rinfl^n * prod(1+s) } simprezzo= function(anno,N=10000) { prezzi = c() for (i in 1:N) { prezzi[i] = prezzofuturo(anno) } hist(prezzi,breaks=50) cat("stima del valore atteso : ",mean(prezzi)," +/- ",sqrt(var(prezzi)/N)," \n"); cat("stima della deviazione standard : ",sd(prezzi)," +/- ", sqrt((sum((prezzi-mean(prezzi))^4)/(N-1)-var(prezzi)^2)/N)," \n"); # calcoliamo la frazione oltre 3 e il suo errore piuditre = length(prezzi[prezzi > 3])/N dpiuditre = sqrt(piuditre*(1-piuditre)/N) cat("frazione oltre 3 euro: ",piuditre," +/- ",dpiuditre," \n"); } > simprezzo(2012) stima del valore atteso : 1.113915 +/- 0.008181212 stima della deviazione standard : 0.8181212 +/- 0.01719028 frazione oltre 3 euro: 0.0335 +/- 0.001799382 |
Si noti che il valore atteso e la deviazione standard avrebbero potuto essere stimati usando la formula di propagazione degli errori:
> atteso = prezzo.corrente * rinfl^5 > gsigma = atteso * spread * sqrt(5) > 1 - pnorm((3-atteso)/gsigma) [1] 0.005236028 |
ottenendo anzichè il valore corretto
ottenuto dalla simulazione.
Scriviamo la funzione densità e il generatore random usando il metodo
accept/reject di Von Neumann: generiamo coppie di punti distribuite
uniformemente negli intervalli
,
, e
accettiamo solo i punti tali che
dpol = function(x) { ifelse(x<0 | x>1 , 0,6*x*(1-x) ) } rpol = function(N) { out =c() for (i in 1:N) { y = runif(1,max=1.5) r = runif(1) while ( y > dpol(r) ) { y = runif(1,max=1.5) r = runif(1) } out[i]=r } out } # metodo alternativo (non garantisce la lunghezza del vettore prodotto): rpol2 = function(N) { x=runif(N) y=runif(N,max=1.5) x[y <= dpol(x)] } mysam=rpol(10000) hist(mysam,breaks=seq(0,1,0.05)) curve(dpol(x)*0.05*10000,add=T,col="red") |