Calculates Bro and Kiers's core consistency diagnostic (CORCONDIA) for a fit parafac or parafac2 model. For Parafac2, the diagnostic is calculated after transforming the data.
corcondia(X, object, divisor = c("nfac","core"))
Arguments
X: Three-way data array with dim=c(I,J,K) or four-way data array with dim=c(I,J,K,L). Can also input a list of two-way or three-way arrays (for Parafac2).
object: Object of class "parafac" (output from parafac) or class "parafac2" (output from parafac2).
divisor: Divide by number of factors (default) or core sum of squares.
Returns
Returns CORCONDIA value.
References
Bro, R., & Kiers, H.A.L. (2003). A new efficient method for determining the number of components in PARAFAC models. Journal of Chemometrics, 17, 274-286. tools:::Rd_expr_doi("10.1002/cem.801")
where G is the least squares estimate of the Tucker core array, S is a super-diagonal core array, and divisor is the sum of squares of either S ("nfac") or G ("core"). A value of 100 indiciates a perfect multilinear structure, and smaller values indicate greater violations of multilinear structure.
Examples
########## EXAMPLE ########### create random data array with Parafac structureset.seed(3)mydim <- c(50,20,5)nf <-2Amat <- matrix(rnorm(mydim[1]*nf),mydim[1],nf)Bmat <- matrix(runif(mydim[2]*nf),mydim[2],nf)Cmat <- matrix(runif(mydim[3]*nf),mydim[3],nf)Xmat <- array(tcrossprod(Amat,krprod(Cmat,Bmat)),dim=mydim)Emat <- array(rnorm(prod(mydim)),dim=mydim)Emat <- nscale(Emat,0, ssnew = sumsq(Xmat))# SNR=1X <- Xmat + Emat
# fit Parafac model (1-4 factors)pfac1 <- parafac(X,nfac=1,nstart=1)pfac2 <- parafac(X,nfac=2,nstart=1)pfac3 <- parafac(X,nfac=3,nstart=1)pfac4 <- parafac(X,nfac=4,nstart=1)# check corcondiacorcondia(X, pfac1)corcondia(X, pfac2)corcondia(X, pfac3)corcondia(X, pfac4)