#auxiliary to test diagonality .computeMuCheckDiag = function(X, Y, K, jd_method, beta_ref) { set.seed(99) d <- ncol(X) #TODO: redundant code, same as computeMu() main method. Comments are stripped M3 <- .Moments_M3(X,Y) M2_t <- array(dim=c(d,d,d)) for (i in 1:d) { rho <- c(rep(0,i-1),1,rep(0,d-i)) M2_t[,,i] <- .T_I_I_w(M3,rho) } jd <- jointDiag::ajd(M2_t, method=jd_method) V <- if (jd_method=="uwedge") jd$B else solve(jd$A) M2_t <- array(dim=c(d,d,K)) for (i in 1:K) M2_t[,,i] <- .T_I_I_w(M3,V[,i]) #END of computeMu() code max_error <- 1.0 #TODO: tune ? invbeta <- MASS::ginv(beta_ref) for (i in 1:K) { shouldBeDiag <- invbeta %*% M2_t[,,i] %*% t(invbeta) expect_lt( mean( abs(shouldBeDiag[upper.tri(shouldBeDiag) | lower.tri(shouldBeDiag)]) ), max_error) } } test_that("'jedi' and 'uwedge' joint-diagonalization methods return a correct matrix", { set.seed(99) n <- 10000 d_K <- list( c(2,2), c(5,3), c(20,13) ) for (dk_index in 1:length(d_K)) { d <- d_K[[dk_index]][1] K <- d_K[[dk_index]][2] #NOTE: sometimes large errors if pr is not balanced enough (e.g. random); # same note for beta. However we could be more random than that... beta_ref <- rbind(diag(K),matrix(0,nrow=d-K,ncol=K)) io <- generateSampleIO(n, p=rep(1/K,K-1), beta=beta_ref, rep(0,K), link="logit") # .computeMuCheckDiag(io$X, io$Y, K, jd_method="uwedge", beta_ref) #TODO: sometimes failing test #TODO: some issues with jedi method (singular system) #.computeMuCheckDiag(io$X, io$Y, K, jd_method="jedi", beta_ref) } })