
Cleaned up expected value code a little Refactored running statistics objects (hid private fields, added `update-statistics*') Documented expected value functions and running statistics Removed `bfpsi0' from bigfloat tests (DrDr's libmpfr doesn't have it) Commented out custodian shutdown callback that frees MPFR's cache (something's broken)
132 lines
6.1 KiB
Racket
132 lines
6.1 KiB
Racket
#lang typed/racket/base
|
|
|
|
(require racket/sequence
|
|
"../../base.rkt"
|
|
"statistics-utils.rkt")
|
|
|
|
(provide mean
|
|
variance/mean
|
|
stddev/mean
|
|
skewness/mean
|
|
kurtosis/mean
|
|
variance
|
|
stddev
|
|
skewness
|
|
kurtosis)
|
|
|
|
(: mean (case-> ((Sequenceof Real) -> Real)
|
|
((Sequenceof Real) (Option (Sequenceof Real)) -> Real)))
|
|
(define (mean xs [ws #f])
|
|
(cond [ws (let-values ([(xs ws) (sequences->weighted-samples 'mean xs ws)])
|
|
(define n (sum ws))
|
|
(cond [(zero? n) +nan.0]
|
|
[else (/ (sum (map * xs ws)) n)]))]
|
|
[else (let ([xs (sequence->list xs)])
|
|
(define n (length xs))
|
|
(cond [(zero? n) +nan.0]
|
|
[else (/ (sum xs) n)]))]))
|
|
|
|
(: variance* (Symbol Real (Sequenceof Real) (Option (Sequenceof Real)) (U #t #f Real)
|
|
-> Nonnegative-Real))
|
|
(define (variance* name m xs ws bias)
|
|
(define-values (xs^2 n)
|
|
(cond [ws (let-values ([(xs ws) (sequences->weighted-samples name xs ws)])
|
|
(values (map (λ: ([x : Real] [w : Real]) (* w (sqr (- x m)))) xs ws)
|
|
(max 0 (sum ws))))]
|
|
[else (let ([xs (sequence->list xs)])
|
|
(values (map (λ: ([x : Real]) (sqr (- x m))) xs)
|
|
(length xs)))]))
|
|
(cond [(zero? n) +nan.0]
|
|
[else
|
|
(define m2 (max 0 (/ (sum xs^2) n)))
|
|
(adjust-variance m2 n bias)]))
|
|
|
|
(: skewness* (Symbol Real (Sequenceof Real) (Option (Sequenceof Real)) (U #t #f Real) -> Real))
|
|
(define (skewness* name m xs ws bias)
|
|
(define-values (xs^2 xs^3 n)
|
|
(cond [ws (let-values ([(xs ws) (sequences->weighted-samples name xs ws)])
|
|
(values (map (λ: ([x : Real] [w : Real]) (* w (sqr (- x m)))) xs ws)
|
|
(map (λ: ([x : Real] [w : Real]) (* w (expt (- x m) 3))) xs ws)
|
|
(max 0 (sum ws))))]
|
|
[else (let ([xs (sequence->list xs)])
|
|
(values (map (λ: ([x : Real]) (sqr (- x m))) xs)
|
|
(map (λ: ([x : Real]) (expt (- x m) 3)) xs)
|
|
(length xs)))]))
|
|
(cond [(zero? n) +nan.0]
|
|
[else
|
|
(define m2 (expt (max 0 (sum xs^2)) 3/2))
|
|
(cond [(zero? m2) +nan.0]
|
|
[else
|
|
(define m3 (sum xs^3))
|
|
(adjust-skewness (/ (* m3 (sqrt n)) m2) n bias)])]))
|
|
|
|
(: kurtosis* (Symbol Real (Sequenceof Real) (Option (Sequenceof Real)) (U #t #f Real)
|
|
-> Nonnegative-Real))
|
|
(define (kurtosis* name m xs ws bias)
|
|
(define-values (xs^2 xs^4 n)
|
|
(cond [ws (let-values ([(xs ws) (sequences->weighted-samples name xs ws)])
|
|
(values (map (λ: ([x : Real] [w : Real]) (* w (sqr (- x m)))) xs ws)
|
|
(map (λ: ([x : Real] [w : Real]) (* w (expt (- x m) 4))) xs ws)
|
|
(max 0 (sum ws))))]
|
|
[else (let ([xs (sequence->list xs)])
|
|
(values (map (λ: ([x : Real]) (sqr (- x m))) xs)
|
|
(map (λ: ([x : Real]) (expt (- x m) 4)) xs)
|
|
(length xs)))]))
|
|
(cond [(zero? n) +nan.0]
|
|
[else
|
|
(define m2 (sum xs^2))
|
|
(cond [(zero? m2) +nan.0]
|
|
[else
|
|
(define m4 (sum xs^4))
|
|
(adjust-kurtosis (max 0 (/ (* (/ m4 m2) n) m2)) n bias)])]))
|
|
|
|
;; ===================================================================================================
|
|
;; User-facing functions
|
|
|
|
(: variance/mean (case-> (Real (Sequenceof Real) [#:bias (U #t #f Real)] -> Nonnegative-Real)
|
|
(Real (Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)]
|
|
-> Nonnegative-Real)))
|
|
(define (variance/mean m xs [ws #f] #:bias [bias #f])
|
|
(variance* 'variance/mean m xs ws bias))
|
|
|
|
(: variance (case-> ((Sequenceof Real) [#:bias (U #t #f Real)] -> Nonnegative-Real)
|
|
((Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)]
|
|
-> Nonnegative-Real)))
|
|
(define (variance xs [ws #f] #:bias [bias #f])
|
|
(variance* 'variance (mean xs ws) xs ws bias))
|
|
|
|
(: stddev/mean (case-> (Real (Sequenceof Real) [#:bias (U #t #f Real)] -> Nonnegative-Real)
|
|
(Real (Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)]
|
|
-> Nonnegative-Real)))
|
|
(define (stddev/mean m xs [ws #f] #:bias [bias #f])
|
|
(sqrt (variance* 'stddev/mean (mean xs ws) xs ws bias)))
|
|
|
|
(: stddev (case-> ((Sequenceof Real) [#:bias (U #t #f Real)] -> Nonnegative-Real)
|
|
((Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)]
|
|
-> Nonnegative-Real)))
|
|
(define (stddev xs [ws #f] #:bias [bias #f])
|
|
(sqrt (variance* 'stddev (mean xs ws) xs ws bias)))
|
|
|
|
(: skewness/mean (case-> (Real (Sequenceof Real) [#:bias (U #t #f Real)] -> Real)
|
|
(Real (Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)]
|
|
-> Real)))
|
|
(define (skewness/mean m xs [ws #f] #:bias [bias #f])
|
|
(skewness* 'skewness/mean m xs ws bias))
|
|
|
|
(: skewness (case-> ((Sequenceof Real) [#:bias (U #t #f Real)] -> Real)
|
|
((Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)] -> Real)))
|
|
(define (skewness xs [ws #f] #:bias [bias #f])
|
|
(skewness* 'skewness (mean xs ws) xs ws bias))
|
|
|
|
(: kurtosis/mean (case-> (Real (Sequenceof Real) [#:bias (U #t #f Real)] -> Nonnegative-Real)
|
|
(Real (Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)]
|
|
-> Nonnegative-Real)))
|
|
(define (kurtosis/mean m xs [ws #f] #:bias [bias #f])
|
|
(kurtosis* 'kurtosis/mean m xs ws bias))
|
|
|
|
(: kurtosis (case-> ((Sequenceof Real) [#:bias (U #t #f Real)] -> Nonnegative-Real)
|
|
((Sequenceof Real) (Option (Sequenceof Real)) [#:bias (U #t #f Real)]
|
|
-> Nonnegative-Real)))
|
|
(define (kurtosis xs [ws #f] #:bias [bias #f])
|
|
(kurtosis* 'kurtosis (mean xs ws) xs ws bias))
|