Re: Creating a Listable Function
- To: mathgroup at smc.vnet.net
- Subject: [mg73596] Re: Creating a Listable Function
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Thu, 22 Feb 2007 04:44:00 -0500 (EST)
- Organization: The Open University, Milton Keynes, UK
- References: <ergqjm$j0v$1@smc.vnet.net>
Gregory Lypny wrote:
> Hello everyone,
>
> I've created a function for population variance, which does not make
> use of Mathematica's built-in Variance function.
>
> VarPop[x_] := Total[(x - Mean@x)^2]/Length@x
>
> How do I need to change the definition to have the function operate
> across lists much like Total, Mean, and Variance do?
>
> Regards,
>
> Greg
>
Hi Gregory,
Assuming I have correctly understood what behavior of Total you are
referring to, the following version of VarPop (see In[4]) should do what
you are looking for.
In[1]:=
data = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
Total[data]
Total[data, 2]
Out[2]=
{12, 15, 18}
Out[3]=
45
In[4]:=
Clear[VarPop];
VarPop[x_, n_Integer:1] /; n < Depth[x] :=
Nest[Total[(#1 - Mean[#1])^2]/Length[#1] & , x, n]
In[6]:=
VarPop[data]
Out[6]=
11 8 11
{--, -, --}
3 3 3
In[7]:=
VarPop[data, 2]
Out[7]=
2
-
9
The expression /Depth[data] - 1/ simulates the value Infinity that can
be given as second argument to Total.
In[8]:=
VarPop[data, ]
Out[8]=
2
-
9
(Note that, though there are some tests on the arguments, the function
is not bullet proof: you will have to handle cases such as negative n, say).
Regards,
Jean-Marc