簡體   English   中英

如何找到馬爾可夫鏈概率?

[英]How to find the Markov Chain Probability?

我試圖找到鏈條從狀態跳躍的概率k-1到狀態1它擊中狀態之前k 誰能發現我的錯誤?

我試圖模擬馬爾可夫鏈,但我想編寫一個代碼,使我能夠找到k ={1, 2, 3, ........17}概率。 但是我真的無法獲取代碼。

這是我總是收到的錯誤消息

Error in while (X[i] > 1 && X[i] < k) { : 
  missing value where TRUE/FALSE needed

這是我的代碼:

k <- 17
{   p <- 0.5
q <- 0.1
P <- matrix (0, nrow = k, ncol = k, byrow = TRUE)
for (i in 1:k)
{   for (j in 1:k)
    {   if (i == 1 && i == j)
        {   P[i,j] <- 1
        }
        else if (i == k && i == j)
        {   P[i,j] <- 1
        }
        else if (i == j)
        {   P[i,j] <- p*(1-q)
        }
        else if (j == k && i != 1)
        {   P[i,j] <- q
        }   
        else if (i == j+1 && i != k)
        {   P[i,j] <- (1-p)*(1-q)
        }
    }
}
P
X <- (k-1) 
trials <- 1000
hits <- 0 #counter for no. of hits 
for (i in 1:trials)
{   i <- 1 #no. of steps
    while(X[i] > 1 && X[i] < k)
    {   Y <- runif(1) #uniform samples
        p1 <- P[X[i],] #calculating the p-value
        p1 <- cumsum(p1)
        # changes in the chain
        if(Y <= p1[1])
        {   X[i+1] = 1}
        else if(Y <= p1[2])
        {   X[i+1] = 2}
        else if(Y <= p1[3])
        {   X[i+1] = 3}
        else if(Y <= p1[4])
        {   X[i+1] = 4}
        else if(Y <= p1[5])
        {   X[i+1] = 5}
        else if(Y <= p1[6])
        {   X[i+1] = 6}
        else if(Y <= p1[7])
        {   X[i+1] = 7}
        else if(Y <= p1[8])
        {   X[i+1] = 8}
        else if(Y <= p1[9])
        {   X[i+1] = 9}
        else if(Y <= p1[10])
        {   X[i+1] = 10}
        else if(Y <= p1[11])
        {   X[i+1] = 11}
        else if(Y <= p1[12])
        {   X[i+1] = 12}
        else if(Y <= p1[13])
        {   X[i+1] = 13}
        else if(Y <= p1[14])
        {   X[i+1] = 14}
        else if(Y <= p1[15])
        {   X[i+1] = 15}
        else if(Y <= p1[16])
        {   X[i+1] = 16}
        else if(Y <= p1[17])
        {   X[i+1] <= 17}
        i <- i+1
    }
    if(X[i]==1)
    {   hits <- hits+1}
    else
    {   hits <- hits+0}
}

Probability <- hits/trials
Probability
}

我認為線

i <- 1 #no. of steps

不應該在那里。 嘗試這個:

k <- 17
{   p <- 0.5
q <- 0.1
P <- matrix (0, nrow = k, ncol = k, byrow = TRUE)
for (i in 1:k)
{   for (j in 1:k)
    {   if (i == 1 && i == j)
        {   P[i,j] <- 1
        }
        else if (i == k && i == j)
        {   P[i,j] <- 1
        }
        else if (i == j)
        {   P[i,j] <- p*(1-q)
        }
        else if (j == k && i != 1)
        {   P[i,j] <- q
        }   
        else if (i == j+1 && i != k)
        {   P[i,j] <- (1-p)*(1-q)
        }
    }
}
P
X <- (k-1) 
trials <- 1000
hits <- 0 #counter for no. of hits 
for (i in 1:trials)
{
    while(X[i] > 1 && X[i] < k)
    {   Y <- runif(1) #uniform samples
        p1 <- P[X[i],] #calculating the p-value
        p1 <- cumsum(p1)
        # changes in the chain
        if(Y <= p1[1])
        {   X[i+1] = 1}
        else if(Y <= p1[2])
        {   X[i+1] = 2}
        else if(Y <= p1[3])
        {   X[i+1] = 3}
        else if(Y <= p1[4])
        {   X[i+1] = 4}
        else if(Y <= p1[5])
        {   X[i+1] = 5}
        else if(Y <= p1[6])
        {   X[i+1] = 6}
        else if(Y <= p1[7])
        {   X[i+1] = 7}
        else if(Y <= p1[8])
        {   X[i+1] = 8}
        else if(Y <= p1[9])
        {   X[i+1] = 9}
        else if(Y <= p1[10])
        {   X[i+1] = 10}
        else if(Y <= p1[11])
        {   X[i+1] = 11}
        else if(Y <= p1[12])
        {   X[i+1] = 12}
        else if(Y <= p1[13])
        {   X[i+1] = 13}
        else if(Y <= p1[14])
        {   X[i+1] = 14}
        else if(Y <= p1[15])
        {   X[i+1] = 15}
        else if(Y <= p1[16])
        {   X[i+1] = 16}
        else if(Y <= p1[17])
        {   X[i+1] <= 17}
        i <- i+1
    }
    if(X[i]==1)
    {   hits <- hits+1}
    else
    {   hits <- hits+0}
}

Probability <- hits/trials
Probability
}

您將X設置為k-1。 在R中,將其視為長度為1的向量。一旦i達到2,X [i]返回索引錯誤,因為X沒有第二個元素。

進一步說明:在兩個不同的嵌套級別中使用相同的索引是非常糟糕的形式。 同樣,當您開始擁有大量的if-then-else語句列表時,該重新考慮代碼了。 在這種情況下,您可以將p1 [i]> = Y上的子集1:17設為最小值,然后將X設置為該值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM