Alegrías de Geek: CDF para Chi-cuadrado calculado y por simulación

Enviado por clbustos el Vie, 29/08/2008 - 00:10.

Como me toca trabajar haciendo estadísticas de bases de datos variadas, siempre había tenido la idea de programar en ruby (mi lenguaje de preferencia) las funciones de formateo y estadísticas que con más frecuencia utilizaba. En particular, me interesaba implementar las funciones de estimación de parámetros para muestras estratificadas y por conglomerado, que ningún paquete estadístico que conozca ofrece fácilmente.

Hace un par de semanas comencé a trabajar en el paquete estadístico, el cual llamé 'RubySS'. Ya tengo listas la clase Vector (similar a la Vector de la biblioteca estándar) y Dataset, con una extensión para calcular las distribuciones acumuladas para las distribuiones chi, t y normal, entre otras. Utiliza Ruby/GSL si está disponible, para acelerar los cálculos y, como corresponde, casi todas las funciones tienen su test de regresión correspondiente.

Si quieren mirar el código o bajar una versión de prueba, háganlo en http://code.google.com/p/ruby-statsample/

Lo que me tiene contento ahora es una simulación que permite observar como el cálculo de chi cuadrado en 1000 muestras aleatorias de una población compuesta por tres tipos de ítemes (grados de libertad = 2) es casi idéntica a la distribución calculada teóricamente.

El código es

  1.  require File.dirname(__FILE__)+'/../lib/rubyss'
  2.  require 'rbgsl'
  3.  require 'rubyss/resample'
  4.  require 'distributions/cdf'
  5.  require 'matrix'
  6.  ideal=Matrix[[30,30,40]]
  7.  tests=2000
  8.  monte=RubySS::Resample.repeat_and_save(tests) do
  9.   observed=[0,0,0]
  10.   (1..100).each do |i|
  11.   r=rand(100)
  12.   if r<30
  13.   observed[0]+=1
  14.   elsif r<60
  15.   observed[1]+=1
  16.   else
  17.   observed[2]+=1
  18.   end
  19.   end
  20.   (RubySS::matrix_chi_square(Matrix[observed],ideal)*100).round / 100.to_f
  21.   # /
  22.  end
  23.  
  24.  
  25.  
  26.  v=monte.to_vector(:scale)
  27.  x=[]
  28.  y=[]
  29.  y2=[]
  30.  
  31.  prev=0
  32.  
  33.  v.frequencies.sort.each{|k,v|
  34.   x.push(k)
  35.   y.push(prev+v)
  36.   prev=prev+v
  37.   cdf_chi=CdfDistributions.chi_square_p(k,2)
  38.   y2.push(cdf_chi*tests)
  39.  
  40.  }
  41.  GSL::graph(GSL::Vector.alloc(x), GSL::Vector.alloc(y),GSL::Vector.alloc(y2),"-T png -C -L 'cdf calculado y por montecarlo' > montecarlo_cdf.png")
AdjuntoTamaño
montecarlo_cdf.png5.48 KB

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
If you have a Gravatar account, used to display your avatar.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato