[R] Sweeping a zoo series

Gabor Grothendieck ggrothendieck at gmail.com
Wed Aug 11 20:21:50 CEST 2010


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



More information about the R-help mailing list