Trigonometric basis expansion
cosinor.RdBuilds a design matrix of sin/cos pairs for use in models
with periodic predictors. Can be used directly or inside formulas passed
to make_matrices (where expansion is handled automatically).
Value
A numeric matrix with 2 * length(period) columns named
sin(2*pi*x/period) / cos(2*pi*x/period).
Details
The resulting columns form the basis for linear predictors of the form $$ \eta_t = \beta_0 + \sum_k \Bigl( \beta_{1k} \sin\!\Bigl(\tfrac{2 \pi x_t}{\text{period}_k}\Bigr) + \beta_{2k} \cos\!\Bigl(\tfrac{2 \pi x_t}{\text{period}_k}\Bigr) \Bigr). $$
Examples
cosinor(1:24, period = 24)
#> sin(2*pi*1:24/24) cos(2*pi*1:24/24)
#> [1,] 2.588190e-01 9.659258e-01
#> [2,] 5.000000e-01 8.660254e-01
#> [3,] 7.071068e-01 7.071068e-01
#> [4,] 8.660254e-01 5.000000e-01
#> [5,] 9.659258e-01 2.588190e-01
#> [6,] 1.000000e+00 6.123234e-17
#> [7,] 9.659258e-01 -2.588190e-01
#> [8,] 8.660254e-01 -5.000000e-01
#> [9,] 7.071068e-01 -7.071068e-01
#> [10,] 5.000000e-01 -8.660254e-01
#> [11,] 2.588190e-01 -9.659258e-01
#> [12,] 1.224647e-16 -1.000000e+00
#> [13,] -2.588190e-01 -9.659258e-01
#> [14,] -5.000000e-01 -8.660254e-01
#> [15,] -7.071068e-01 -7.071068e-01
#> [16,] -8.660254e-01 -5.000000e-01
#> [17,] -9.659258e-01 -2.588190e-01
#> [18,] -1.000000e+00 -1.836970e-16
#> [19,] -9.659258e-01 2.588190e-01
#> [20,] -8.660254e-01 5.000000e-01
#> [21,] -7.071068e-01 7.071068e-01
#> [22,] -5.000000e-01 8.660254e-01
#> [23,] -2.588190e-01 9.659258e-01
#> [24,] -2.449294e-16 1.000000e+00
cosinor(1:24, period = c(24, 12, 6))
#> sin(2*pi*1:24/24) cos(2*pi*1:24/24) sin(2*pi*1:24/12) cos(2*pi*1:24/12)
#> [1,] 2.588190e-01 9.659258e-01 5.000000e-01 8.660254e-01
#> [2,] 5.000000e-01 8.660254e-01 8.660254e-01 5.000000e-01
#> [3,] 7.071068e-01 7.071068e-01 1.000000e+00 6.123234e-17
#> [4,] 8.660254e-01 5.000000e-01 8.660254e-01 -5.000000e-01
#> [5,] 9.659258e-01 2.588190e-01 5.000000e-01 -8.660254e-01
#> [6,] 1.000000e+00 6.123234e-17 1.224647e-16 -1.000000e+00
#> [7,] 9.659258e-01 -2.588190e-01 -5.000000e-01 -8.660254e-01
#> [8,] 8.660254e-01 -5.000000e-01 -8.660254e-01 -5.000000e-01
#> [9,] 7.071068e-01 -7.071068e-01 -1.000000e+00 -1.836970e-16
#> [10,] 5.000000e-01 -8.660254e-01 -8.660254e-01 5.000000e-01
#> [11,] 2.588190e-01 -9.659258e-01 -5.000000e-01 8.660254e-01
#> [12,] 1.224647e-16 -1.000000e+00 -2.449294e-16 1.000000e+00
#> [13,] -2.588190e-01 -9.659258e-01 5.000000e-01 8.660254e-01
#> [14,] -5.000000e-01 -8.660254e-01 8.660254e-01 5.000000e-01
#> [15,] -7.071068e-01 -7.071068e-01 1.000000e+00 1.194340e-15
#> [16,] -8.660254e-01 -5.000000e-01 8.660254e-01 -5.000000e-01
#> [17,] -9.659258e-01 -2.588190e-01 5.000000e-01 -8.660254e-01
#> [18,] -1.000000e+00 -1.836970e-16 3.673940e-16 -1.000000e+00
#> [19,] -9.659258e-01 2.588190e-01 -5.000000e-01 -8.660254e-01
#> [20,] -8.660254e-01 5.000000e-01 -8.660254e-01 -5.000000e-01
#> [21,] -7.071068e-01 7.071068e-01 -1.000000e+00 -4.286264e-16
#> [22,] -5.000000e-01 8.660254e-01 -8.660254e-01 5.000000e-01
#> [23,] -2.588190e-01 9.659258e-01 -5.000000e-01 8.660254e-01
#> [24,] -2.449294e-16 1.000000e+00 -4.898587e-16 1.000000e+00
#> sin(2*pi*1:24/6) cos(2*pi*1:24/6)
#> [1,] 8.660254e-01 0.5
#> [2,] 8.660254e-01 -0.5
#> [3,] 1.224647e-16 -1.0
#> [4,] -8.660254e-01 -0.5
#> [5,] -8.660254e-01 0.5
#> [6,] -2.449294e-16 1.0
#> [7,] 8.660254e-01 0.5
#> [8,] 8.660254e-01 -0.5
#> [9,] 3.673940e-16 -1.0
#> [10,] -8.660254e-01 -0.5
#> [11,] -8.660254e-01 0.5
#> [12,] -4.898587e-16 1.0
#> [13,] 8.660254e-01 0.5
#> [14,] 8.660254e-01 -0.5
#> [15,] 2.388680e-15 -1.0
#> [16,] -8.660254e-01 -0.5
#> [17,] -8.660254e-01 0.5
#> [18,] -7.347881e-16 1.0
#> [19,] 8.660254e-01 0.5
#> [20,] 8.660254e-01 -0.5
#> [21,] 8.572528e-16 -1.0
#> [22,] -8.660254e-01 -0.5
#> [23,] -8.660254e-01 0.5
#> [24,] -9.797174e-16 1.0
## In model formulas (expand_cosinor handles the expansion):
form <- ~ x + temp * cosinor(hour, c(24, 12))
data <- data.frame(x = runif(24), temp = rnorm(24, 20), hour = 1:24)
modmat <- make_matrices(form, data = data)