Nothing
## =============================================================================
##' @title Test the consistency of the panel in a CATA experiment
##'
##' @description
##' Permutation test on the agreement between subjects in a CATA experiment
##'
##' @usage
##' consistency_cata_panel(Data,nblo, nperm=100, alpha=0.05)
##'
##'
##' @param Data data frame or matrix. Correspond to all the blocks of variables merged horizontally
##'
##' @param nblo numerical. Number of blocks (subjects).
##'
##' @param nperm numerical. How many permutations are required? Default: 100
##'
##' @param alpha numerical between 0 and 1. What is the threshold? Default: 0.05
##'
##'
##'
##' @return a list with:
##' \itemize{
##' \item answer: the answer of the test
##' \item pval: pvalue of the test
##' \item dis: distance between the homogeneity and the median of the permutations
##' }
##'
##'
##'
##' @keywords CATA RATA
##'
##' @references
##' Llobell, F., Giacalone, D., Labenne, A., Qannari, E.M. (2019). Assessment of the agreement and cluster analysis of the respondents in a CATA experiment. Food Quality and Preference, 77, 184-190.\cr
##' Bonnet, L., Ferney, T., Riedel, T., Qannari, E.M., Llobell, F. (September 14, 2022) .Using CATA for sensory profiling: assessment of the panel performance. Eurosense, Turku, Finland.
##'
##' @examples
##' \donttest{
##' data(straw)
##' #with all subjects
##' consistency_cata_panel(Data=straw, nblo=114)
##' }
##'
##' @seealso \code{\link{consistency_cata}}, \code{\link{change_cata_format}}, \code{\link{change_cata_format2}}
##'
##' @export
## =============================================================================
consistency_cata_panel <- function(Data, nblo, nperm = 100, alpha = 0.05) {
nprod <- nrow(Data)
nattr <- ncol(Data) / nblo
n <- nprod
Blocks <- rep(nattr, nblo)
J <- rep(1:nblo, times = Blocks) # indicates which block each variable belongs to
X <- Data
# parapet for numerical Data
for (i in 1:ncol(Data))
{
if (is.numeric(Data[, i]) == FALSE) {
stop(paste("The data must be numeric (column", i, ")"))
}
}
# #parapet for binary Data
# if ((sum(Data==0)+sum(Data==1))!=(dim(Data)[1]*dim(Data)[2]))
# {
# stop("only binary Data is accepted (0 or 1)")
# }
# no NA
if (sum(is.na(Data)) > 0) {
print("NA detected:")
tabna <- which(is.na(Data), arr.ind = TRUE)
print(tabna)
stop(paste("NA are not accepted"))
}
Xj <- array(0, dim = c(n, nattr, nblo)) # array with all subjects matrices
muk <- NULL
for (j in 1:nblo)
{
Aj <- as.matrix(X[, J == j])
normXj <- sqrt(sum(diag(tcrossprod(Aj, Aj))))
muk[j] <- normXj
if (normXj == 0) {
stop(paste("error: the subject", j, "has only 0 or only 1")) # parapet for constant configurations
}
Xj[, , j] <- Aj / normXj # standardization
}
# S matrix:
S <- matrix(0, nblo, nblo)
diag(S) <- rep(1, nblo)
for (i in 1:(nblo - 1)) {
for (j in (i + 1):nblo) {
S[i, j] <- sum(diag(tcrossprod(Xj[, , i], Xj[, , j])))
S[j, i] <- S[i, j]
}
}
# first eigenvector and eigenvalue of S matrix
ressvd <- svd(S)
lambda <- ressvd$d[1]
hom <- lambda / nblo
# permutations
hom_perm <- NULL
lambda_perm <- NULL
for (k in 1:nperm)
{
for (j in 1:nblo)
{
Aj_perm <- Aj <- as.matrix(Xj[, , j])
tirage <- sample(1:nrow(X))
for (i in 1:nrow(X))
{
Aj_perm[i, ] <- Aj[tirage[i], ]
}
Xj[, , j] <- Aj_perm
}
# S matrix:
S <- matrix(0, nblo, nblo)
diag(S) <- rep(1, nblo)
for (i in 1:(nblo - 1)) {
for (j in (i + 1):nblo) {
S[i, j] <- sum(diag(tcrossprod(Xj[, , i], Xj[, , j])))
S[j, i] <- S[i, j]
}
}
# first eigenvector and eigenvalue of S matrix
ressvd <- svd(S)
lambda_perm[k] <- ressvd$d[1]
hom_perm[k] <- lambda_perm[k] / nblo
}
pval <- sum(hom_perm >= hom) / nperm
if (pval < alpha) {
consist <- "the panel is consistent"
} else {
consist <- "the panel is not consistent"
}
dis <- hom - median(hom_perm)
return(list(answer = consist, pval = pval, dis = dis))
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.