読者です 読者をやめる 読者になる 読者になる

スチューデントのt分布を計算してみた

Clojureの勉強を兼ねて統計プログラムをちまちまと作っていますが、t分布の計算ができるようになりました。積分が入っているガンマ関数*1がネックだったんですが、Wikipedia先生に近似法を教えてもらって一件落着。

;; Gamma Function (using Stirling's approximation by Gergo Nemes)
;; (see http://en.wikipedia.org/wiki/Stirling%27s_approximation)
;;
(defn gamma [n]
  (* (Math/sqrt (/ (* 2 Math/PI) n))
     (Math/pow (* (/ 1 Math/E) (+ n (/ 1 (- (* 12 n) (/ 1 (* 10 n)))))) n)))

;; Student's t Probability Density Function
;; (tpdf x v)
;; x: a value
;; v: degree of freedom
;;
(defn tpdf [x v]
  (* (/ (gamma (/ (+ v 1) 2)) (gamma (/ v 2)))
     (/ 1 (Math/sqrt (* v Math/PI)))
     (/ 1 (Math/pow (+ 1 (/ (* x x) v)) (/ (+ v 1) 2)))))

ただ、累積分布やその逆関数の計算をするプログラムをまだ書いていないので、t検定はできません...

*1:階乗を一般化して非整数値でも計算できるようにしたもの?