View source: R/HelperFunctions.R
| matinvsqrt | R Documentation |
Calculate Matrix Inverse Square Root for Symmetric Matrices
matinvsqrt(mat)
mat |
A symmetric matrix |
Uses an eigenvalue-decomposition-based approach.
Non-positive eigenvalues are set to 0 before taking inverse fourth roots.
This implementation is particularly useful for whitening procedures in GLMs with correlation structures and for computing variance-covariance matrices under constraints.
You can use this to help construct a custom VhalfInv_fxn for
lgspline. When only VhalfInv is supplied there,
the corresponding Vhalf is reconstructed internally by inversion
for the GEE code paths.
A matrix \textbf{B} such that \textbf{B}\textbf{B}
equals the Moore-Penrose-style inverse on the positive-eigenvalue
subspace, with non-positive components truncated to 0.
## Identity matrix
m1 <- diag(2)
matinvsqrt(m1) # Returns identity matrix
## Compound symmetry correlation matrix
rho <- 0.5
m2 <- matrix(rho, 3, 3) + diag(1-rho, 3)
B <- matinvsqrt(m2)
# Verify: B %**% B approximately equals solve(m2)
all.equal(B %**% B, solve(m2))
## Example for GLM correlation structure
n_blocks <- 2 # Number of subjects
block_size <- 3 # Measurements per subject
rho <- 0.7 # Within-subject correlation
# Correlation matrix for one subject
R <- matrix(rho, block_size, block_size) +
diag(1-rho, block_size)
## Full correlation matrix for all subjects
V <- kronecker(diag(n_blocks), R)
## Create whitening matrix
VhalfInv <- matinvsqrt(V)
# Example construction of VhalfInv_fxn for lgspline
VhalfInv_fxn <- function(par) {
rho <- tanh(par) # Transform parameter to (-1, 1)
R <- matrix(rho, block_size, block_size) +
diag(1-rho, block_size)
kronecker(diag(n_blocks), matinvsqrt(R))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.