Re: Construcing correlation matrix from time-ordered list
- To: mathgroup at smc.vnet.net
- Subject: [mg54730] Re: Construcing correlation matrix from time-ordered list
- From: Curt Fischer <tentrillion at gmail.NOSPAM.com>
- Date: Mon, 28 Feb 2005 03:27:21 -0500 (EST)
- References: <cvrptk$p0t$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Adam Getchell wrote:
> Hello all,
>
> I have time series data (a lot of it) in a format like:
>
> {{{1897,1,4},40.37`},{{1897,1,5},40.87`},{{1897,1,6},40.95`},{{1897,1,7},
> 40.87`},{{1897,1,8},40.97`},{{1897,1,11},40.75`},{{1897,1,12},
> 41.4`},{{1897,1,13},41.45`},{{1897,1,14},41.79`},{{1897,1,15},
> 42.27`},{{1897,1,18},42.76`},{{1897,1,19},43.25`},{{1897,1,20},
> 42.78`},{{1897,1,21},42.52`},{{1897,1,22},42.42`}}
>
> ie the year, then the value, for 100+ years.
>
> I'd like to construct a correlation matrix so that year values become
> columns, e.g.
>
> 1897 1898
> ==========
> Value1 Value 1
> Value 2 Value 2
> ...
>
> From my long list of {{{date1},value1},{{date2},value2}}
>
> But I'm not yet sure how to proceed. I'm looking at Cases or Select to
> apply a function for each year range that will pick out that column.
>
> Any pointers appreciated.
If your data for each year are all on the same dates (i.e. everything is
equally spaced), then it is probably easier to use Partition[].
If not, then this approach below might work. I'm not sure how well it
would scale to very long lists. (Note that I added one data point from
the year 1898 to your data to see if my method was working.)
In[1]:=
data = {{{1897, 1, 4}, 40.37}, {{1897, 1, 5}, 40.87}, {{1897, 1, 6},
40.95}, {{1897, 1, 7}, 40.87}, {{1897, 1, 8}, 40.97}, {{1897, 1, 11},
40.75}, {{1897, 1, 12}, 41.4}, {{1897, 1, 13}, 41.45}, {{1897, 1, 14},
41.79}, {{1897, 1, 15}, 42.27}, {{1897, 1, 18}, 42.76}, {{1897, 1,
19}, 43.25}, {{1897, 1, 20}, 42.78}, {{1897, 1, 21}, 42.52}, {{1897, 1,
22}, 42.42}, {{1898, 1, 1}, 40}};
In[2]:=
yrlist = Union[data /.
{{yr_Integer, mo_Integer, da_Integer},
(val_)?NumericQ} -> yr]
Out[2]=
{1897, 1898}
In[3]:=
newData = data /.
{{yr_Integer, mo_Integer,
da_Integer}, (val_)?NumericQ} ->
{yr, val};
In[4]:=
(Cases[newData, {#1, (val_)?NumericQ} -> val] & ) /@ yrlist
Out[4]=
{{40.37, 40.87, 40.95, 40.87,
40.97, 40.75, 41.4, 41.45,
41.79, 42.27, 42.76,
43.25, 42.78, 42.52,
42.42}, {40}}
--
Curt Fischer