Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2005
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2005

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Weighted histogram

  • To: mathgroup at smc.vnet.net
  • Subject: [mg62347] Re: Weighted histogram
  • From: "Ray Koopman" <koopman at sfu.ca>
  • Date: Mon, 21 Nov 2005 03:54:39 -0500 (EST)
  • References: <dliv00$g1b$1@smc.vnet.net><dln1eh$ghu$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

kalymereau at yahoo.fr wrote:
> Thank you for the answers but it seems that neither the solution of Bob
> nor the one of Ray works.
>
> I want that each value in a be weighted by both its occurrence in the
> list a and by the corresponding weight in w. In other words, with
> a={1,1,1,2,3,4} and w={1,1,1,1,2,1}
> I want the histogram of b={1,1,1,2,3,3,4}
>
> Obviously this is not what does Bob's proposal.
>
> When w is a list of integers it is if course very easy to construct b
> from a and w: just duplicates the elements of a according to their
> weights in w.
>
> When a is a list of integers then it seems that the solution of Ray
> works (although I don't really understand it).
>
> But when both a and w are lists of real numbers, then it doesn't work.
>
> It is possible to construct a binning and then to fill each bin by the
> corresponding values in a ponderated by the weights in w. But the tests
> I made in this direction were very slow for large lists, and I would
> like something more natural.
>
> It seems to me to be a very basic problem of data analysis, any other
> idea ?
>
> Thanks.

There are two distinct problems here. To convert a vector a of
general reals to a vector b of integer bin numbers that run from
1...m, try

b = Ceiling @ Rescale[ a, {Min@a, Max@a}, {$MachineEpsilon*m, m} ];

To construct the vector of weighted frequencies, try

f = Normal @ SparseArray[ Rule[ #[[1,1]], Tr[#[[All,2]]] ]& /@
    Split[ Sort @ Transpose @ {b,w}, #1[[1]] == #2[[1]] & ] ];

I'm posting from a machine that does not have Mathematica on it,
so both the above are untried.

In my previous post, I normalized f to a vector of proportions:

p = f/Tr@f;

That was just a personal preference, to make the values more
interpretable.


  • Prev by Date: Re: Programmatic Search and Replace
  • Next by Date: Re: Re: Hardcopy or electronic books?
  • Previous by thread: Re: Re: Weighted histogram
  • Next by thread: Export to PDF