0

健康経済の問題を解決するために、R でプログラムされた行列を含むマルコフ モデルを使用しています。

200 倍したい行列があります。マトリックス内の値は時間とともに変化します。たとえば、位置 x12 の値は、最初の行列 0.1、2 番目の行列 0.2、3 番目の行列 0.3 にあります。200 の行列を書き留めるのではなく、1 つを書き留めて 200 でべき乗します。x12 の場合: 200 の値を持つベクトルを使用できますか?行列はそのベクトルを使用しますか?

定数値の場合は問題ありません。

############### Imatinib Base-line Strategy ##########################
trans_matrix_dasa_no2nd <- matrix (,nrow=3,ncol=3)

trans_matrix_dasa_no2nd[1,] <- c(0.9,0.05,0.05)
trans_matrix_dasa_no2nd[2,] <- c(0,0.8,0.2)
trans_matrix_dasa_no2nd[3,] <- c(0,0,1)

cycle_patient_distribution_dasa_no2nd <- matrix (,nrow=2,ncol=3)

for (i in 1:2){cycle_patient_distribution_dasa_no2nd[i,] <- 
           initial_patient_distribtion%*%(trans_matrix_dasa_no2nd%^%i)}

cycle_patient_distribution_dasa_no2nd
     [,1] [,2] [,3]
[1,]  900   50   50
[2,]  810   85  105

しかし、ベクトルを使用すると、もう機能しません。

############### Imatinib Base-line Strategy ##########################
aaa <- c(0.9,0.5)
bbb <- c(0.05, 0.4)
ccc <- c(0.05, 0.1)

trans_matrix_dasa_no2nd <- matrix (,nrow=3,ncol=3)

trans_matrix_dasa_no2nd[1,] <- c(aaa,bbb,ccc)
Error in trans_matrix_dasa_no2nd[1, ] <- c(aaa, bbb, ccc) : 
  number of items to replace is not a multiple of replacement length
trans_matrix_dasa_no2nd[2,] <- c(0,0.8,0.2)
trans_matrix_dasa_no2nd[3,] <- c(0,0,1)

cycle_patient_distribution_dasa_no2nd <- matrix (,nrow=2,ncol=3)

for (i in 1:2){cycle_patient_distribution_dasa_no2nd[i,] <- 
         initial_patient_distribtion%*%(trans_matrix_dasa_no2nd%^%i)}

cycle_patient_distribution_dasa_no2nd
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA

i を行列に導入すると、結果は正しくありません。

############### Imatinib Base-line Strategy ##########################
aaa <- c(0.9,0.5)
bbb <- c(0.05, 0.4)
ccc <- c(0.05, 0.1)

trans_matrix_dasa_no2nd <- matrix (,nrow=3,ncol=3)

trans_matrix_dasa_no2nd[1,] <- c(aaa[i],bbb[i],ccc[i])
trans_matrix_dasa_no2nd[2,] <- c(0,0.8,0.2)
trans_matrix_dasa_no2nd[3,] <- c(0,0,1)

cycle_patient_distribution_dasa_no2nd <- matrix (,nrow=2,ncol=3)

for (i in 1:2){cycle_patient_distribution_dasa_no2nd[i,] <- 
      initial_patient_distribtion%*%(trans_matrix_dasa_no2nd%^%i)}

cycle_patient_distribution_dasa_no2nd
     [,1] [,2] [,3]
[1,]  500  400  100
[2,]  250  520  230

どうすればその問題を解決できますか? どうもありがとう!

4

2 に答える 2

0

まず、ループの外側で次の行をコメントアウトします。

# trans_matrix_dasa_no2nd[1,] <- c(aaa[i],bbb[i],ccc[i])

次に、値に適切にアクセスして以前の状態値を更新できるように、ループ内に配置します。i-1 のインデックス作成が 0 を参照しないように、最初のケースを別の方法で処理する必要があります。

 cycle_patient_distribution_dasa_no2nd[1,] <-initial_patient_distribtion
 for (i in 2:n){ 
        trans_matrix_dasa_no2nd[1,] <- c(aaa[i],bbb[i],ccc[i])
        cycle_patient_distribution_dasa_no2nd[i,] <-
               cycle_patient_distribution_dasa_no2nd[i-1,]%*%    
                                      (trans_matrix_dasa_no2nd)
                 }
于 2013-07-31T21:33:53.703 に答える
0

問題解決: ループの前に行列を挿入しました

initial_patient_distribution <- c (1000,0,0)
aaa <- c(1,0.7,0.6,0.5,0.4)
bbb <- c(1, 0.2,0.3, 0.4, 0.5)
ccc <- c(1, 0.1,0.1,0.1,0.1)

cycle_patient_distribution_dasa_no2nd <- matrix (,nrow=5,ncol=3)

cycle_patient_distribution_dasa_no2nd[1,] <-initial_patient_distribution
 for (i in 2:5){
 trans_matrix_dasa_no2nd <- matrix (,nrow=3,ncol=3)
 trans_matrix_dasa_no2nd[1,] <- c(aaa[i],bbb[i],ccc[i])
 trans_matrix_dasa_no2nd[2,] <- c(0,0.5,0.5)
 trans_matrix_dasa_no2nd[3,] <- c(0,0,1)
cycle_patient_distribution_dasa_no2nd[i,] <- cycle_patient_distribution_dasa_no2nd[i-    1,]%*%(trans_matrix_dasa_no2nd)
}

cycle_patient_distribution_dasa_no2nd
     [,1]  [,2]  [,3]
[1,] 1000   0.0   0.0
[2,]  700 200.0 100.0
[3,]  420 310.0 270.0
[4,]  210 323.0 467.0
[5,]   84 266.5 649.5
于 2013-08-02T19:09:44.597 に答える