From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Dokos Subject: Re: unexpected failure on all formulas Date: Tue, 20 Sep 2011 10:59:03 -0400 Message-ID: <24637.1316530743@alphaville.dokosmarshall.org> References: <18072.1316499460@alphaville.dokosmarshall.org> <19773.1316507170@alphaville.dokosmarshall.org> <4E785CDC.9070503@christianmoe.com> Reply-To: nicholas.dokos@hp.com Return-path: Received: from eggs.gnu.org ([140.186.70.92]:58366) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R61mz-0005Ax-DU for emacs-orgmode@gnu.org; Tue, 20 Sep 2011 10:59:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R61mu-0007s0-Ai for emacs-orgmode@gnu.org; Tue, 20 Sep 2011 10:59:13 -0400 Received: from g4t0014.houston.hp.com ([15.201.24.17]:27914) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R61mt-0007ri-Rb for emacs-orgmode@gnu.org; Tue, 20 Sep 2011 10:59:08 -0400 In-Reply-To: Message from Christian Moe of "Tue, 20 Sep 2011 11:29:00 +0200." <4E785CDC.9070503@christianmoe.com> 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: mail@christianmoe.com Cc: Jude DaShiell , nicholas.dokos@hp.com, emacs-orgmode@gnu.org Christian Moe wrote: > 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). > Yes, this is an off-by-one error: in vfreqs, I should cons prev onto freqs, not (nth 0 vec). In addition to this and the multimodal problem that both you and Lawrence Mitchell pointed out, there is another off-by-one error when vfreqs gets to the end of the list. All in all, a disaster: can a posting be deleted? or at least marked with a big, red X so that it won't mislead in the future? I'll try to post a corrected version later on. OTOH, my main interest in this was the hooking up of a user function onto calc and the example, though deeply flawed, does illustrate that. Thanks to both Christian and Lawrence for the whacks in the head (although now I have a headache...) Nick > 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 > > > > >