通过使用问题的马尔可夫链表示,可以获得特定子序列的确切概率。如何构建链的细节取决于感兴趣的特定子序列,但是我将给出一些有关如何执行此操作的示例。
通过马尔可夫链的确切概率:考虑A,T,C,G的离散结果序列,其中序列中的结果是可交换的,并且假设我们对长度为k子串感兴趣。对于n任何给定值,令W为感兴趣的子字符串出现的事件,令H一个为最后一个结果为感兴趣的子字符串中的前a < k字符的事件(但不超过此数量) 。我们使用这些事件来给出以下k + 1的分区k + 1 可能的关注状态:
状态0状态1状态2状态3⋮状态 k − 1状态 kw ^¯∩ ^ h0, w ^¯∩ ^ h1个, w ^¯∩ ^ h2, w ^¯∩ ^ h3, ⋮w ^¯∩ ^ hk − 1,w ^。
由于结果的序列被假定为可交换我们有独立的结果的条件在其各自的概率θ一个+ θŤ+ θC+ θG= 1。您感兴趣的过程可以被表示为离散时间马尔可夫链中开头状态0在n = 0根据依赖于感兴趣的特定子串的概率矩阵和过渡。转换矩阵将始终为(k + 1 )× (k + 1 )代表使用上述状态的转换概率的矩阵。如果尚未达到所需的子字符串,则每次转换都可以使您更接近该子字符串,或者可以将您设置回依赖于特定子字符串的先前状态。一旦到达子字符串,这就是链条的吸收状态,表示感兴趣的事件已经发生。
例如,如果感兴趣的子字符串是A A A A A A则转换矩阵为:
P = ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1 - θ一个1 - θ一个1 - θ一个1 - θ一个1 - θ一个1 - θ一个0θ一个0000000θ一个0000000θ一个0000000θ一个0000000θ一个0000000θ一个1。⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
相反,如果感兴趣的子字符串为一çŤA G C则转换矩阵为:
P = ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1 - θ一个1 - θ一个- θC1 - θ一个- θŤ1 - θ一个1 - θ一个- θC- θG1 - θ一个- θC0θ一个θ一个θ一个0θ一个θ一个00θC00θC0000θŤ0000000θ一个0000000θG000000θC1。⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
从上面可以看出,构造转换矩阵需要注意特定的子字符串。错误的结果会使您回到字符串中的先前状态,该状态取决于感兴趣的特定子字符串。一旦构造了转移矩阵,对于给定的ñ值,在链中具有子串的概率为P( w ^| Ñ)={ Pñ}0 ,ķ。(对于所有n < k该概率为零。)
在R中进行编程:您可以R
通过创建一个函数来将该函数编程为函数,该函数将生成马尔可夫链的转换矩阵及其功率的数组,直到某些所需的试验次数。然后,您可以读取感兴趣的ñ值的适当转移概率。这是一些执行此操作的代码示例:
#Create function to give n-step transition matrix for n = 1...N
#We will use the example of the substring of interest "AAAAAA"
#a is the probability of A
#t is the probability of T
#c is the probability of C
#g is the probability of G
#N is the last value of n
PROB <- function(N,a,t,c,g) { TOT <- a+t+c+g;
a <- a/TOT;
t <- t/TOT;
c <- c/TOT;
g <- g/TOT;
P <- matrix(c(1-a, a, 0, 0, 0, 0, 0,
1-a, 0, a, 0, 0, 0, 0,
1-a, 0, 0, a, 0, 0, 0,
1-a, 0, 0, 0, a, 0, 0,
1-a, 0, 0, 0, 0, a, 0,
1-a, 0, 0, 0, 0, 0, a,
0, 0, 0, 0, 0, 0, 1),
nrow = 7, ncol = 7,
byrow = TRUE);
PPP <- array(0, dim = c(7,7,N));
PPP[,,1] <- P;
for (n in 2:N) { PPP[,,n] <- PPP[,,n-1] %*% P; }
PPP }
#Calculate probability for N = 100 for equiprobable outcomes
N <- 100;
a <- 1/4;
t <- 1/4;
c <- 1/4;
g <- 1/4;
PROB(N,a,t,c,g)[1,7,N];
[1] 0.01732435
A A A A A An = 1000.01732435