A blog about data, information and Tech by Mario Alberich

        

Simular un valor exponencial

La distribución exponencial es una distribución especialmente importante en estadística.  Sirve para modelizar el tiempo que transcurre entre dos eventos independientes, y durante los cuales transcurren, por término medio, el mismo tiempo. También se la reconoce por ser la otra cara de la moneda de los procesos de Poisson, de los que hablaré en otro momento.

La distribución exponencial es una distribución continua (digámoslo rápido: el tiempo que transcurre entre dos eventos es un número real, con potencialmente infinitos decimales), que se define por la fórmula (vía wikipedia):

Esto básicamente quiere decir que la distribución exponencial empieza a operar a partir de cero (los tiempos negativos tampoco tienen sentido aquí), y su forma es:

Para los diferentes valores, vemos que a medida que el valor de λ aumenta, la función de densidad se hace más picuda, lo cual significa que la probabilidad se concentra en los primeros intervalos de tiempo. En realidad, el valor de λ determina la media y varianza de esta distribución.

Por su lado, la función de distribución (es decir, el acumulado anterior, que se obtiene calculando la integral de la fórmula anterior), es:

 

Y su fórmula:

Lo cual puedes comprobar si integras la función anterior.

Simular el valor a partir de la función de distribución


La función de distribución tiene dos características interesantes para la simulación:

  • El rango de valores de la probabilidad (eje vertical) oscila entre 0 y 1.
  • Para cada valor entre 0 y 1, sólo hay una correspondencia con el valor a simular.


¿Ves por dónde voy? Con la función de distribución, podemos:

  • Simular un valor u entre cero y uno, utilizando un generador aleatorio (cualquier hoja de cálculo, lenguaje de programación y paquete estadístico tiene esa función).
  • Obtener el valor de x a partir de u.


En el caso de la distribución exponencial, la fórmula a aplicar sería:

[math]x=\frac{-ln(u)}{\lambda}[/math]

[d3-link]

[/d3-link]

Puedes ver la forma que tiene un histograma (D3.js) al simular 500 valores de una Exponencial (con valor λ=0.5):

[d3-source canvas="chart"]
var
svg = null,
bars = null,

generator = function() {
var
lambda = 0.5,

simulations = 500,

barWidth = 9,

barsScale = d3.scale.linear()
.domain([0, 10 / lambda])
.range([0,29]);

barXScale = d3.scale.linear()
.domain([0, 10 / lambda])
.range([0,270]);

var dataset = exponentialGen(lambda, simulations, barsScale),

barYScale = d3.scale.linear()
.domain([0, d3.max(dataset, function(d) { return d;})])
.range([270, 0]),

yAxis = d3.svg.axis()
.scale(barYScale)
.orient("left")
.ticks(5),

xAxis = d3.svg.axis()
.scale(barXScale)
.orient("bottom")
.ticks(4);

if (svg !== null) {
bars = svg.selectAll("rect")
.data(dataset);

bars.enter();
} else {
svg = d3.select(".chart")
.append("svg")
.attr("width", 400)
.attr("height", 300);

bars = svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect");
}

svg.selectAll("g.axis").remove();

svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(30,0)")
.call(yAxis);

svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(30,270)")
.call(xAxis);

bars.attr("x", function(d,i) {
return 32 + i * (barWidth + 1);
})
.attr("y", function(d) {
return 270-d;
})
.attr("width", barWidth)
.attr("height", function(d) {
return d;
})
.attr("fill", "blue");
},

exponentialGen = function(lambda, simulations, barXScale) {
var datum = [];
for(var row = 0; row < 30; row++) {
datum.push(0);
}

for(var i = 0; i < simulations; i++) {
var u = Math.random();
var barNumber = barXScale(-Math.log(u)/lambda);
datum[Math.floor(barNumber)]++;
}
return datum;
};

generator();
[/d3-source]

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.