From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Moe Subject: Re: unexpected failure on all formulas Date: Tue, 20 Sep 2011 11:29:00 +0200 Message-ID: <4E785CDC.9070503@christianmoe.com> References: <18072.1316499460@alphaville.dokosmarshall.org> <19773.1316507170@alphaville.dokosmarshall.org> Reply-To: mail@christianmoe.com Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from eggs.gnu.org ([140.186.70.92]:60584) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R5wcT-0004T7-Jf for emacs-orgmode@gnu.org; Tue, 20 Sep 2011 05:28:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R5wcS-00040X-8y for emacs-orgmode@gnu.org; Tue, 20 Sep 2011 05:28:01 -0400 Received: from mars.hitrost.net ([91.185.211.18]:19842) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R5wcR-0003Zn-Qh for emacs-orgmode@gnu.org; Tue, 20 Sep 2011 05:28:00 -0400 In-Reply-To: <19773.1316507170@alphaville.dokosmarshall.org> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: nicholas.dokos@hp.com Cc: Jude DaShiell , emacs-orgmode@gnu.org Hi, Nick, I think your vmode() needs to subtract one from the result. The mode in the "systolic" column of Jude's dataset should be 124 (f=12), not 125 (f=2). For Jude's limited purposes I got by with less code (but note the caveats): #+begin_src emacs-lisp (defmath vmode (vec) "Returns the mode (most frequent value) of a unimodal vector of integers VEC. WARNING: Will not work with non-integer values or multiple vectors. Will only return the lowest mode for multimodal data." (let ((freq (histogram vec (1+ (vmax vec))))) (1- (find freq (vmax freq))))) #+end_src Using :=vmode(@I..@II), I get 124 (systolic), 80 (diastolic), 68 (pulse). Yours, Christian On 9/20/11 10:26 AM, Nick Dokos wrote: > Nick Dokos wrote: > >> Jude DaShiell wrote: >> >> >>> |------------------------+----------+-----------+-------| >>> | mode | | | | >>> | Min | | | | >>> | Max | 127. | 81. | 74. | >>> #+TBLFM: @>>>$2..@>>>$4=vmode(@i..@ii) :: @>>$2..@>>$4=vmin(@i..@ii) :: @>$2..@>$4=vmax(@i..@ii) >>> >>> >>> # Local Variables: >>> # kept-new-versions: 100 >>> # version-control: t >>> # End: >>> cut here. >>> What did I do wrong with this #+TBLFM: line? >>> >> >> Two things: >> >> o as Christian Moe pointed out, calc does not provide a vmode() function. >> >> o the separator lines in the formulas have to be specified using capital >> I letters. >> > > Here is an implementation of vmode - afaict, it works correctly but > that may be because I've only tested it on a single set of data. If > you find something wrong, please let me know. > > --8<---------------cut here---------------start------------->8--- > | Date Stamp | Systolic | Diastolic | Pulse | > |------------------------+----------+-----------+-------| > | [2011-07-19 Tue 02:26] | 138 | 92 | 74 | > | [2011-07-20 Wed 04:03] | 130 | 85 | 74 | > | [2011-07-21 Thu 03:50] | 128 | 79 | 76 | > | [2011-07-22 Fri 02:33] | 121 | 80 | 79 | > | [2011-07-23 Sat 02:52] | 118 | 75 | 68 | > | [2011-07-24 Sun 04:13] | 126 | 83 | 78 | > | [2011-07-25 Mon 02:12] | 122 | 79 | 76 | > | [2011-07-26 Tue 01:57] | 124 | 79 | 72 | > | [2011-07-27 Wed 04:03] | 137 | 74 | 76 | > | [2011-07-28 Thu 03:47] | 136 | 80 | 76 | > | [2011-07-29 Fri 04:06] | 120 | 72 | 76 | > | [2011-07-30 Sat 03:18] | 128 | 92 | 80 | > | [2011-07-31 Sun 07:11] | 124 | 84 | 72 | > | [2011-08-01 Mon 04:55] | 124 | 77 | 69 | > | [2011-08-02 Tue 02:47] | 128 | 80 | 67 | > | [2011-08-03 Wed 06:00] | 132 | 89 | 70 | > | [2011-08-04 Thu 04:30] | 137 | 82 | 77 | > | [2011-08-05 Fri 06:10] | 124 | 86 | 77 | > | [2011-08-06 Sat 04:04] | 139 | 88 | 78 | > | [2011-08-07 Sun 04:02] | 124 | 80 | 68 | > | [2011-08-08 Mon 06:36] | 137 | 93 | 79 | > | [2011-08-10 Wed04:03] | 120 | 80 | 68 | > | [2011-08-11 Thu 04:30] | 128 | 78 | 77 | > | [2011-08-12 Fri 06:36] | 143 | 82 | 76 | > | [2011-08-13 Sat 06:18] | 125 | 76 | 69 | > | [2011-08-14 Sun 04:04] | 123 | 70 | 69 | > | [2011-08-15 Mon 04:04] | 135 | 83 | 76 | > | [2011-08-16 Tue 04:03] | 128 | 80 | 69 | > | [2011-08-17 Wed 04:04] | 124 | 80 | 68 | > | [2011-08-18 Thu 05:58] | 136 | 87 | 72 | > | [2011-08-19 Fri 05:50] | 116 | 80 | 64 | > | [2011-08-20 Sat 06:38] | 139 | 84 | 64 | > | [2011-08-21 Sun 08:20] | 124 | 84 | 73 | > | [2011-08-22 Mon 03:50] | 138 | 76 | 70 | > | [2011-08-23 Tue 05:52] | 126 | 79 | 68 | > | [2011-08-24 Wed 04:53] | 125 | 81 | 64 | > | [2011-08-25 Thu 05:37] | 124 | 79 | 68 | > | [2011-08-26 Fri 06:41] | 124 | 87 | 74 | > | [2011-08-27 Sat 05:44] | 133 | 74 | 61 | > | [2011-08-28 Sun 03:22] | 124 | 76 | 61 | > | [2011-08-29 Mon 04:06] | 124 | 76 | 65 | > | [2011-08-30 Tue 05:52] | 139 | 87 | 71 | > | [2011-08-31 Wed 06:47] | 152 | 86 | 68 | > | [2011-09-01 Thu 06:00] | 136 | 86 | 78 | > | [2011-09-02 Fri 01:22] | 142 | 100 | 78 | > | [2011-09-03 Sat 09:12] | 126 | 79 | 70 | > | [2011-09-04 Sun 11:53] | 130 | 90 | 72 | > | [2011-09-05 Mon 06:29] | 138 | 77 | 65 | > | [2011-09-06 Tue 05:42] | 121 | 76 | 68 | > | [2011-09-07 Wed 06:47] | 131 | 77 | 68 | > | [2011-09-08 Thu 06:02] | 122 | 76 | 72 | > | [2011-09-10 Sat 05:38] | 126 | 76 | 69 | > | [2011-09-11 Sun 10:12] | 137 | 87 | 64 | > | [2011-09-12 Mon 04:00] | 135 | 78 | 89 | > | [2011-09-13 Tue 06:00] | 132 | 82 | 66 | > | [2011-09-14 Wed 06:01] | 137 | 77 | 77 | > | [2011-09-15 Thu 04:08] | 141 | 87 | 64 | > | [2011-09-17 Sat 08:35] | 121 | 78 | 66 | > | [2011-09-18 Sun 07:04] | 124 | 69 | 65 | > | [2011-09-19 Mon 06:00] | 133 | 81 | 69 | > |------------------------+----------+-----------+-------| > | mode | 125 | 81 | 69 | > | min | 116 | 69 | 61 | > | max | 152 | 100 | 89 | > #+TBLFM: @>>>$2..@>>>$4=vmode(@I..@II) :: @>>$2..@>>$4=vmin(@I..@II) :: @>$2..@>$4=vmax(@I..@II) > > #+begin_src elisp > > (defun calcFunc-vmode (&rest vecs) > (let* ((flat (copy-sequence (cdr (math-flatten-many-vecs vecs)))) > (p flat) > (len (length flat)) > (hlen (/ len 2))) > (if (= len 0) > (math-reject-arg nil "*Must be at least 1 argument") > (if (and (= len 1) (memq (car-safe (car flat)) '(sdev intv))) > (calcFunc-vmean (car flat)) > (while p > (if (eq (car-safe (car p)) 'sdev) > (setcar p (nth 1 (car p)))) > (or (Math-anglep (car p)) > (math-reject-arg (car p) 'anglep)) > (setq p (cdr p))) > (setq flat (sort flat 'math-lessp)) > (setq freqs (vfreqs flat)) > (cadr (maxfreq freqs)) > )))) > > (defun vfreqs (v) > "v is assumed to be sorted. > Return a list of pairs: (count element) > for each distinct element of v." > (let ((count 0) > (prev (car v)) > (vec v) > freqs) > (setq freqs nil) > (while vec > (if (= (nth 0 vec) prev) > (setq count (1+ count)) > (setq freqs (cons (list count (nth 0 vec)) freqs)) > (setq count 1 prev (nth 0 vec))) > (setq vec (cdr vec))) > freqs)) > > (defun freq-greater (a b) > (if (> (car a) (car b)) > t > nil)) > > (defun maxfreq (f) > "Sort the frequency list by count and return the first pair." > (let ((fs (sort f 'freq-greater))) > (nth 0 fs))) > > #+end_src > --8<---------------cut here---------------end--------------->8--- > > I cribbed heavily from the implementation of vmedian. Although there is > no key binding, you can even use the above in an interactive Calc > session, by entering the formula in algebraic form. I yanked the vector > twice onto the Calc stack and then entered 'vmode($) with the following > result: > > ,---- > | --- Emacs Calculator Mode --- > | 2: [138, 130, 128, 121, 118, 126, 122, 124, 137, 136, 120, 128, 124, 124, 128, 132, 137, 124, 139, > | 124, 137, 120, 128, 143, 125, 123, 135, 128, 124, 136, 116, 139, 124, 138, 126, 125, 124, 124, > | 133, 124, 124, 139, 152, 136, 142, 126, 130, 138, 121, 131, 122, 126, 137, 135, 132, 137, 141, > | 121, 124, 133] > | 1: 125 > | . > `---- > > Nick > >