2016-11-24 8 views
0

Мне нужно сравнить две матрицы вероятности, чтобы узнать степень близости цепей, поэтому я бы использовал полученное значение P для теста.Используйте пакет markovchain для сравнения двух эмпирически оцененных цепей Маркова

Я попытался использовать пакет markovchain r, точнее функцию divergenceTest. Но проблема в том, что функция не реализована должным образом. Он основан на тесте книги «Statistical Inference Based on Divergence Measures» на странице 139, я связался с разработчиками пакета, но они все еще не исправлены, поэтому я попытался реализовать, но у меня возникли проблемы, может ли кто-нибудь помочь мне найти ошибку ?

Параметры: freq_matrix: Используется ли частотная матрица для оценки вероятностной матрицы. hypothetic: Используется ли матрица для сравнения с оценочной матрицей.

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) 
} 

ответ

0

Тест дивергенции заменен функцией verifyHomogeneity. Он требует и вводит список элементов, которые могут быть принуждены к исходной матрице перехода (как и createSequenceMatrix). Затем он проверяет, принадлежат ли они одному неизвестному DTMC.

Смотрите пример ниже:

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

Здравствуйте профессор, эта функция теперь кажется, работает хорошо! Но в документации только говорится, что тест статьи [S. Kullback вообще, тесты для таблиц непредвиденных обстоятельств и цепочки марков], правильно? Я хотел бы знать конкретно, какое уравнение вы внедрили, так как мне нужно понять тест, и у меня возникают трудности. Заранее благодарим! – user2905427

+0

Спасибо, я обновлю соответствующие документы –