# correlation.frink

``` /** This library calculates the correlation between items in lists. */ /** This calculates the autocorrelation of a single numeric list, that is, it     identifies the periods at which sequences appear to repeat.  The result     is a sorted list containing pairs of [offset, correlation] with the terms     of strongest correlation being first in the list.     If you just want a single most likely autcorrelation period, it is found at        result@0@0     see correlationTest.frink for an example of using it. */ autocorrelation[list] := {    results = new array    size = length[list]    average = sum[list] / size    // Scale the list around its average    normalizedList = new array[size+1]    denom = 0    for i = 1 to size    {       term = list@(i-1) - average       normalizedList@i = term       denom = denom + term^2    }    for offset=1 to size    {       sum = 0       for i = 1 to size-offset          sum = sum + normalizedList@i * normalizedList@(i+offset)       results.push[[offset, sum/denom]]    }    return sort[results, byColumn] } /** This is the partial autocorrelation of a series.  The partial     autocorrelation is useful because it eliminates the effects of smaller     offsets.  For example, the partial autocorrelation at offset k is the     autocorrelation not accounted for by offsets 1 through k-1.  That means     that, for example, if a sequence has a perfect autocorrelation with a     offset of 5, this will *not* display any partial autocorrelation at     10, 15, etc.     For equation:     https://support.minitab.com/en-us/minitab/20/help-and-how-to/statistical-modeling/time-series/how-to/autocorrelation/methods-and-formulas/methods-and-formulas/ */ partialAutocorrelation[list] := {    results = new array    size = length[list]    average = sum[list] / size    // Scale the list around its average    normalizedList = new array[size+1]    denom = 0    for i = 1 to size    {       term = list@(i-1) - average       normalizedList@i = term       denom = denom + term^2    }    for offset=1 to size    {       sum = 0       for t = offset+1 to size-offset          sum = sum + normalizedList@(t-offset) * normalizedList@(t)       results.push[[offset, sum/denom]]    }    return sort[results, byColumn] } ```