From murdoch at stats.uwo.ca  Mon Jan  9 19:35:03 2006
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Mon, 09 Jan 2006 13:35:03 -0500
Subject: [Rd] prod(numeric(0)) surprise
In-Reply-To: <39B6DDB9048D0F4DAD42CB26AAFF0AFAFED6D2@usctmx1106.merck.com>
References: <39B6DDB9048D0F4DAD42CB26AAFF0AFAFED6D2@usctmx1106.merck.com>
Message-ID: <43C2ACD7.3050902@stats.uwo.ca>

On 1/9/2006 1:27 PM, Liaw, Andy wrote:
> If you haven't seen this in your math courses, perhaps this would help:
> 
> http://en.wikipedia.org/wiki/Empty_set
>

This is what is so great about Wikipedia:  it gives certainty where I'd 
only call it a fairly standard convention.  ;-)

Duncan Murdoch


> which says, in part:
> 
> Operations on the empty set
> 
> Operations performed on the empty set (as a set of things to be operated
> upon) can also be confusing. (Such operations are nullary operations.) For
> example, the sum of the elements of the empty set is zero, but the product
> of the elements of the empty set is one (see empty product). This may seem
> odd, since there are no elements of the empty set, so how could it matter
> whether they are added or multiplied (since "they" do not exist)?
> Ultimately, the results of these operations say more about the operation in
> question than about the empty set. For instance, notice that zero is the
> identity element for addition, and one is the identity element for
> multiplication.
> 
> 
> Andy
> 
> 
> From: Martin Morgan
>> 
>> I guess I have to say yes, I'd exepct
>> 
>> x <- 1:10
>> sum(x[x>10]) ==> numeric(0)
>> 
>> this would be reinforced by recongnizing that numeric(0) is not zero,
>> but nothing. I guess the summation over an empty set is an empty set,
>> rather than a set containing the number 0. Certainly these
>> 
>> exp(x[x>10]) ==> numeric(0)
>> numeric(0) + 1 ==> numeric(0)
>> 
>> would give me pause.
>> 
>> 
>> Gabor Grothendieck <ggrothendieck at gmail.com> writes:
>> 
>> > The way to think about it is:
>> >
>> >    prod(rep(x,n)) == x^n
>> >
>> > and that works for n=0 too.
>> 
>> Hmm, Not sure what to put in for x and n? do you mean x == numeric(0),
>> n == 0 (0 copies of an empty set), x == ANY n == numeric(0) (an empty
>> set of ANYthing), x == numeric(0), n == numeric(0) ? For all of these,
>> x^n evaluates to numeric(0).
>> 
>> Martin (Morgan)
>> 
>> Duncan Murdoch <murdoch at stats.uwo.ca> writes:
>> 
>> > On 1/9/2006 12:40 PM, Martin Morgan wrote:
>> >> I'm a little confused. I understand that numeric(0) means an empty
>> >> numeric vector, not the number 0 expressed as numeric. As 
>> it is now,
>> >> prod(numeric(0)) generates something -- a vector of length 1
>> >> containing the number 1 -- from nothing. I would have expected
>> >> prod(numeric(0)) ==> numeric(0)
>> >> this is consistent with
>> >> numeric(0) ==> numeric(0)
>> >> numeric(0) * 1 ==> numeric(0)
>> >> cumprod(numeric(0)) ==> numeric(0)
>> >> and, because concatenation occus before function evaluation,
>> >> prod(c(numeric(0),1)) ==> prod( c(1) ) ==> 1
>> >> I would expect sum() to behave the same way, e.g., sum(numeric(0))
>> >> ==>
>> >> numeric(0). From below,
>> >>
>> >
>> > I think the code below works as I'd expect.  Would you 
>> really like the
>> > last answer to be numeric(0)?
>> >
>> >  > x <- 1:10
>> >  > sum(x)
>> > [1] 55
>> >  > sum(x[x>5])
>> > [1] 40
>> >  > sum(x[x>10])
>> > [1] 0
>> >
>> > Duncan Murdoch
>> >
>> >>>     >>>> consider exp(sum(log(numeric(0)))) ... ?)
>> >>>     >>     >> That's a fairly standard mathematical convention,
>> >>> which
>> >>>     >> is presumably why sum and prod work that way.
>> >>>     >>     >> Duncan Murdoch
>> >> I would have expected numeric(0) as the result (numeric(0) is the
>> >> result from log(numeric(0)), etc).
>> >> Martin (Morgan)
>> >> Martin Maechler <maechler at stat.math.ethz.ch> writes:
>> >>
>> >>>>>>>> "Ben" == Ben Bolker <bolker at zoo.ufl.edu>
>> >>>>>>>>     on Sun, 08 Jan 2006 21:40:05 -0500 writes:
>> >>>
>> >>>     Ben> Duncan Murdoch wrote:
>> >>>     >> On 1/8/2006 9:24 PM, Ben Bolker wrote:
>> >>>     >>     >>> It surprised me that prod(numeric(0)) is 
>> 1.  I guess
>> >>> if
>> >>>     >>> you say (operation(nothing) == identity element) this
>> >>>     >>> makes sense, but ??
>> >>>     >>     >>     >> What value were you expecting, or were you
>> >>> expecting an
>> >>>     >> error?  I can't think how any other value could be
>> >>>     >> justified, and throwing an error would make a lot of
>> >>>     >> formulas more complicated.
>> >>>     >>     >>>
>> >>>     >>     >>>> consider exp(sum(log(numeric(0)))) ... ?)
>> >>>     >>     >> That's a fairly standard mathematical convention,
>> >>> which
>> >>>     >> is presumably why sum and prod work that way.
>> >>>     >>     >> Duncan Murdoch
>> >>>
>> >>>     Ben>    OK.  I guess I was expecting NaN/NA (as opposed to
>> >>>     Ben> an error), but I take the "this makes everything else
>> >>>     Ben> more complicated" point.  Should this be documented or
>> >>>     Ben> is it just too obvious ... ?  (Funny -- I'm willing to
>> >>>     Ben> take gamma(1)==1 without any argument or suggestion
>> >>>     Ben> that it should be documented ...)
>> >>>
>> >>> see?  so it looks to me as if you have finally convinced
>> >>> yourself that '1' is the most reasonable result.. ;-)
>> >>>
>> >>> Anyway, I've added a sentence to help(prod)  {which matches
>> >>> the sentence in help(sum), BTW}.
>> >>>
>> >>> Martin
>> >>>
>> >>> ______________________________________________
>> >>> R-devel at r-project.org mailing list
>> >>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> 
> 
> 
> ------------------------------------------------------------------------------
> Notice:  This e-mail message, together with any attachment...{{dropped}}



[Rd] prod(numeric(0)) surprise
Duncan Murdoch