racket/collects/math/private/statistics/correlation.rkt
Neil Toronto 769e8b47ec Added `array->list-array'
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)
2012-12-06 22:52:22 -07:00

63 lines
3.0 KiB
Racket

#lang typed/racket/base
(require racket/sequence
racket/list
"../../base.rkt"
"../../flonum.rkt"
"expected-values.rkt"
"statistics-utils.rkt")
(provide covariance/means
correlation/means
covariance
correlation)
(: covariance* (Symbol Real Real (Sequenceof Real) (Sequenceof Real) (Option (Sequenceof Real))
(U #t #f Real) -> Real))
(define (covariance* name mx my xs ys ws bias)
(define-values (zs n)
(cond [ws (let-values ([(xs ws) (sequences->weighted-samples name xs ws)]
[(ys) (sequence->list ys)])
(check-lengths! name "value sequences" xs ys (length xs) (length ys))
(values (map (λ: ([x : Real] [y : Real] [w : Real]) (* w (- x mx) (- y my)))
xs ys ws)
(max 0 (sum ws))))]
[else (let ([xs (sequence->list xs)]
[ys (sequence->list ys)])
(check-lengths! name "value sequences" xs ys (length xs) (length ys))
(values (map (λ: ([x : Real] [y : Real]) (* (- x mx) (- y my))) xs ys)
(length xs)))]))
(define m2 (/ (sum zs) n))
(adjust-covariance m2 n bias))
(: covariance/means (case-> (Real Real (Sequenceof Real) (Sequenceof Real)
[#:bias (U #t #f Real)] -> Real)
(Real Real (Sequenceof Real) (Sequenceof Real) (Option (Sequenceof Real))
[#:bias (U #t #f Real)] -> Real)))
(define (covariance/means mx my xs ys [ws #f] #:bias [bias #f])
(covariance* 'covariance/means mx my xs ys ws bias))
(: covariance (case-> ((Sequenceof Real) (Sequenceof Real) [#:bias (U #t #f Real)] -> Real)
((Sequenceof Real) (Sequenceof Real) (Option (Sequenceof Real))
[#:bias (U #t #f Real)] -> Real)))
(define (covariance xs ys [ws #f] #:bias [bias #f])
(covariance* 'covariance (mean xs ws) (mean ys ws) xs ys ws bias))
(: correlation/means (case-> (Real Real (Sequenceof Real) (Sequenceof Real)
[#:bias (U #t #f Real)] -> Real)
(Real Real (Sequenceof Real) (Sequenceof Real) (Option (Sequenceof Real))
[#:bias (U #t #f Real)] -> Real)))
(define (correlation/means mx my xs ys [ws #f] #:bias [bias #f])
(define g (covariance/means mx my xs ys ws #:bias bias))
(define sx (stddev/mean mx xs ws #:bias bias))
(define sy (stddev/mean my ys ws #:bias bias))
(cond [(zero? sx) +nan.0]
[(zero? sy) +nan.0]
[else (/ g sx sy)]))
(: correlation (case-> ((Sequenceof Real) (Sequenceof Real) [#:bias (U #t #f Real)] -> Real)
((Sequenceof Real) (Sequenceof Real) (Option (Sequenceof Real))
[#:bias (U #t #f Real)] -> Real)))
(define (correlation xs ys [ws #f] #:bias [bias #f])
(correlation/means (mean xs ws) (mean ys ws) xs ys ws #:bias bias))