Rで遷移行列(マルコフ)を計算する


29

R(組み込み関数)に一連の観測からマルコフ連鎖の遷移行列を計算する方法はありますか?

たとえば、次のようなデータセットを取得して、一次遷移行列を計算しますか?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))

このマトリックスは何を表しているのでしょうか?行(または列)ごとにマルコフ連鎖を1回実行しますか?それとも...?
枢機

これは、状態シーケンスの100個のサンプル(20個)です。
B_Miner

確率の推定値を探していますか、それとも単にカウントしますか?
枢機

確率の推定。観測されたシーケンスを使用して、遷移確率行列(この例では4x4)は何ですか。
B_Miner

回答:


33

「組み込み」関数(たとえば、in baseまたは類似)をすぐには知りませんが、数行のコードでこれを非常に簡単かつ効率的に行うことができます。

入力として行列(データフレームではない)を受け取り、遷移カウント(prob=FALSE)またはデフォルトprob=TRUE)で推定遷移確率を生成する関数を次に示します。

# Function to calculate first-order Markov transition matrix.
# Each *row* corresponds to a single run of the Markov chain
trans.matrix <- function(X, prob=T)
{
    tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
    if(prob) tt <- tt / rowSums(tt)
    tt
}

データフレームで呼び出す必要がある場合は、いつでも行うことができます

trans.matrix(as.matrix(dat))

サードパーティのパッケージを探している場合は、RseekまたはR検索サイトが追加のリソースを提供する場合があります。


1
1いくつかのRパッケージには、もありますHMMし、RHMMその役に立つかもしれません。
ウェイン

@Wayne:(+1)過去、特にフィッティングに関しては、利用可能なさまざまなHMMパッケージR非常に細かく、本当に好きなものや信頼できるものを見つけられませんでした。たぶん状況は良くなっているかもしれません。しかし、私は彼らがこれを正しくするだろうと想像します。そのような解決策を知っている場合は、回答として提出してください。賛成票を投じてうれしいです!
枢機

1
試しましたが、成功しませんでした。この問題には隠れた状態は関係せず、私が見つけたパッケージには本格的なHMM以外のことをしないユーティリティ機能はありません。(補足として、datOPが例として与えるデータフレームにはデータの列があり、列ごとに遷移行列が必要ですか、それとも全体の遷移行列が必要ですか、それとも行列をベクトルに変換するだけですか?)
ウェイン

@ウェイン:(+1)良い点を挙げます。私がしていると仮定各行があるという独立したマルコフ連鎖の実行は、私たちが求めているように、遷移確率の推定値は、これらの鎖が並列で実行形成します。しかし、これが、たとえば行の一方の端から次の行の始まりまでラップされたチェーンであったとしても、マルコフ構造のために推定値は非常に近くなります。
枢機

1
@B_Miner:はい、できます。ただし、各顧客が他のすべての顧客とは独立して振る舞うと合理的に仮定できる限りです。このようなモデルと多くの拡張がウェブサイトに繰り返し訪問などに、例えば、ユーザーの行動を分析することで、比較的共通している
の枢機卿

25

markovchainS4プログラミングスタイルに基づいて、新しいRパッケージをアップロードしました。S4 markovchainオブジェクトを処理するためのさまざまなメソッドとともに、状態のシーケンスからマルコフチェーンに適合する関数が含まれています。見て:

library(markovchain) 
sequence <- c("a", "b", "a", "a", "a", "a", "b", "a", "b", "a", 
              "b", "a", "a", "b", "b", "b", "a")
mcFit <- markovchainFit(data=sequence)

助けになるかもしれません。


とても素敵なパッケージ!高次マルコフ連鎖をサポートしますか?
ウェイン14

私は高次マルコフ連鎖を求められており、別の男がコードを書いています。あなたは、コードでpartecipateをご希望の場合mantainerアドレスにメールを送って開発し、我々は...議論することができます
ジョルジオSpedicato

こんにちは、markovchainFitと上記の関数の違いは何ですか?同じ結果が得られますか?おかげで
AAAAA

1
markovchanFt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.