The function genBlockMat() generates correlation matrices that can accommodate clustered observations over time where the within-cluster between-individual correlation in the same time period can be different from the within-cluster between-individual correlation across time periods.The matrix generated here can be used in function addCorGen().
blockDecayMat(ninds, nperiods, rho_w, r, pattern = "xsection", nclusters = 1)The number of units (individuals) in each cluster in each period.
The number periods that data are observed.
The within-period/between-individual correlation coefficient between -1 and 1.
The decay parameter if correlation declines over time, and can have values of "exp" or "prop". See details.
A string argument with options "xsection" (default) or "cohort".
An integer that indicates the number of matrices that will be generated.
A single correlation matrix of size nvars x nvars, or a list of matrices of potentially
different sizes with length indicated by nclusters.
A single correlation matrix or a list of matrices of potentially
different sizes with length indicated by nclusters.
Two general decay correlation structures are currently supported: a *cross-sectional*
exchangeable structure and a *closed cohort* exchangeable structure. In the *cross-sectional*
case, individuals or units in each time period are distinct. In the *closed cohort* structure,
individuals or units are repeated in each time period. The desired structure is specified
using pattern, which defaults to "xsection" if not specified.
This function can generate correlation matrices of different sizes, depending on the
combination of arguments provided. A single matrix will be generated when
nclusters == 1 (the default), and a list of matrices of matrices will be generated when
nclusters > 1.
If nclusters > 1, the length of ninds will depend on if sample sizes will vary by cluster
and/or period. There are three scenarios, and function evaluates the length of ninds to
determine which approach to take:
if the sample size is the same for all clusters in all periods, ninds will be
a single value (i.e., length = 1).
if the sample size differs by cluster but is the same for each period within each cluster
each period, then ninds will have a value for each cluster (i.e., length = nclusters).
if the sample size differs across clusters and across periods within clusters, ninds will have a
value for each cluster-period combination (i.e., length = nclusters x nperiods). This option is
only valid when pattern = "xsection".
In addition, rho_w and r can be specified as a single value (in which case they are consistent
across all clusters) or as a vector of length nclusters, in which case either one or
both of these parameters can vary by cluster.
See vignettes for more details.
Li et al. Mixed-effects models for the design and analysis of stepped wedge cluster randomized trials: An overview. Statistical Methods in Medical Research. 2021;30(2):612-639. doi:10.1177/0962280220932962
blockDecayMat(ninds = 4, nperiods = 3, rho_w = .8, r = .9)
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#> [1,] 1.000 0.800 0.800 0.800 0.72 0.72 0.72 0.72 0.648 0.648 0.648 0.648
#> [2,] 0.800 1.000 0.800 0.800 0.72 0.72 0.72 0.72 0.648 0.648 0.648 0.648
#> [3,] 0.800 0.800 1.000 0.800 0.72 0.72 0.72 0.72 0.648 0.648 0.648 0.648
#> [4,] 0.800 0.800 0.800 1.000 0.72 0.72 0.72 0.72 0.648 0.648 0.648 0.648
#> [5,] 0.720 0.720 0.720 0.720 1.00 0.80 0.80 0.80 0.720 0.720 0.720 0.720
#> [6,] 0.720 0.720 0.720 0.720 0.80 1.00 0.80 0.80 0.720 0.720 0.720 0.720
#> [7,] 0.720 0.720 0.720 0.720 0.80 0.80 1.00 0.80 0.720 0.720 0.720 0.720
#> [8,] 0.720 0.720 0.720 0.720 0.80 0.80 0.80 1.00 0.720 0.720 0.720 0.720
#> [9,] 0.648 0.648 0.648 0.648 0.72 0.72 0.72 0.72 1.000 0.800 0.800 0.800
#> [10,] 0.648 0.648 0.648 0.648 0.72 0.72 0.72 0.72 0.800 1.000 0.800 0.800
#> [11,] 0.648 0.648 0.648 0.648 0.72 0.72 0.72 0.72 0.800 0.800 1.000 0.800
#> [12,] 0.648 0.648 0.648 0.648 0.72 0.72 0.72 0.72 0.800 0.800 0.800 1.000
blockDecayMat(ninds = 4, nperiods = 3, rho_w = .8, r = .9, pattern = "cohort")
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#> [1,] 1.000 0.800 0.800 0.800 0.90 0.72 0.72 0.72 0.810 0.648 0.648 0.648
#> [2,] 0.800 1.000 0.800 0.800 0.72 0.90 0.72 0.72 0.648 0.810 0.648 0.648
#> [3,] 0.800 0.800 1.000 0.800 0.72 0.72 0.90 0.72 0.648 0.648 0.810 0.648
#> [4,] 0.800 0.800 0.800 1.000 0.72 0.72 0.72 0.90 0.648 0.648 0.648 0.810
#> [5,] 0.900 0.720 0.720 0.720 1.00 0.80 0.80 0.80 0.900 0.720 0.720 0.720
#> [6,] 0.720 0.900 0.720 0.720 0.80 1.00 0.80 0.80 0.720 0.900 0.720 0.720
#> [7,] 0.720 0.720 0.900 0.720 0.80 0.80 1.00 0.80 0.720 0.720 0.900 0.720
#> [8,] 0.720 0.720 0.720 0.900 0.80 0.80 0.80 1.00 0.720 0.720 0.720 0.900
#> [9,] 0.810 0.648 0.648 0.648 0.90 0.72 0.72 0.72 1.000 0.800 0.800 0.800
#> [10,] 0.648 0.810 0.648 0.648 0.72 0.90 0.72 0.72 0.800 1.000 0.800 0.800
#> [11,] 0.648 0.648 0.810 0.648 0.72 0.72 0.90 0.72 0.800 0.800 1.000 0.800
#> [12,] 0.648 0.648 0.648 0.810 0.72 0.72 0.72 0.90 0.800 0.800 0.800 1.000
blockDecayMat(ninds = 2, nperiods = 3, rho_w = .8, r = .9, pattern = "cohort", nclusters=2)
#> [[1]]
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1.000 0.800 0.90 0.72 0.810 0.648
#> [2,] 0.800 1.000 0.72 0.90 0.648 0.810
#> [3,] 0.900 0.720 1.00 0.80 0.900 0.720
#> [4,] 0.720 0.900 0.80 1.00 0.720 0.900
#> [5,] 0.810 0.648 0.90 0.72 1.000 0.800
#> [6,] 0.648 0.810 0.72 0.90 0.800 1.000
#>
#> [[2]]
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1.000 0.800 0.90 0.72 0.810 0.648
#> [2,] 0.800 1.000 0.72 0.90 0.648 0.810
#> [3,] 0.900 0.720 1.00 0.80 0.900 0.720
#> [4,] 0.720 0.900 0.80 1.00 0.720 0.900
#> [5,] 0.810 0.648 0.90 0.72 1.000 0.800
#> [6,] 0.648 0.810 0.72 0.90 0.800 1.000
#>
blockDecayMat(ninds = c(2, 3), nperiods = 3, rho_w = c(.8,0.7), r = c(.9,.8),
pattern = "cohort", nclusters=2)
#> [[1]]
#> [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,] 1.000 0.800 0.90 0.72 0.810 0.648
#> [2,] 0.800 1.000 0.72 0.90 0.648 0.810
#> [3,] 0.900 0.720 1.00 0.80 0.900 0.720
#> [4,] 0.720 0.900 0.80 1.00 0.720 0.900
#> [5,] 0.810 0.648 0.90 0.72 1.000 0.800
#> [6,] 0.648 0.810 0.72 0.90 0.800 1.000
#>
#> [[2]]
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#> [1,] 1.000 0.700 0.700 0.80 0.56 0.56 0.640 0.448 0.448
#> [2,] 0.700 1.000 0.700 0.56 0.80 0.56 0.448 0.640 0.448
#> [3,] 0.700 0.700 1.000 0.56 0.56 0.80 0.448 0.448 0.640
#> [4,] 0.800 0.560 0.560 1.00 0.70 0.70 0.800 0.560 0.560
#> [5,] 0.560 0.800 0.560 0.70 1.00 0.70 0.560 0.800 0.560
#> [6,] 0.560 0.560 0.800 0.70 0.70 1.00 0.560 0.560 0.800
#> [7,] 0.640 0.448 0.448 0.80 0.56 0.56 1.000 0.700 0.700
#> [8,] 0.448 0.640 0.448 0.56 0.80 0.56 0.700 1.000 0.700
#> [9,] 0.448 0.448 0.640 0.56 0.56 0.80 0.700 0.700 1.000
#>
blockDecayMat(ninds = c(2, 3, 4, 4, 2, 1), nperiods = 3, rho_w = .8, r = .9, nclusters=2)
#> [[1]]
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#> [1,] 1.000 0.800 0.72 0.72 0.72 0.648 0.648 0.648 0.648
#> [2,] 0.800 1.000 0.72 0.72 0.72 0.648 0.648 0.648 0.648
#> [3,] 0.720 0.720 1.00 0.80 0.80 0.720 0.720 0.720 0.720
#> [4,] 0.720 0.720 0.80 1.00 0.80 0.720 0.720 0.720 0.720
#> [5,] 0.720 0.720 0.80 0.80 1.00 0.720 0.720 0.720 0.720
#> [6,] 0.648 0.648 0.72 0.72 0.72 1.000 0.800 0.800 0.800
#> [7,] 0.648 0.648 0.72 0.72 0.72 0.800 1.000 0.800 0.800
#> [8,] 0.648 0.648 0.72 0.72 0.72 0.800 0.800 1.000 0.800
#> [9,] 0.648 0.648 0.72 0.72 0.72 0.800 0.800 0.800 1.000
#>
#> [[2]]
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#> [1,] 1.000 0.800 0.800 0.800 0.72 0.72 0.648
#> [2,] 0.800 1.000 0.800 0.800 0.72 0.72 0.648
#> [3,] 0.800 0.800 1.000 0.800 0.72 0.72 0.648
#> [4,] 0.800 0.800 0.800 1.000 0.72 0.72 0.648
#> [5,] 0.720 0.720 0.720 0.720 1.00 0.80 0.720
#> [6,] 0.720 0.720 0.720 0.720 0.80 1.00 0.720
#> [7,] 0.648 0.648 0.648 0.648 0.72 0.72 1.000
#>