Как я могу исправить этот неправильный результат в матрице для цикла в R?

#r #for-loop #matrix

Вопрос:

Я хочу ввести в R следующую матрицу (вероятность перехода), но что-то я делаю неправильно, и результат неправильный. Матрица изображена на рисунке :введите описание изображения здесь

мои усилия заключаются в следующем :

 n=100
A = matrix(c(0),n 1,n 1);A
A[1,2] = 1/4 
A[1,1] = 3/4
A[2,1] = 1/4 
A[2,2] = 1/2 
A[2,1] = 1/4
for (k in 2:n) {
  A[k,k 1] = 1/4
  A[k,k]   = 1/2 
  A[k,k-1] = 1/6 
  A[k,k-2] = 1/12
  A[n,n]   = 3/4 
  A[n,n-1] = 1/6 
  A[n,n-2] = 1/12}
A


pA = A
for (i in 10000){
  pA = pA %*% A }
pA

 

но результирующие столбцы (первые 3 столбца) должны быть: 0,2087, 0,1652, 0,1307

Какая-нибудь помощь?

Комментарии:

1. i in 10000 это справедливо i <- 10000 . Ты промахнулся 1: ?

2. В своих первых строках вы задаете значения для A[2, ...] , но в своем for цикле вы их заменяете. Например: A[2,1] <- 1/4 но для k = 2 вас установлено A[2, 1] <- 1/6 .

3. @МартинГал, потому что R начинается с 1, а не с 0. Как по-другому я могу вставить эти вероятности?

Ответ №1:

Вы могли бы попробовать немного другой подход здесь:

 n <- 100
A <- matrix(0, n   1, n   1)

# create index for the diagonal and the "other" diagonales
A_diag <- matrix(c(1:(n   1), 1:(n   1)), ncol = 2)
A_diag_1 <- matrix(c(1:(n   1), 1   1:(n   1)), ncol = 2)
A_diag_minus_1 <- matrix(c(1:(n   1), - 1   1:(n   1)), ncol = 2)
A_diag_minus_2 <- matrix(c(1:(n   1), - 2   1:(n   1)), ncol = 2)

# populate those diagonales
A[A_diag] <- 1/2
A[A_diag_1[A_diag_1[,2] <= n   1,]] <- 1/4
A[A_diag_minus_1[A_diag_minus_1[,2] >= 1,]] <- 1/6
A[A_diag_minus_2[A_diag_minus_2[,2] >= 1,]] <- 1/12

# create starting values
A[1, 1] <- 3/4
A[2, 1] <- 1/4

# calculate pA
pA <- A
for (i in 1:10000){ pA <- pA %*% A }
 

Это возвращает

 pA[1, 1:3]
#> [1] 0.2087122 0.1651514 0.1306823
 

Для успокоения pA вы могли бы использовать expm пакет, чтобы ускорить процесс:

 library(expm)

pB <- A %^% 10000

pB[1,1:3]
#> [1] 0.2087122 0.1651514 0.1306823
 

Комментарии:

1. Огромное спасибо за ваш вклад. Ясный и осмысленный ответ. Я ценю это