From: Nick Dokos <nicholas.dokos@hp.com>
To: mail@christianmoe.com
Cc: Jude DaShiell <jdashiel@shellworld.net>,
nicholas.dokos@hp.com, emacs-orgmode@gnu.org
Subject: Re: unexpected failure on all formulas
Date: Tue, 20 Sep 2011 10:59:03 -0400 [thread overview]
Message-ID: <24637.1316530743@alphaville.dokosmarshall.org> (raw)
In-Reply-To: Message from Christian Moe <mail@christianmoe.com> of "Tue, 20 Sep 2011 11:29:00 +0200." <4E785CDC.9070503@christianmoe.com>
Christian Moe <mail@christianmoe.com> 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<nicholas.dokos@hp.com> wrote:
> >
> >> Jude DaShiell<jdashiel@shellworld.net> 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
> >
> >
>
next prev parent reply other threads:[~2011-09-20 14:59 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-20 0:41 unexpected failure on all formulas Jude DaShiell
2011-09-20 6:17 ` Nick Dokos
2011-09-20 8:26 ` Nick Dokos
2011-09-20 9:15 ` Lawrence Mitchell
2011-09-20 9:29 ` Christian Moe
2011-09-20 14:59 ` Nick Dokos [this message]
2011-09-20 16:30 ` Nick Dokos
2011-09-20 20:28 ` Christian Moe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=24637.1316530743@alphaville.dokosmarshall.org \
--to=nicholas.dokos@hp.com \
--cc=emacs-orgmode@gnu.org \
--cc=jdashiel@shellworld.net \
--cc=mail@christianmoe.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).