2017-10-12 11 views
0

체인이 상태 k-1에서 상태 1으로 점프하기 전에 상태가 k이 될 확률을 찾으려고합니다. 누구든지 내 실수를 감지 할 수 있습니까?마르코프 체인 확률을 찾는 방법?

마크 로프 체인을 시뮬레이트하려했지만, k ={1, 2, 3, ........17} 확률을 찾을 수있는 코드를 만들고 싶습니다. 하지만 코드를 실제로 얻을 수는 없습니다.

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 
} 

답변

0

내가

i <- 1 #no. of steps 

이 안 선을 생각 :

내가 항상 여기

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

X를 k-1로 설정하고 있습니다. R에서는 길이가 1 인 벡터로 취급됩니다. X가 두 번째 요소를 가지고 있지 않기 때문에 2에 도달하자마자 X [i]는 인덱스 오류를 반환합니다.

기타 참고 사항 : 두 개의 다른 중첩 수준에서 같은 인덱스를 사용하는 것은 매우 나쁜 형태입니다. 또한, if-then-else 문을 많이 사용하기 시작하면 이제 코드를 다시 생각해 볼 차례입니다. 이 경우 p1 [i]> = Y에서 1:17의 부분 집합을 만들고 최소값을 취한 다음 X를 그 값으로 설정하면됩니다.