Estou tentando calcular a concordância entre avaliadores (teste Stuart-Maxwell). Cheguei a um certo ponto. Também detectei o problema. No entanto, tive um problema em algum lugar. Como posso encontrar o padrão no conjunto de dados? Para continuar a análise, preciso remover as matrizes problemáticas do conjunto de dados.
# 2 raters, 4 different response category and 4 subjects
R1 <- as.data.frame(expand.grid(rep(list(0:3), 4)))
R2 <- as.data.frame(expand.grid(rep(list(0:3), 4)))
# nrow(R1)*nrow(R2) = 256
pattern <- expand.grid(1:256, 1:256)
allPossible <- vector(mode = "list", length = nrow(pattern))
for(i in 1:nrow(pattern)){
allPossible[[i]] <- rbind(R1[pattern[i, 1], ], R2[pattern[i, 2], ])
}
# 256*256 = 65536 possible rating
allPossible
# cross-tabulation
levs <- c(0:2)
list1 <- list()
list2 <- list()
list_A <- list()
for (i in 1:65536) {
list1[[i]] <- factor(allPossible[[i]][1, ], levels = levs)
list2[[i]] <- factor(allPossible[[i]][2, ], levels = levs)
list_A[[i]] <- xtabs(~list1[[i]] + list2[[i]])
}
list_A
# 256 out of 65536 are completely same ratings. I have to delete them. (eg. check allPossible[1], allPossible[258])
list_B <- list_A[-seq(from = 1, to = 65536, by = 257)]
# Stuart-Maxwell Test
install.packages("DescTools")
library(DescTools)
# Now, I have 65280 different matrices
outputSM <- list()
for (i in 1:65280) {
outputSM[[i]] <- StuartMaxwellTest(list_B[[i]])
}
outputSM
# it didn't work. Because, there are still some 3x3 matrices with the determinant 0 (zero).
# eg. problematic 3x3 matrices
StuartMaxwellTest(list_A[[260]])
StuartMaxwellTest(list_A[[820]])
# yes I found the source of some of problematic matrices
allPossible[260]
allPossible[820]
O problema não é necessariamente apenas determinantes iguais a zero. Existem algumas matrizes onde o determinante é igual a zero, mas o teste ainda é válido. Tomemos, por exemplo, o segundo elemento de
list_A
:A verificação de que o teste está sendo executado pode ser vista nas linhas 25 a 31 do código-fonte.
Para descobrir antecipadamente quais são válidos, você poderia escrever uma pequena função que acabou de fazer esse teste:
Então, você poderia aplicar essa função à sua lista de matrizes:
Isso indica que existem 10.000 outras matrizes que não passarão no teste. Você poderia então usar apenas os válidos:
Outra opção, talvez mais fácil, seria apenas capturar os erros usando
tryCatch()
e retornar um valor ausente se não for válido. Por exemplo: