| Ticket UUID: | 1846943 | |||
| Title: | Gamma distribution | |||
| Type: | RFE | Version: | None | |
| Submitter: | erickb | Created on: | 2007-12-08 17:37:50 | |
| Subsystem: | math | Assigned To: | arjenmarkus | |
| Priority: | 5 Medium | Severity: | ||
| Status: | Closed | Last Modified: | 2008-01-11 18:19:38 | |
| Resolution: | Closed By: | arjenmarkus | ||
| Closed on: | 2008-01-11 11:19:38 | |||
| Description: |
Hello, I'm submitting code for gamma-distributed random variables. It uses the file "incgamma.tcl" for the incomplete gamma function that I recently submitted. The provided functions are: cdf-gamma pdf-gamma random-gamma I've tested some values for the cdf & pdf against the corresponding functions pgamma & dgamma in R. For the random deviates, I looked at the histogram output (also provided in the package) and eyeballed the correspondence with plots of the gamma distribution. Eric | |||
| User Comments: |
arjenmarkus added on 2008-01-11 18:19:38:
Logged In: YES user_id=400048 Originator: NO Incorporated this code erickb added on 2008-01-01 05:42:25: Logged In: YES user_id=816411 Originator: YES Note that the zip file contains all of the fixes mentioned in previous posts. Also, it includes the incomplete gamma function. Finally, it puts everything in a "gamma" namespace (which I expect you'll move over to the math::statistics namespace). erickb added on 2008-01-01 05:41:16: File Deleted - 257779: erickb added on 2008-01-01 05:40:54: File Added - 260324: gamma.zip Logged In: YES user_id=816411 Originator: YES This is not a change to the basic code. Instead, it's just rearranging the testing code a bit. I'm attaching a zip file with all of the needed files to run the tests. The code itself is (almost) stand-alone: just a few calls to "simple test" (also included). File Added: gamma.zip erickb added on 2007-12-09 04:52:35: Logged In: YES
user_id=816411
Originator: YES
Also, adding a better way to test the random deviates. Now for the testing routine, add the pdf to the histogram of values. Here's the revised testing code:
##########################################################################################
##
## TESTING
##
## Can test pdf & cdf by running in a console. For random numbers, generate histograms:
##
##########################################################################################
canvas .c
pack .c -side top
frame .f
pack .f -side bottom
label .f.alphal -text "alpha"
entry .f.alphae -textvariable alpha
pack .f.alphal -side left
pack .f.alphae -side left
label .f.betal -text "beta"
entry .f.betae -textvariable beta
pack .f.betal -side left
pack .f.betae -side left
button .f.run -text "Run" -command runtest
pack .f.run -side left
proc runtest {} {
set vals [random-gamma $::alpha $::beta 5000]
set remainder 5000
for {set x 0.0} {$x < 20.0} {set x [expr {$x + 0.25}]} {
lappend bins $x
set distvallow [pdf-gamma $::alpha $::beta $x]
set distvalhigh [pdf-gamma $::alpha $::beta [expr {$x + 0.25}]]
# Total trials (5000) * step (0.25) * average value
set distval [expr {int(5000 * 0.25 * 0.5 * ($distvallow + $distvalhigh))}]
lappend distcounts $distval
}
# Assume none are left
lappend distcounts 0.0
set bincounts [::math::statistics::histogram $bins $vals]
.c delete hist
.c delete dist
math::statistics::plot-scale .c 0 20 0 [math::statistics::max $bincounts]
math::statistics::plot-histogram .c $bincounts $bins hist
math::statistics::plot-histogram .c $distcounts $bins dist
.c itemconfigure dist -fill {} -outline green
}
set alpha 1
set beta 0.5
runtest
erickb added on 2007-12-09 04:28:38: Logged In: YES
user_id=816411
Originator: YES
There was an error in random-gamma. Here is the corrected version:
# Generate a list of gamma-distributed random deviates
# Use Cheng's envelope rejection method, as documented
# in Dagpunar, J.S. 2007. "Simulation and Monte Carlo:
# With Applications in Finance and MCMC"
proc random-gamma {alpha beta number} {
if {$alpha <= 1} {
set lambda $alpha
} else {
set lambda [expr {sqrt(2.0 * $alpha - 1.0)}]
}
set retval {}
for {set i 0} {$i < $number} {incr i} {
while {1} {
# Two rands: one for deviate, one for acceptance/rejection
set r1 [expr {rand()}]
set r2 [expr {rand()}]
# Calculate deviate from enveloping proposal distribution (a Lorenz distribution)
set lnxovera [expr {(1.0/$lambda) * (log(1.0 - $r1) - log($r1))}]
if {![catch {expr {$alpha * exp($lnxovera)}} x]} {
# Apply acceptance criterion
if {log(4.0*$r1*$r1*$r2) < ($alpha - $lambda) * $lnxovera + $alpha - $x} {
break
}
}
}
lappend retval [expr {1.0 * $x/$beta}]
}
return $retval
}
erickb added on 2007-12-09 00:37:50: File Added - 257779: gammadist.tcl | |||
Attachments:
- gamma.zip [download] added by erickb on 2008-01-01 05:40:54. [details]
