Create Lagged objects
Lagged.RdCreate objects inheriting from Lagged.
Details
Lagged creates an object inheriting from "Lagged". The
exact class depends on argument data. This is
the easiest way to create lagged objects.
If data is a vector, matrix or 3D array, the result is
"Lagged1d", "Lagged2d" and "Lagged3d", respectively.
If data inherits from "Lagged", the result is
"FlexibleLagged".
Examples
## a discrete distribution with outcomes 0,1,2,3,4,5,6:
v <- dbinom(0:6, size = 6, p = 0.5)
bin6 <- Lagged(v)
## names are used, if present:
names(v) <- paste0("P(x=", 0:6, ")")
bin6a <- Lagged(v)
bin6a
#> An object of class "Lagged1d"
#> Slot *data*:
#> P(x=0) P(x=1) P(x=2) P(x=3) P(x=4) P(x=5) P(x=6)
#> 0.015625 0.093750 0.234375 0.312500 0.234375 0.093750 0.015625
## subsetting drops the laggedness:
bin6a[1:3]
#> P(x=1) P(x=2) P(x=3)
#> 0.093750 0.234375 0.312500
bin6a[]
#> P(x=0) P(x=1) P(x=2) P(x=3) P(x=4) P(x=5) P(x=6)
#> 0.015625 0.093750 0.234375 0.312500 0.234375 0.093750 0.015625
bin6a[0:2]
#> P(x=0) P(x=1) P(x=2)
#> 0.015625 0.093750 0.234375
## to resize (shrink or extend) the object use 'maxLag<-':
s8 <- s2 <- bin6a
maxLag(s2) <- 2
s2
#> An object of class "Lagged1d"
#> Slot *data*:
#> P(x=0) P(x=1) P(x=2)
#> 0.015625 0.093750 0.234375
## extending inserts NA's:
maxLag(s8) <- 8
s8
#> An object of class "Lagged1d"
#> Slot *data*:
#> P(x=0) P(x=1) P(x=2) P(x=3) P(x=4) P(x=5) P(x=6) <NA>
#> 0.015625 0.093750 0.234375 0.312500 0.234375 0.093750 0.015625 NA
#> <NA>
#> NA
## use assignment to extend with specific values:
s8a <- bin6a
s8a[7:8] <- c("P(x=7)" = 0, "P(x=8)" = 0)
s8a
#> An object of class "Lagged1d"
#> Slot *data*:
#> P(x=0) P(x=1) P(x=2) P(x=3) P(x=4) P(x=5) P(x=6)
#> 0.015625 0.093750 0.234375 0.312500 0.234375 0.093750 0.015625 0.000000
#>
#> 0.000000
## adapted from examples for acf()
## acf of univariate ts
acv1 <- acf(ldeaths, plot = FALSE)
class(acv1) # "acf"
#> [1] "acf"
a1 <- drop(acv1$acf)
class(a1) # numeric
#> [1] "numeric"
la1 <- Lagged(a1) # 1d lagged object from 'numeric':
Lagged(acv1) # 1d lagged object from 'acf':
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> 1.000000000 0.755051141 0.396956836 0.019395714 -0.355897989 -0.608566374
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> -0.681383469 -0.607909875 -0.378212377 -0.012975866 0.383252644 0.650206704
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> 0.723167071 0.638001465 0.371577811 0.009467461 -0.293699737 -0.496742216
#> Lag_18
#> -0.585558984
## acf of multivariate ts
acv2 <- acf(ts.union(mdeaths, fdeaths), plot = FALSE)
class(acv2) # "acf"
#> [1] "acf"
a2 <- acv2$acf
class(a2) # 3d array
#> [1] "array"
dim(a2)
#> [1] 16 2 2
la2a <- acf2Lagged(acv2) # explicitly convert 'acf' to lagged object
Lagged(acv2) # equivalently, just use Lagged()
#> An object of class "Lagged3d"
#> Slot *data*:
#> , , Lag_0
#>
#>
#> 1.0000000 0.9762413
#> 0.9762413 1.0000000
#>
#> , , Lag_1
#>
#>
#> 0.7570591 0.7356685
#> 0.7443093 0.7295201
#>
#> , , Lag_2
#>
#>
#> 0.4020525 0.3642418
#> 0.4052006 0.3808750
#>
#> , , Lag_3
#>
#>
#> 0.03783542 -0.01067572
#> 0.01975943 -0.01833805
#>
#> , , Lag_4
#>
#>
#> -0.3346538 -0.3829206
#> -0.3494684 -0.3889098
#>
#> , , Lag_5
#>
#>
#> -0.5889291 -0.6223870
#> -0.6040312 -0.6305605
#>
#> , , Lag_6
#>
#>
#> -0.6639578 -0.6885385
#> -0.6778035 -0.6959545
#>
#> , , Lag_7
#>
#>
#> -0.5915389 -0.610584
#> -0.6117935 -0.617580
#>
#> , , Lag_8
#>
#>
#> -0.3641284 -0.3833383
#> -0.3816714 -0.3960179
#>
#> , , Lag_9
#>
#>
#> -0.002048197 -0.01811207
#> -0.024534195 -0.03473011
#>
#> , , Lag_10
#>
#>
#> 0.3959546 0.3919831
#> 0.3400054 0.3487681
#>
#> , , Lag_11
#>
#>
#> 0.6502747 0.6565921
#> 0.6218958 0.6281912
#>
#> , , Lag_12
#>
#>
#> 0.7171089 0.7213972
#> 0.7082063 0.7158608
#>
#> , , Lag_13
#>
#>
#> 0.6375408 0.6391044
#> 0.6154271 0.6193603
#>
#> , , Lag_14
#>
#>
#> 0.3732288 0.3613526
#> 0.3656260 0.3584216
#>
#> , , Lag_15
#>
#>
#> 0.01393135 -3.385423e-03
#> 0.01505498 -3.603698e-05
#>
identical(la2a, Lagged(acv2)) # TRUE
#> [1] TRUE
la2a[0] # R_0, indexing lagged object
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1.0000000 0.9762413
#> [2,] 0.9762413 1.0000000
#>
a2[1, , ] # same, indexing array data from 'cf' object
#> [,1] [,2]
#> [1,] 1.0000000 0.9762413
#> [2,] 0.9762413 1.0000000
acv2[0] # same, indexing 'acf' object
#>
#> Autocorrelations of series ‘ts.union(mdeaths, fdeaths)’, by lag
#>
#> , , mdeaths
#>
#> mdeaths fdeaths
#> 1.000 (0) 0.976 (0)
#>
#> , , fdeaths
#>
#> mdeaths fdeaths
#> 0.976 (0) 1.000 (0)
#>
la2a[1] # R_1
#> , , 1
#>
#> [,1] [,2]
#> [1,] 0.7570591 0.7356685
#> [2,] 0.7443093 0.7295201
#>
a2[2, , ] # same
#> [,1] [,2]
#> [1,] 0.7570591 0.7356685
#> [2,] 0.7443093 0.7295201
acv2[1/12] # transposed, see end of this example section as to why use 1/12
#>
#> Autocorrelations of series ‘ts.union(mdeaths, fdeaths)’, by lag
#>
#> , , mdeaths
#>
#> mdeaths fdeaths
#> 0.757 ( 0.0833) 0.744 (-0.0833)
#>
#> , , fdeaths
#>
#> mdeaths fdeaths
#> 0.736 ( 0.0833) 0.730 ( 0.0833)
#>
la2a[2] # R_1
#> , , 1
#>
#> [,1] [,2]
#> [1,] 0.4020525 0.3642418
#> [2,] 0.4052006 0.3808750
#>
a2[3, , ] # same
#> [,1] [,2]
#> [1,] 0.4020525 0.3642418
#> [2,] 0.4052006 0.3808750
acv2[2/12] # transposed, see end of this example section as to why use 1/12
#>
#> Autocorrelations of series ‘ts.union(mdeaths, fdeaths)’, by lag
#>
#> , , mdeaths
#>
#> mdeaths fdeaths
#> 0.402 ( 0.167) 0.405 (-0.167)
#>
#> , , fdeaths
#>
#> mdeaths fdeaths
#> 0.364 ( 0.167) 0.381 ( 0.167)
#>
## multiple lags
la2a[0:1] # native indexing with lagged object
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1.0000000 0.9762413
#> [2,] 0.9762413 1.0000000
#>
#> , , 2
#>
#> [,1] [,2]
#> [1,] 0.7570591 0.7356685
#> [2,] 0.7443093 0.7295201
#>
a2[1:2, , ] # different ordering
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1.0000000 0.9762413
#> [2,] 0.7570591 0.7443093
#>
#> , , 2
#>
#> [,1] [,2]
#> [1,] 0.9762413 1.0000000
#> [2,] 0.7356685 0.7295201
#>
acv2$acf[1:2, ,] # also different ordering
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1.0000000 0.9762413
#> [2,] 0.7570591 0.7443093
#>
#> , , 2
#>
#> [,1] [,2]
#> [1,] 0.9762413 1.0000000
#> [2,] 0.7356685 0.7295201
#>
## '[' doesn't drop a dimension even when it is of length 1:
la2a[0]
#> , , 1
#>
#> [,1] [,2]
#> [1,] 1.0000000 0.9762413
#> [2,] 0.9762413 1.0000000
#>
la2a[1]
#> , , 1
#>
#> [,1] [,2]
#> [1,] 0.7570591 0.7356685
#> [2,] 0.7443093 0.7295201
#>
## to get a singleton element, use '[[':
la2a[[0]]
#> [,1] [,2]
#> [1,] 1.0000000 0.9762413
#> [2,] 0.9762413 1.0000000
la2a[[1]]
#> [,1] [,2]
#> [1,] 0.7570591 0.7356685
#> [2,] 0.7443093 0.7295201
## arithmetic and math operators
-la1
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> -1.000000000 -0.755051141 -0.396956836 -0.019395714 0.355897989 0.608566374
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> 0.681383469 0.607909875 0.378212377 0.012975866 -0.383252644 -0.650206704
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> -0.723167071 -0.638001465 -0.371577811 -0.009467461 0.293699737 0.496742216
#> Lag_18
#> 0.585558984
+la1
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> 1.000000000 0.755051141 0.396956836 0.019395714 -0.355897989 -0.608566374
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> -0.681383469 -0.607909875 -0.378212377 -0.012975866 0.383252644 0.650206704
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> 0.723167071 0.638001465 0.371577811 0.009467461 -0.293699737 -0.496742216
#> Lag_18
#> -0.585558984
2*la1
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> 2.00000000 1.51010228 0.79391367 0.03879143 -0.71179598 -1.21713275
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> -1.36276694 -1.21581975 -0.75642475 -0.02595173 0.76650529 1.30041341
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> 1.44633414 1.27600293 0.74315562 0.01893492 -0.58739947 -0.99348443
#> Lag_18
#> -1.17111797
la1^2
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> 1.000000e+00 5.701022e-01 1.575747e-01 3.761937e-04 1.266634e-01 3.703530e-01
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> 4.642834e-01 3.695544e-01 1.430446e-01 1.683731e-04 1.468826e-01 4.227688e-01
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> 5.229706e-01 4.070459e-01 1.380701e-01 8.963282e-05 8.625954e-02 2.467528e-01
#> Lag_18
#> 3.428793e-01
la1 + la1^2
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> 2.000000000 1.325153365 0.554531566 0.019771908 -0.229234610 -0.238213342
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> -0.217100037 -0.238355459 -0.235167775 -0.012807492 0.530135234 1.072975461
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> 1.246137683 1.045047335 0.509647880 0.009557094 -0.207440201 -0.249989387
#> Lag_18
#> -0.242679660
abs(la1)
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> 1.000000000 0.755051141 0.396956836 0.019395714 0.355897989 0.608566374
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> 0.681383469 0.607909875 0.378212377 0.012975866 0.383252644 0.650206704
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> 0.723167071 0.638001465 0.371577811 0.009467461 0.293699737 0.496742216
#> Lag_18
#> 0.585558984
sinpi(la1)
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4
#> 3.487868e-16 6.957974e-01 9.480588e-01 6.089573e-02 -8.992651e-01
#> Lag_5 Lag_6 Lag_7 Lag_8 Lag_9
#> -9.423969e-01 -8.419911e-01 -9.430847e-01 -9.276945e-01 -4.075359e-02
#> Lag_10 Lag_11 Lag_12 Lag_13 Lag_14
#> 9.334896e-01 8.907115e-01 7.641331e-01 9.074825e-01 9.197119e-01
#> Lag_15 Lag_16 Lag_17 Lag_18
#> 2.973852e-02 -7.972253e-01 -9.999476e-01 -9.640925e-01
sqrt(abs(la1))
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5 Lag_6
#> 1.00000000 0.86893679 0.63004511 0.13926850 0.59657186 0.78010664 0.82545955
#> Lag_7 Lag_8 Lag_9 Lag_10 Lag_11 Lag_12 Lag_13
#> 0.77968575 0.61498974 0.11391166 0.61907402 0.80635396 0.85039230 0.79874994
#> Lag_14 Lag_15 Lag_16 Lag_17 Lag_18
#> 0.60957183 0.09730088 0.54194071 0.70479942 0.76521826
## Summary group
max(la1)
#> [1] 1
min(la1)
#> [1] -0.6813835
range(la1)
#> [1] -0.6813835 1.0000000
prod(la1)
#> [1] -8.84397e-11
sum(la1)
#> [1] 0.92613
any(la1 < 0)
#> [1] TRUE
all(la1 >= 0)
#> [1] FALSE
## Math2 group
round(la1)
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5 Lag_6 Lag_7 Lag_8 Lag_9 Lag_10
#> 1 1 0 0 0 -1 -1 -1 0 0 0
#> Lag_11 Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17 Lag_18
#> 1 1 1 0 0 0 0 -1
round(la1, 2)
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5 Lag_6 Lag_7 Lag_8 Lag_9 Lag_10
#> 1.00 0.76 0.40 0.02 -0.36 -0.61 -0.68 -0.61 -0.38 -0.01 0.38
#> Lag_11 Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17 Lag_18
#> 0.65 0.72 0.64 0.37 0.01 -0.29 -0.50 -0.59
signif(la1)
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5
#> 1.00000000 0.75505100 0.39695700 0.01939570 -0.35589800 -0.60856600
#> Lag_6 Lag_7 Lag_8 Lag_9 Lag_10 Lag_11
#> -0.68138300 -0.60791000 -0.37821200 -0.01297590 0.38325300 0.65020700
#> Lag_12 Lag_13 Lag_14 Lag_15 Lag_16 Lag_17
#> 0.72316700 0.63800100 0.37157800 0.00946746 -0.29370000 -0.49674200
#> Lag_18
#> -0.58555900
signif(la1, 4)
#> An object of class "Lagged1d"
#> Slot *data*:
#> Lag_0 Lag_1 Lag_2 Lag_3 Lag_4 Lag_5 Lag_6 Lag_7
#> 1.000000 0.755100 0.397000 0.019400 -0.355900 -0.608600 -0.681400 -0.607900
#> Lag_8 Lag_9 Lag_10 Lag_11 Lag_12 Lag_13 Lag_14 Lag_15
#> -0.378200 -0.012980 0.383300 0.650200 0.723200 0.638000 0.371600 0.009467
#> Lag_16 Lag_17 Lag_18
#> -0.293700 -0.496700 -0.585600
## The remaining examples below are only relevant
## for users comparing to indexing of 'acf'
##
## indexing in base R acf() is somewhat misterious, so an example with
## DIY computation of lag_1 autocovariance matrix
n <- length(mdeaths)
tmpcov <- sum((mdeaths - mean(mdeaths)) * (fdeaths - mean(fdeaths)) ) / n
msd <- sqrt(sum((mdeaths - mean(mdeaths))^2)/n)
fsd <- sqrt(sum((fdeaths - mean(fdeaths))^2)/n)
tmpcov1 <- sum((mdeaths - mean(mdeaths))[2:n] *
(fdeaths - mean(fdeaths))[1:(n-1)] ) / n
tmpcov1 / (msd * fsd)
#> [1] 0.7356685
la2a[[1]][1,2] - tmpcov1 / (msd * fsd) # only numerically different
#> [1] 2.220446e-16
## the raw acf in the 'acf' object is not surprising:
la2a[[1]][1,2] == acv2$acf[2, 1, 2] # TRUE
#> [1] TRUE
## ... but this probably is:
acv2[1]
#>
#> Autocorrelations of series ‘ts.union(mdeaths, fdeaths)’, by lag
#>
#> , , mdeaths
#>
#> mdeaths fdeaths
#> 0.717 ( 1) 0.708 (-1)
#>
#> , , fdeaths
#>
#> mdeaths fdeaths
#> 0.721 ( 1) 0.716 ( 1)
#>
## the ts here is monthly but has unit of lag 'year'
## so acv2[1] asks for lag 1 year = 12 months, thus
acv2[1/12]
#>
#> Autocorrelations of series ‘ts.union(mdeaths, fdeaths)’, by lag
#>
#> , , mdeaths
#>
#> mdeaths fdeaths
#> 0.757 ( 0.0833) 0.744 (-0.0833)
#>
#> , , fdeaths
#>
#> mdeaths fdeaths
#> 0.736 ( 0.0833) 0.730 ( 0.0833)
#>
all( acv2$acf[13, , ] == drop(acv2[1]$acf) ) # TRUE
#> [1] TRUE
all( acv2$acf[2, , ] == drop(acv2[1/12]$acf) ) # TRUE
#> [1] TRUE
all( la2a[[1]] == drop(acv2[1/12]$acf) ) # TRUE
#> [1] TRUE