2016-11-24 2 views
0

J'ai besoin de comparer deux matrices de probabilité pour connaître le degré de proximité des chaînes, donc j'utiliserais la valeur P résultante du test.Utiliser le paquet markovchain pour comparer deux chaînes de Markov empiriquement estimées

J'ai essayé d'utiliser le package markovchain r, plus précisément la fonction divergenceTest. Mais, le problème est que la fonction n'est pas correctement implémentée. Il est basé sur le test du livre "Statistical Inference Based on Divergence Measures" à la page 139, j'ai contacté les développeurs de paquets, mais ils n'ont toujours pas corrigé, donc j'ai essayé de l'implémenter, mais j'ai des problèmes, quelqu'un pourrait-il m'aider à trouver l'erreur ?

Paramètres: fréquence_matrice: matrice de fréquence utilisée pour estimer la matrice de probabilité. hypothétique: La matrice est-elle utilisée pour comparer avec la matrice estimée.

divergenceTest3 <- function(freq_matrix, hypothetic){ 
    n <- sum(freq_matrix) 
    empirical = freq_matrix 
    for (i in 1:length(hypothetic)){ 
    empirical[i,] <- freq_matrix[i,]/rowSums(freq_matrix)[i] 
    } 
    M <- nrow(empirical) 
    v <- numeric() 
    out <- 2 * n/.phi2(1) 
    sum <- 0 
    c <- 0 
    for(i in 1:M){  
    sum2 <- 0 
    sum3 <- 0  
    for(j in 1:M){ 
     if(hypothetic[i, j] > 0){ 
     c <- c + 1 
     }  
     sum2 <- sum2 + hypothetic[i, j] * .phi(empirical[i, j]/hypothetic[i, j]) 
    }  
    v[i] <- rowSums(freq_matrix)[i] 
    sum <- sum + ((v[i]/n) * sum2) 
    } 
    TStat <- out * sum 
    pvalue <- 1 - pchisq(TStat, c-M) 
    cat("The Divergence test statistic is: ", TStat, " the Chi-Square d.f. are: ", c-M," the p-value is: ", pvalue,"\n") 
    out <- list(statistic = TStat, p.value = pvalue) 
    return(out) 
} 
# phi function for divergence test 
.phi <- function(x) { 
    out <- x*log(x) - x + 1 
    return(out) 
} 
# another phi function for divergence test 
.phi2 <- function(x) { 
    out <- 1/x 
    return(out) 
} 

Répondre

0

Le test de divergence a été remplacé par la fonction verifyHomogeneity. Il nécessite et liste d'entrée des éléments qui peuvent être contraints à une matrice de transition brute (à partir de createSequenceMatrix). Puis il teste si elles appartiennent au même DTMC inconnu.

Voir l'exemple ci-dessous:

myMatr1<-matrix(c(0.2,.8,.5,.5),byrow=TRUE, nrow=2) 
myMatr2<-matrix(c(0.5,.5,.4,.6),byrow=TRUE, nrow=2) 
mc1<-as(myMatr1,"markovchain") 
mc2<-as(myMatr2,"markovchain") 
mc 
mc2 
sample1<-rmarkovchain(n=100, object=mc1) 
sample2<-rmarkovchain(n=200, object=mc2) 
# should reject 
verifyHomogeneity(inputList = list(sample1,sample2)) 
#should accept 
sample2<-rmarkovchain(n=200, object=mc1) 
verifyHomogeneity(inputList = list(sample1,sample2)) 
+0

professeur Bonjour, cette fonction semble fonctionner très bien maintenant! Mais, dans la documentation dit seulement que le test de l'article [S. Kullback du tout, tests pour les tables de contingence et chaînes de Markov], correct? Je voudrais savoir précisément quelle équation vous avez mise en place, car j'ai besoin de comprendre le test et j'ai des difficultés. Merci d'avance! – user2905427

+0

Merci, je vais mettre à jour les documents en conséquence –