### structure-skeletonK.R ---
##----------------------------------------------------------------------
## Author: Brice Ozenne
## Created: maj 11 2023 (11:55)
## Version:
## Last-Updated: okt 16 2024 (15:03)
## By: Brice Ozenne
## Update #: 77
##----------------------------------------------------------------------
##
### Commentary:
##
### Change Log:
##----------------------------------------------------------------------
##
### Code:
## * .skeletonK
##' @title Parametrization of Variance Multiplier Structure.
##' @description Parametrization of the ratio between the variance for the reference level and the other levels.
##' @noRd
##'
##' @param structure [structure]
##' @param U.strata [character vector] strata levels
##' @param sep [character vector of length 2] characters used to name the variance parameters,
##' the first is used to specify the covariate level whereas
##' the second is used to specify the strata level (when more than 1 strata).
##'
##' @keywords internal
`.skeletonK` <-
function(structure, U.strata, sep) UseMethod(".skeletonK")
## * .skeletonK.ID
.skeletonK.ID <- function(structure, U.strata, sep){
## no variance multipler
return(structure)
}
## * .skeletonK.IND
.skeletonK.IND <- function(structure, U.strata, sep){
## ** extract information
strata.var <- structure$name$strata
X.var <- structure$var$X
lp2X.var <- structure$var$lp2X
if(NCOL(X.var)==0){
n.strata <- 0
}else{
n.strata <- length(U.strata)
}
param.sigma <- structure$param[structure$param$type=="sigma","name"]
strata.sigma <- structure$param[structure$param$type=="sigma","index.strata"]
## ** identify and name parameters
index.k <- which(attr(X.var,"assign")>(n.strata>1)) ## complement with structure$param$index.level
if(length(index.k)==0){return(structure)} ## no variance multiplier
M.level.k <- attr(X.var,"M.level")[index.k,,drop=FALSE]
vec.level.k <- nlme::collapse(lapply(1:NCOL(M.level.k), function(iVar){
paste0(names(M.level.k)[iVar],M.level.k[,iVar])
}), sep = sep[2], as.factor = FALSE)
if(n.strata==1){ ## no strata
level.k <- paste0(sep[1],nlme::collapse(M.level.k, sep = sep[2], as.factor = FALSE))
}else if(any(colnames(M.level.k) %in% strata.var == FALSE)){ ## strata with covariate(s) - make sure the strata variable is at the end
level.k <- paste0(sep[1],nlme::collapse(M.level.k[,c(setdiff(colnames(M.level.k),strata.var),strata.var),drop=FALSE], sep = sep[2], as.factor = FALSE))
}else{ ## only strata
level.k <- paste0(sep[2],nlme::collapse(M.level.k, sep = sep[2], as.factor = FALSE))
}
if(!identical(colnames(X.var)[index.k],vec.level.k)){
stop("Could not find the k parameters in the design matrix for the variance.\n")
}
colnames(X.var)[index.k] <- paste0("k",level.k)
colnames(lp2X.var)[index.k] <- paste0("k",level.k)
param.k <- colnames(X.var)[index.k]
n.k <- length(param.k)
## ** find code associated to each parameter
## subset rows corresponding only to the multipliers i.e. non-0 intercept and covariate value in the design matrix
X.Uk <- lp2X.var[rowSums(abs(lp2X.var))>1,,drop=FALSE]
## generate code
code.k <- stats::setNames(rownames(X.Uk),
apply(X.Uk[,param.k,drop=FALSE], 1, function(iRow){names(which(iRow==1))}))[param.k]
code.k <- as.character(code.k[param.k])
if(n.strata == 1){
strata.k <- stats::setNames(rep(1,n.k),param.k)
}else{
strata.k <- stats::setNames(match(M.level.k[,strata.var],U.strata),param.k)
}
## ** update
structure$var$X <- X.var
structure$var$lp2X <- lp2X.var
structure.k <- data.frame(name = param.k,
index.strata = strata.k,
type = rep("k",length=n.k),
constraint = as.numeric(NA),
level = level.k,
code = code.k,
lp.x = as.numeric(NA),
lp.y = as.numeric(NA),
sigma = param.sigma[match(strata.k,strata.sigma)],
k.x = as.character(NA),
k.y = as.character(NA),
stringsAsFactors = FALSE)
rownames(structure.k) <- NULL
structure$param <- rbind(structure$param, structure.k)
## attr(structure$param,"level.var") <- c(attr(structure$param,"level.var"), outK$code)
## ** export
return(structure)
}
## * skeletonK.CS
.skeletonK.CS <- .skeletonK.IND
## * skeletonK.RE
.skeletonK.RE <- .skeletonK.IND
## * skeletonK.TOEPLITZ
.skeletonK.TOEPLITZ <- .skeletonK.IND
## * skeletonK.UN
.skeletonK.UN <- .skeletonK.IND
## * skeletonK.EXP
.skeletonK.UN <- .skeletonK.IND
##----------------------------------------------------------------------
### structure-skeletonK.R ends here
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.