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)
[[alternative HTML version deleted]]
On Wed, Aug 11, 2010 at 12:22 PM, steven mosher <moshersteven at 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
On Wed, Aug 11, 2010 at 2:44 PM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:> On Wed, Aug 11, 2010 at 2:38 PM, steven mosher <moshersteven at gmail.com> wrote: >> 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. >> > > Try this to demean by column means for the years 2003 to 2007 > inclusive even though the series extends beyond that in both > directions: > >> z <- zoo(cbind(a = 1:10, b = (1:10)^2), 2001:2010) >> sweep(z, 2, colMeans(window(z, 2003:2007))) > ? ? ?a ? b > 2001 -4 -26 > 2002 -3 -23 > 2003 -2 -18 > 2004 -1 -11 > 2005 ?0 ?-2 > 2006 ?1 ? 9 > 2007 ?2 ?22 > 2008 ?3 ?37 > 2009 ?4 ?54 > 2010 ?5 ?73 >window also has start and end arguments so this works too:> zz <- zoo(cbind(a = 1:10, b = (1:10)^2), as.yearmon(2000 + 0:9/12))> colMeans. <- colMeans(window(zz, start = as.yearmon(2000+2/12), end = as.yearmon(2000 + 6/12))) > sweep(zz, 2, colMeans.)a b Jan 2000 -4 -26 Feb 2000 -3 -23 Mar 2000 -2 -18 Apr 2000 -1 -11 May 2000 0 -2 Jun 2000 1 9 Jul 2000 2 22 Aug 2000 3 37 Sep 2000 4 54 Oct 2000 5 73> # and the start and end args are coerced to the index class so it > # can be shortened to: > > colMeans. <- colMeans(window(zz, start = 2000+2/12, end = 2000 + 6/12)) > sweep(zz, 2, colMeans.)a b Jan 2000 -4 -26 Feb 2000 -3 -23 Mar 2000 -2 -18 Apr 2000 -1 -11 May 2000 0 -2 Jun 2000 1 9 Jul 2000 2 22 Aug 2000 3 37 Sep 2000 4 54 Oct 2000 5 73