Skip to contents

Builds 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).

Usage

cosinor(x, period = 24)

Arguments

x

Numeric vector of the periodic variable.

period

Numeric vector of period lengths, e.g. 24 for a daily cycle with hourly data or c(24, 12) for a daily + semi-daily cycle.

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)