1

3つの共変量を使用して多段マルコフ(MSM)モデルを適合させました。主な引数がMSMモデルと共変量の値に適合している関数を適用しようとしています。関数は次のとおりです。

transition<-qmatrix.msm(MSMmod,  ci="normal", covariates=list(grossTon= 10, activ=0, period=1))

この関数の出力は推定値です。

              Owning<10 Owning10-40   Owning>40        left
Owning<10   -0.18037446  0.06140559  0.00000000 0.118968868
Owning10-40  0.01609661 -0.09027454  0.04502546 0.029152476
Owning>40    0.00000000  0.04801757 -0.05137377 0.003356196
left         0.00000000  0.00000000  0.00000000 0.000000000

そして、私はそれらのいくつかだけに興味があるので、transition$estimates[c(5,2,10,7,13,14,15)]私は得ています。たとえば、qmatrix.msm共変量の組み合わせgrossTon = 120、active = 0、period = 1で関数が与える値(以下を参照)。

[1] 0.06140559 0.01609661 0.04502546 0.04801757 0.118968868 0.029152476 0.003356196

私の関数の両方のforループでは、grossTon(12個の値)とactiv(4個の値)のすべての組み合わせの結果として、48個のベクトル(前の値と同様に、それぞれ7個の値)を取得することを期待しています。それらの1つのベクトル(336の値、7 * 12 * 4)に。

これは私の機能です:

transRate<-function(period){
  estim<-data.frame(matrix(rep(0,336),336,1))

  for(i in seq(10,120,by=10)){
    for(j in seq(0,3, by=1)){

    estim[c(i,j)]<-qmatrix.msm(msm.Mult4,  ci="normal", covariates=list(grossTon=i, activ=j, period=period))$estimates[c(5,2,10,7,13,14,15)]
    outp[c(i,j)]<-c(estim[c(i,j)])#Here I'm trying to get my 336 values vector
    }
  }

  grosTvect<-sort(rep(seq(10,120,by=10),28))
  rate<-rep(c("q12","q21","q23","q32","q14","q24","q34"),48)
  estimRate<-data.frame(grosTvect,rate,outp)

  return(estimRate)                     
} 
dataFrame<-transRate(period=1)

ベクトルを生成するためにiとjを処理する方法がわかりません。

と書くestim[c(i,j)] と次のエラーが発生しますoutp[c(i,j)]<-c(estim[c(i,j)])

error in `[<-.data.frame`(`*tmp*`, c(i, j), value = c(0.0614055886960195,  : 
  new columns would leave holes after existing columns

そして、これは私が書いたときestim[i,j]outp<-estim[i,j]

Error in `[<-.data.frame`(`*tmp*`, i, j, value = c(0.0614055886960195,  : 
  replacement has 7 rows, data has 1

どんな助けでもありがたいです。

4

2 に答える 2

2

「推定値」データフレームの次元が間違っているため、「推定値」からの長さ7のベクトルを保持できません。また、「outp」を宣言しないため、データフレームの割り当てが成功した後にインタープリターコードがそこに到達した場合、別のエラーがスローされます。(とにかく「outp」に割り当てるという追加の手順を実行する理由は明確ではありません。)

名前付きの列を持つ48行のデータフレームを作成し、c("q12","q21","q23","q32","q14","q24","q34")シーケンシャルインデックスを使用して正しい行= i + 12 * jに割り当てる方が簡単でしょうか?

 transRate<-function(period){
  estim<-data.frame(q12=1:48, q21=0, q23=0, q32=0, q14=0, q24=0, q34=0)))

  for(i in seq(1,12)){
    for(j in seq(0,3, by=1)){

    estim[ i+12*j , ] <- qmatrix.msm(cav.msm,  ci="normal", 
              covariates=list( grossTon = i*10, activ=j, period=period))$
                                                  estimates[c(5,2,10,7,13,14,15)]
       }
  }

    return(estim)                     
} 

dataFrame<-transRate(period=1)

(異なる寸法の「grosTvect」オブジェクトが「推定」結果とどのように一致するかを理解できませんでした。)

于 2013-01-31T13:51:10.630 に答える
0

データフレームestimには1つの列しかありません。この列はたまたま行列です。のようなestim[i,j]ことをすると、データフレームの列にアクセスします。実際にデータフレームのマトリックスにアクセスしたいと思います。estim[1][,c(i,j)]したがって、マトリックスを塗りつぶしたい場合は、の線に沿って何かを使用する必要があります。

于 2013-01-31T13:51:55.483 に答える