The colMeans comes closest,

for a single series the assume you have 100 years of monthly data.

The mean you want to scale by is the mean for a restricted period in the
center
of the series.. say 1950-1960

for this period you have the average jan (1950-1960) average feb, ect.

your final series would be

jan 1900 - average jan(1950-60)
feb 1990 - average feb
....
jan 2000 - average jan(1950-60)

Which gives you a scaling that is not relative to the mean of the whole, but
relative to a base period which is selctable.

BTW switching to zoo has greatly simplified the code.

On Wed, Aug 11, 2010 at 11:21 AM, Gabor Grothendieck <
ggrothendi...@gmail.com> wrote:

> On Wed, Aug 11, 2010 at 12:22 PM, steven mosher <mosherste...@gmail.com>
> wrote:
> > Given a long zoo matrix, the goal is to "sweep" out a statistic from the
> > entire length of the
> > sequences.
> >
> >
>  
> longzoomatrix<-zoo(matrix(rnorm(720),ncol=6),as.yearmon(outer(1900,seq(0,length=120)/12,"+")))
> >  cnames<-c(12345,23456,34567,45678,56789,67890)
> >  colnames(longzoomatrix)<-cnames
> >  longzoomatrix[1:24,]
> >               12345       23456       34567       45678       56789
> >  67890
> > Jan 1900 -0.17123165  1.02087086  0.79514870 -0.54519494 -0.13025459
> > -0.009980402
> > Feb 1900  1.21729926 -0.74541038 -0.08138406 -2.01180775  0.19256998
> >  0.551965871
> > Mar 1900  1.13222481 -1.25315703  0.01013473  0.08366155 -0.84246010
> > -1.405959298
> > Apr 1900 -0.02352559 -1.25001473 -1.53570550 -0.17945324  0.33368133
> >  2.045125104
> > May 1900  2.08204920  1.28091067 -0.80888146  0.31796730  0.83248551
> >  1.439049603
> > Jun 1900  0.62209570 -0.66189249 -0.57923119 -0.04346112 -2.71353384
> > -0.346826902
> > Jul 1900 -1.39758918 -0.54525469 -0.05230070 -0.36725079  1.28281798
> >  1.391174712
> > Aug 1900  0.12594069  0.09303970  0.69916411 -1.01902352 -0.82720898
> > -0.208113626
> > Sep 1900 -0.34310543  0.41718435  0.79455765  1.13234707  0.14652667
> > -0.551426097
> > Oct 1900  1.70634123 -1.20073104 -1.08771551 -0.01715296  0.24931996
> > -0.753481196
> > Nov 1900  0.15224070 -0.05108370 -0.97410069  0.51130170  0.13880814
> > -2.160811186
> > Dec 1900  0.34726817  0.61830719  0.84429979 -0.26253635  0.95243068
> > -0.533562966
> > Jan 1901  0.28647563 -0.40650198 -1.19640622  0.70267162  0.18867804
> >  0.098855045
> > Feb 1901  1.27269836  0.31797472 -1.13038040  1.33654480  0.08885501
> > -0.134690872
> > Mar 1901 -1.36934330 -0.17244539  0.81705554 -0.09113888  0.90241413
> >  0.473939164
> > Apr 1901 -0.89768498  0.82497595  0.15684387  2.25294476 -1.72886103
> > -0.104769411
> > May 1901 -0.27898445 -1.24348285  1.36203180  0.02422083 -1.33745980
> >  1.098856752
> > Jun 1901 -0.67968801  0.42082064  0.47056133 -0.12981223  0.19445803
> > -0.284638114
> > Jul 1901  0.03791761 -0.22118130  1.96044737 -1.18280989  0.90075205
> >  0.055720535
> > Aug 1901  1.12904079  0.57177055  0.64300572 -0.16284983  0.07951656
> > -0.159396821
> > Sep 1901 -1.43513934  0.03036697  1.09039400  0.99201776  0.98744827
> > -0.057234838
> > Oct 1901  0.73828382  0.53967835  2.16608282 -0.82929778 -1.99666687
> >  0.352778450
> > Nov 1901  0.06561583 -1.20126258  0.67427027  0.15493106  0.08867697
> >  1.223073528
> > Dec 1901 -1.23347027 -1.09699304  0.59398031 -0.22269292 -0.21569543
> >  1.389667825
> >
> > The statistic to be swept out is itself a zoo series with matching column
> > names.
> > There are twelve valies for each column representing an monthly average
> for
> > that
> > series.
> >
> > The average is to be subtracted
> >
> >  sweepzoo<-zoo(matrix(rnorm(72),ncol=6), frequency=12)
> >  colnames(sweepzoo)<-cnames
> >  sweepzoo
> >           12345      23456      34567      45678       56789      67890
> > 1(1)  -2.5569706 -0.4375741 -0.1803866 -0.6303760 -0.08995198  2.7293244
> > 2(1)   1.4154202  0.2559212  0.2104513  0.7439446  0.84897905 -0.4144865
> > 3(1)  -1.3709275  1.0472759  1.5975148  0.3190503  1.10430959 -1.8285194
> > 4(1)  -1.1436430  2.2071763 -0.2637954 -0.4915366 -0.03925020  1.3311624
> > 5(1)  -0.8003656  1.6421541 -1.4603128  0.4493069  0.28194066 -0.4728086
> > 6(1)   0.9236015  0.3780122 -1.3848196  0.4263684  0.99584590 -1.4536475
> > 7(1)   0.8810281  0.0381152  0.3810457 -0.6884233 -0.11018089  0.4221188
> > 8(1)   0.3819421 -0.8431364  1.9876901  0.7072257  0.45524929  2.7013515
> > 9(1)  -1.1247988  1.3083178 -0.3438442  0.3300832  0.67013503  1.2912443
> > 10(1) -0.3643043  1.0756782 -1.2026318  0.4477054  0.54486700 -0.3369889
> > 11(1)  0.8294049  1.8170357  0.5691249  1.9213791 -0.29295754 -0.2617228
> > 12(1) -1.0085265 -0.7556545 -1.4033321 -0.4646647 -0.14984913 -0.4848657
> >
> > A brute force way to do this is to repeat the 12 values for each column
> so
> > that
> > the number of rows in the  "sweepzoo" is equal to the nmber of rows on
> the
> > long zoo, object and then just subtract them. longzoomatrix-sweepzoo
> >
> > As a function sweep() wont work because it expects a  vector whose
> > dimensions
> > matches the dimension of the MARGIN.
> >
> > Is there a elegant way to do this short of creating a "sweep zoo" that
> > matches
> > the row dimension of longzoo?  ( would be a nice addition to sweep)
> >
>
> If the question is how to demean each column then try this:
>
> > z <- zoo(cbind(a = 1:3, b = 4:6))
> > scale(z, scale = FALSE)
>   a  b
> 1 -1 -1
> 2  0  0
> 3  1  1
> attr(,"scaled:center")
> a b
> 2 5
>
> > # or
> > sweep(z, 2, colMeans(z))
>   a  b
> 1 -1 -1
> 2  0  0
> 3  1  1
>

        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to