       Re: Re: Re: finding periodicity in a set

• To: mathgroup at smc.vnet.net
• Subject: [mg39321] Re: [mg39304] Re: [mg39283] Re: finding periodicity in a set
• From: "Mihajlo Vanevic" <mvane at eunet.yu>
• Date: Tue, 11 Feb 2003 04:41:58 -0500 (EST)
• Sender: owner-wri-mathgroup at wolfram.com

```Here is something similar to Dr Bob's idea for small sample size...
(but more accurate, I think)

<< Statistics`DescriptiveStatistics`

Clear[mihajlo2];

mihajlo2[xlist_, dr_:0.1, error_:0.01] :=
Module[
{xxlist, gaps, ratios, rationalRatios, lcm, intRatios, xvals, linefit,
a, b},

xxlist = Mean /@ Split[Sort[xlist], #2 - #1 < error &];
gaps = ListConvolve[{1., -1.}, xxlist];
ratios = gaps/Min[gaps];
rationalRatios = Rationalize[ratios, dr];
lcm = LCM @@ Denominator[rationalRatios];
intRatios = rationalRatios*lcm;
xvals = FoldList[Plus, lcm, intRatios];
linefit = Fit[Transpose[{xvals, xxlist}], {1, x}, x];
{a, b} = CoefficientList[linefit, x];
{Mod[a, b], b, Max[xvals]}
];

test:

xlist := 0.202 + 1.618 Table[0.001 Random[] + Random[Integer, {3, 17}], {20}];
TableForm[Table[{{mihajlo2[xlist]}}, {50}]]

and

xlist := 0.202 + 1.618 Table[0.001 Random[] + Random[Integer, {3, 17}], {4}];
TableForm[Table[{{mihajlo2[xlist]}}, {50}]]

Mihajlo

**************************************************************
*    At 2003-02-10, 01:07:00
*        Dr Bob, drbob at bigfoot.com  wrote:
**************************************************************
>Mihajlo's method doesn't work well with small sample sizes, so I'd suggest
>this:
>
><< Statistics`DescriptiveStatistics`
>xlist = 0.202 + 1.618 Table[0.001 Random[] + Random[Integer, {3, 17}],
>{20}];
>error = 0.5;
>xxlist = Mean /@ Split[Sort[xlist], #2 - #1 < error &];
>Fit[xxlist, {1, x, x^2}, x];
>{a, b, c} = CoefficientList[, x];
>{Mod[a, b], b}
>gaps = Subtract @@@ Transpose@{Rest@xxlist, Drop[xxlist, -1]};
>ratios = gaps/Min@gaps;
>gcd[ratios_List] := Module[{n = 2, k},
>    While[n < 10 && (k = n/GCD @@ Round[n*ratios]) â?¥ n, n++];
>    k
>    ]
>b2 = Min[gaps]/gcd@ratios;
>{a2 = Mean@Mod[xxlist, b2], b2}
>
>{1.18984, 1.39711} (* Mihajlo's method with Mean in place of First *)
>{0.207753, 1.6175} (* better *)
>
>With as few as four samples, this often returns the right period, while the
>other method rarely gets it right even with 20 samples.
>
>You shouldn't make the error estimate too small --- a fourth of the period
>is about right.  (But you don't know the period in advance.)  A more
>complete method would adjust the error estimate after estimating the
>period, to see if the answer changes.
>
>Bobby

```