A blog about data, information and IT, by Mario Alberich

Aug 26
2013

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]

Tags

gestión documental 10     Recuperación información 11     Linux 7     Usabilidad 5     open source 3     Tagging 12     lógica borrosa 2     fuentes de información 12     Google 6     off-topic 6     spam 2     grafos 6     Web social 11     modelización 12     Productividad 11     buscadores 2     utilidades 17     Profesionales 9     SEO 5     estándares 3     veracidad 3     relevancia 2     lingüística 2     PLN 2     lenguajes documentales 2     apis-mashups 3     reseñas 7     Flash 7     Gráficos estadísticos 13     Publicidad 3     Innovación 5     muestreo estadístico 9     PHP 14     internet 2     testeo 12     desarrollo 3     visualizacion 36     javascript 16     datos abiertos 9     elecciones 2     simulación 5     html5 7     phing 9     ssh 2     seguridad 3     indicadores 2     demografía 3     media 2     algoritmos 7     shell 4     mysql 2     backup 2     big data 6     twitter 2     d3js 11     revealjs 2     metodología 6     data-journalism 6     smartcities 2     NYT 2     privacidad 3     benchmarking 4     recopilaciones 21     magento 5     formacion 2     github 2     HHVM 3     psicología 2     angularjs 3     grep 2     nodejs 5     promises 2     mapreduce 3     crossfilter 2     exploración de datos 2     machine learning 2    

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