/
estimate.cljc
57 lines (52 loc) · 1.84 KB
/
estimate.cljc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
(ns kixi.stats.estimate
(:require [kixi.stats.distribution :as d]
[kixi.stats.math :refer [sq sqrt]]
[kixi.stats.protocols :as p]))
(defn simple-linear-regression
[{:keys [x-bar y-bar ss-x ss-xy] :as sum-squares}]
(when-not (zero? ss-x)
(let [slope (/ ss-xy ss-x)
offset (- y-bar (* x-bar slope))]
(reify
p/PDependent
(measure [_ x]
(+ offset (* slope x)))
p/PParameterised
(parameters [_]
[offset slope])))))
(defn regression-standard-error
[{:keys [n x-bar y-bar ss-x ss-y ss-xy] :as sum-squares} x]
(when (and (> n 2) (not (zero? ss-x)))
(sqrt
(* (/ 1 (- n 2))
(- ss-y (/ (sq ss-xy) ss-x))
(+ (/ 1 n) (/ (sq (- x x-bar)) ss-x))))))
(defn regression-confidence-interval
[{:keys [n] :as sum-squares} x alpha]
(let [regression (simple-linear-regression sum-squares)
y-hat (p/measure regression x)
se (regression-standard-error sum-squares x)
df (- n 2)
t-crit (d/critical-value (d/t {:v df}) alpha)
err (* t-crit se)]
(reify p/PInterval
(lower [_] (- y-hat err))
(upper [_] (+ y-hat err)))))
(defn regression-prediction-standard-error
[{:keys [n x-bar y-bar ss-x ss-y ss-xy] :as sum-squares} x]
(when (and (> n 2) (not (zero? ss-x)))
(sqrt
(* (/ 1 (- n 2))
(- ss-y (/ (sq ss-xy) ss-x))
(+ 1 (/ 1 n) (/ (sq (- x x-bar)) ss-x))))))
(defn regression-prediction-interval
[{:keys [n] :as sum-squares} x alpha]
(let [regression (simple-linear-regression sum-squares)
y-hat (p/measure regression x)
se (regression-prediction-standard-error sum-squares x)
df (- n 2)
t-crit (d/critical-value (d/t {:v df}) alpha)
err (* t-crit se)]
(reify p/PInterval
(lower [_] (- y-hat err))
(upper [_] (+ y-hat err)))))