<PRIVATE
-:: ((kth-object)) ( seq k nth-quot exchange-quot quot: ( x y -- ? ) -- elt )
+:: kth-object-impl ( seq k nth-quot exchange-quot quot: ( x y -- ? ) -- elt )
! Wirth's method, Algorithm's + Data structues = Programs p. 84
k seq bounds-check 2drop
0 :> i!
: (kth-object) ( seq k nth-quot exchange-quot quot: ( x y -- ? ) -- elt )
! The algorithm modifiers seq, so we clone it
- [ >array ] 4dip ((kth-object)) ; inline
+ [ >array ] 4dip kth-object-impl ; inline
: kth-object-unsafe ( seq k quot: ( x y -- ? ) -- elt )
[ [ nth-unsafe ] [ exchange-unsafe ] ] dip (kth-object) ; inline
: sample-ste ( seq -- x ) 1 ste-ddof ;
-: ((r)) ( x-mean y-mean x-seq y-seq -- (r) )
+<PRIVATE
+: r-sum-diffs ( x-mean y-mean x-seq y-seq -- (r) )
! finds sigma((xi-mean(x))(yi-mean(y))
0 [ [ [ pick ] dip swap - ] bi@ * + ] 2reduce 2nip ;
: (r) ( x-mean y-mean x-seq y-seq x-std y-std -- r )
- * recip [ [ ((r)) ] keep length 1 - / ] dip * ;
+ * recip [ [ r-sum-diffs ] keep length 1 - / ] dip * ;
-: [r] ( xy-pairs -- x-mean y-mean x-seq y-seq x-std y-std )
+: r-stats ( xy-pairs -- x-mean y-mean x-seq y-seq x-std y-std )
first2 [ [ [ mean ] bi@ ] 2keep ] 2keep [ population-std ] bi@ ;
+PRIVATE>
-: r ( xy-pairs -- r )
- [r] (r) ;
-
-: r^2 ( xy-pairs -- r )
- r sq ;
+: pearson-r ( xy-pairs -- r ) r-stats (r) ;
: least-squares ( xy-pairs -- alpha beta )
- [r] { [ 2dup ] [ ] [ ] [ ] [ ] } spread
+ r-stats [ 2dup ] 4 ndip
! stack is x-mean y-mean x-mean y-mean x-seq y-seq x-std y-std
[ (r) ] 2keep ! stack is mean(x) mean(y) r sx sy
swap / * ! stack is mean(x) mean(y) beta