diff options
| -rw-r--r-- | config.org | 180 |
1 files changed, 116 insertions, 64 deletions
@@ -900,84 +900,136 @@ Inserts a newline above or below, like O and o in vim ** statistics #+begin_src emacs-lisp - (defun sum (lst) - "Calculate the sum of a vector." - (interactive "xEnter a vector: ") + (defun validate-list (lst) + "Check if input list is a symbol and ensure it's a list" + (when (symbolp lst) + (setq lst (symbol-value lst))) (unless (listp lst) - (error "Input must be a vector!")) - (let ((result (if (null lst) - (progn - (message "Empty vector") - 0) - (if (null (cdr lst)) - (car lst) - (+ (car lst) (sum (cdr lst))))))) + (error "Input must be a list!")) + (if (null lst) + (error "Empty list!")) + lst) + + + (defun sum (lst) + "Calculate the sum of a list" + (interactive "xEnter a list: ") + (let* ((lst (validate-list lst)) + (result (if (null (cdr lst)) + (car lst) + (+ (car lst) (sum (cdr lst)))))) (when (called-interactively-p 'any) (message "Sum: %.2f" (float result))) result)) (defun mean (lst) - "Calculate the mean of a vector." - (interactive "xEnter a vector: ") - (unless (listp lst) - (error "Input must be a vector!")) - (if (null lst) - (message "Mean: 0") - (let ((mean-value (/ (float (sum lst)) (length lst)))) - (message "Mean: %.2f" mean-value) - mean-value))) + "Calculate the mean of a list." + (interactive "xEnter a list: ") + (let* ((lst (validate-list lst)) + (mean-value (/ (float (sum lst)) (length lst)))) + (when (called-interactively-p 'any) + (message "Mean: %.2f" mean-value)) + mean-value)) - (defun sdm (x mean) + (defun sqr-diff-mean (x mean) "Calculate squared difference (datapoint - mean)" (let ((diff (- x mean))) (expt diff 2))) - (defun pdev (lst) - "Calculate Population Standard Deviation of a vector" - (interactive "xEnter a vector: ") - (unless (listp lst) - (error "Input must be a vector!")) - (let* ((n (length lst)) - (mean-value (mean lst)) - (squared-diffs (mapcar (lambda (x) (sdm x mean-value)) lst)) - (sum-squared-diffs (sum squared-diffs)) - (stddev (if (< n 2) - 0 - (sqrt (/ (float sum-squared-diffs) (1- n)))))) - (message "%.2f" stddev))) - - (defun sdev (lst) - "Calculate Sample Standard Deviation of a vector" - (interactive "xEnter a vector: ") - (unless (listp lst) - (error "Input must be a vector!")) - (let* ((n (length lst)) - (mean-value (mean lst)) - (squared-diffs (mapcar (lambda (x) (sdm x mean-value)) lst)) - (sum-squared-diffs (sum squared-diffs)) - (stddev (if (< n 2) - 0 - (sqrt (/ (float sum-squared-diffs) n))))) - (message "%.2f" stddev))) - - (defun ccoef (xvector yvector) - "Calculate the correlation coefficient between x and y" - (interactive "xEnter independant vector: \nxEnter dependant vector: ") - (let* ((xset xvector) - (yset yvector) + (defun mean-avg-dev (lst) + "Calculate Mean Average Deviation of a list" + (interactive "xEnter a list: ") + (let* ((lst (validate-list lst)) + (mean-value (mean lst)) + (abs-dev-sum (sum (mapcar (lambda (x) (abs (- x mean-value))) lst))) + (mad-value (/ abs-dev-sum (length lst)))) + (when (called-interactively-p 'any) + (message "Mean Average Deviation: %.2f" mad-value)) + mad-value)) + + (defun pstd-dev (lst) + "Calculate Population Standard Deviation of a list" + (interactive "xEnter a list: ") + (let* ((lst (validate-list lst)) + (n (length lst)) + (mean-value (mean lst)) + (squared-diffs (mapcar (lambda (x) (sqr-diff-mean x mean-value)) lst)) + (sum-squared-diffs (sum squared-diffs)) + (stddev (if (< n 2) + 0 + (sqrt (/ (float sum-squared-diffs) (1- n)))))) + (when (called-interactively-p 'any) + (message "%.2f" stddev)) + stddev)) + + (defun sstd-dev (lst) + "Calculate Sample Standard Deviation of a list" + (interactive "xEnter a list: ") + (let* ((lst (validate-list lst)) + (n (length lst)) + (mean-value (mean lst)) + (squared-diffs (mapcar (lambda (x) (sqr-diff-mean x mean-value)) lst)) + (sum-squared-diffs (sum squared-diffs)) + (stddev (if (< n 2) + 0 + (sqrt (/ (float sum-squared-diffs) n))))) + (when (called-interactively-p 'any) + (message "%.2f" stddev)) + stddev)) + + (defun scov (xset yset) + (interactive "xEnter independant list: \nxEnter dependant list: ") + (let* ((xset (validate-list xset)) + (yset (validate-list yset)) + (n (length xset)) + (xmean (mean xset)) + (ymean (mean yset)) + (sum-dev-prod (sum (cl-mapcar (lambda (x y) (* (- x xmean) (- y ymean))) xset yset))) + (result (/ sum-dev-prod n))) + (when (called-interactively-p 'any) + (message "Sample Covariance: %.2f" result)) + result)) + + (defun pcov (xset yset) + (interactive "xEnter independant list: \nxEnter dependant list: ") + (let* ((xset (validate-list xset)) + (yset (validate-list yset)) + (n (length xset)) + (xmean (mean xset)) + (ymean (mean yset)) + (sum-dev-prod (sum (cl-mapcar (lambda (x y) (* (- x xmean) (- y ymean))) xset yset))) + (result (/ sum-dev-prod (1- n)))) + (when (called-interactively-p 'any) + (message "Sample Covariance: %.2f" result)) + result)) + + (defun pearson-scc (xset yset) + "Calculate the Pearson Sample Correlation Coefficient between x and y" + (interactive "xEnter independant list: \nxEnter dependant list: ") + (let* ((xset (validate-list xset)) + (yset (validate-list yset)) + (n (length xset)) + (denominator (* (sstd-dev xset) (sstd-dev yset)))) + (if (zerop denominator) + (message "Correlation coefficient: NaN (denominator is zero)") + (let ((r (/ (scov xset yset) denominator))) + (when (called-interactively-p 'any) + (message "Correlation coefficient: %.2f" r)) + r)))) + + (defun pearson-pcc (xset yset) + "Calculate the Pearson Population Correlation Coefficient between x and y" + (interactive "xEnter independant list: \nxEnter dependant list: ") + (let* ((xset (validate-list xset)) + (yset (validate-list yset)) (n (length xset)) - (prodxy (cl-mapcar (lambda (x y) (* x y)) xset yset)) - (sumx (sum xset)) - (sumy (sum yset)) - (sumprodxy (sum prodxy)) - (sumsqx (sum (mapcar (lambda (x) (expt x 2)) xset))) - (sumsqy (sum (mapcar (lambda (y) (expt y 2)) yset))) - (denominator (float (sqrt (* (- (* n sumsqx) (expt sumx 2)) - (- (* n sumsqy) (expt sumy 2))))))) + (denominator (* (pstd-dev xset) (pstd-dev yset)))) (if (zerop denominator) (message "Correlation coefficient: NaN (denominator is zero)") - (let ((r (/ (- (* n sumprodxy) (* sumx sumy)) denominator))) - (message "Correlation coefficient: %.2f" r))))) + (let ((r (/ (scov xset yset) denominator))) + (when (called-interactively-p 'any) + (message "Correlation coefficient: %.2f" r)) + r)))) #+end_src * Custom keybinds and re-binds |
