parent
64353cb77d
commit
3d61dd316d
@ -0,0 +1,4 @@ |
||||
|
||||
|
||||
all: |
||||
go build .
|
||||
@ -0,0 +1,5 @@ |
||||
module lcthw.dev/learn-code-the-hard-way/magic_stats/go/magic_stats |
||||
|
||||
go 1.25.3 |
||||
|
||||
require gonum.org/v1/gonum v0.17.0 |
||||
@ -0,0 +1,2 @@ |
||||
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= |
||||
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= |
||||
@ -0,0 +1,102 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"math" |
||||
) |
||||
|
||||
type Welford struct { |
||||
Mean float64 |
||||
N float64 |
||||
M2 float64 |
||||
|
||||
Min float64 |
||||
Max float64 |
||||
} |
||||
|
||||
type TTest struct { |
||||
TState float64 |
||||
DOF float64 |
||||
PVal float64 |
||||
} |
||||
|
||||
func (stats *Welford) Sample(s float64) { |
||||
stats.N += 1 |
||||
old_mean := stats.Mean |
||||
stats.Mean += (s - stats.Mean) / stats.N |
||||
stats.M2 += (s - old_mean) * (s - stats.Mean) |
||||
|
||||
if stats.N == 0 { |
||||
stats.Min = s |
||||
stats.Max = s |
||||
} else { |
||||
if stats.Min > s { stats.Min = s } |
||||
if stats.Max < s { stats.Max = s } |
||||
} |
||||
} |
||||
|
||||
func (stats *Welford) Variance() float64 { |
||||
return stats.M2 / stats.N |
||||
} |
||||
|
||||
func (stats *Welford) SampleVariance() float64 { |
||||
return stats.M2 / (stats.N - 1) |
||||
} |
||||
|
||||
func (stats *Welford) StdDev() float64 { |
||||
return math.Sqrt(stats.Variance()) |
||||
} |
||||
|
||||
func (stats *Welford) TTest(second *Welford) { |
||||
n1 := stats.N |
||||
n2 := second.N |
||||
mean1 := stats.Mean |
||||
mean2 := second.Mean |
||||
var1 := stats.SampleVariance() |
||||
var2 := second.SampleVariance() |
||||
|
||||
delta_mean := mean1 - mean2 |
||||
pooled_se := math.Sqrt((var1 / n1) + (var2 / n2)) |
||||
t_stat := delta_mean / pooled_se |
||||
|
||||
num := math.Pow((var1 / n1) + (var2 / n2), 2) |
||||
den := (math.Pow(var1 / n2, 2) / (n1 - 1)) + (math.Pow(var2 / n2, 2) / (n2 - 1)) |
||||
dof := num / den |
||||
|
||||
lga_1, _ := math.Lgamma(dof / 2.0) |
||||
lga_2, _ := math.Lgamma(0.5) |
||||
lga_3, _ := math.Lgamma(dof / 2.0 + 0.5) |
||||
gamm := math.Exp(lga_1 + lga_2 - lga_3) |
||||
|
||||
b := dof / (t_stat * t_stat + dof) |
||||
|
||||
fn := func (r float64) float64 { |
||||
return math.Pow(r, dof / 2.0 - 1.0) / math.Sqrt(1.0 - r) |
||||
} |
||||
|
||||
p_val := Simpson(0.0, b, 10000, fn) / gamma |
||||
|
||||
fmt.Println("t_stats:", t_stat, "dof", dof, "gamm:", gamm, "b:", b) |
||||
} |
||||
|
||||
func main() { |
||||
var welf Welford |
||||
var welf2 Welford |
||||
|
||||
welf.Sample(1.2) |
||||
welf.Sample(2.2) |
||||
welf.Sample(3.2) |
||||
welf.Sample(4.2) |
||||
|
||||
welf2.Sample(1.1) |
||||
welf2.Sample(2.1) |
||||
welf2.Sample(3.1) |
||||
welf2.Sample(4.1) |
||||
|
||||
welf.TTest(&welf) |
||||
|
||||
fmt.Println( |
||||
"Mean:", welf.Mean, |
||||
"Variance: ", welf.Variance(), |
||||
"Stddev: ", welf.StdDev()); |
||||
} |
||||
Loading…
Reference in new issue