ランダム自動相関バイナリ時系列データを生成する方法は?


15

次のようなバイナリ時系列を生成するにはどうすればよいですか?

  1. 1を観測する平均確率が指定されています(5%など)。
  2. 値を与えられた時点 1を観測する条件付き確率(値が1の場合、30%と言います)?tt1t1

回答:


17

2状態のマルコフ連鎖を使用します。

状態が0および1と呼ばれる場合、チェーンは状態間の遷移確率を与える2x2行列表すことができます。ここで、は状態から状態に移動する確率です。このマトリックスでは、各行の合計は1.0になります。PPijij

ステートメント2から、となり、単純保存はと言います。P11=0.3P10=0.7

ステートメント1から、長期確率(平衡状態または定常状態とも呼ばれます)をます。これは言う 解決を与えると遷移行列P1=0.05

P1=0.05=0.3P1+P01(1P1)
P01=0.0368421
P=(0.9631580.03684210.70.3)

(遷移行列を正確にチェックするには、それを高出力に上げます(この場合は14がジョブを実行します)。結果の各行は同一の定常状態確率を与えます)

乱数プログラムで、状態0または1をランダムに選択することから始めます。これにより、使用しているPの行が選択されPます。次に、一様乱数を使用して、次の状態を決定します。その数を吐き出し、すすぎ、必要に応じて繰り返します。


興味深いソリューション!Rにサンプルコードがありますか?他にアントン?
user333

@Mikeアカウントを登録してください。あなたは非常にアクティブなユーザーであり、何度も何度も手動でマージする必要があります。プロセスは非常に簡単です。stats.stackexchange.com/login

ありがとう。与えられたデータからマルコフ連鎖(遷移行列)を推定するにはどうすればよいですか?それを行うためのR関数はありますか?
-user333

6

Rで@Mike Andersonの回答をコーディングするときにひびが入りました。sapplyを使用してそれを行う方法がわからなかったため、ループを使用しました。より興味深い結果を得るために問題を少し変更し、「A」と「B」を使用して状態を表しました。どう考えているか教えてください。

set.seed(1234)
TransitionMatrix <- data.frame(A=c(0.9,0.7),B=c(0.1,0.3),row.names=c('A','B'))
Series <- c('A',rep(NA,99))
i <- 2
while (i <= length(Series)) {
    Series[i] <- ifelse(TransitionMatrix[Series[i-1],'A']>=runif(1),'A','B')
    i <- i+1
}
Series <- ifelse(Series=='A',1,0)
> Series
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1
 [38] 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [75] 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1

/編集:ポールのコメントに応えて、ここにもっとエレガントな定式化があります

set.seed(1234)

createSeries <- function(n, TransitionMatrix){
  stopifnot(is.matrix(TransitionMatrix))
  stopifnot(n>0)

  Series <- c(1,rep(NA,n-1))
  random <- runif(n-1)
  for (i in 2:length(Series)){
    Series[i] <- TransitionMatrix[Series[i-1]+1,1] >= random[i-1]
  }

  return(Series)
}

createSeries(100, matrix(c(0.9,0.7,0.1,0.3), ncol=2))

Rを学んだばかりのときに元のコードを書いたので、少し余裕を取りました。;-)

与えられたシリーズで遷移行列を推定する方法は次のとおりです。

Series <- createSeries(100000, matrix(c(0.9,0.7,0.1,0.3), ncol=2))
estimateTransMatrix <- function(Series){
  require(quantmod)
  out <- table(Lag(Series), Series)
  return(out/rowSums(out))
}
estimateTransMatrix(Series)

   Series
            0         1
  0 0.1005085 0.8994915
  1 0.2994029 0.7005971

順序は元の遷移行列と交換されますが、正しい確率が得られます。


すごい!私は可哀想になります...十分に見えます
....-user333

逆にすることは可能ですか?シリーズが行列を推定するとしますか?
user333

ここでは「見積もり」がキーワードです。マルコフ連鎖のエントリは条件付き確率ません。つまり、系列をスキャンするだけで、ゼロの後にゼロ/ 1が続くものと、1の後にゼロ/ 1が続くものの割合を見つけて、行列の各行を推定することができます。行ごとに行くと、通常の信頼区間が得られます。素晴らしい実装。Pr(Xt=i|Xt1=j)
マイクアンダーソン

+1、しかしコメントもあります:forループはここでは少しきれいになります。の長さはわかっているSeriesので、を使用してくださいfor(i in 2:length(Series))。これにより、の必要がなくなりi = i + 1ます。また、なぜ最初にサンプルAを作成し、次に変換するの0,1ですか?あなたは直接サンプルできた0のと1さん。
ポールヒエムストラ

2
より一般的には、createAutocorBinSeries = function(n=100,mean=0.5,corr=0) { p01=corr*(1-mean)/mean createSeries(n,matrix(c(1-p01,p01,corr,1-corr),nrow=2,byrow=T)) };createAutocorBinSeries(n=100,mean=0.5,corr=0.9);createAutocorBinSeries(n=100,mean=0.5,corr=0.1);任意の事前指定されたラグ1自己相関を可能にする新しい関数でラップすることができます
トムウェンセリアーズ

1

これは、markovchainより複雑な依存構造に一般化できるパッケージに基づく回答です。

library(markovchain)
library(dplyr)

# define the states
states_excitation = c("steady", "excited")

# transition probability matrix
tpm_excitation = matrix(
  data = c(0.2, 0.8, 0.2, 0.8), 
  byrow = TRUE, 
  nrow = 2,
  dimnames = list(states_excitation, states_excitation)
)

# markovchain object
mc_excitation = new(
  "markovchain",
  states = states_excitation,
  transitionMatrix = tpm_excitation,
  name = "Excitation Transition Model"
)

# simulate
df_excitation = data_frame(
  datetime = seq.POSIXt(as.POSIXct("01-01-2016 00:00:00", 
                                   format = "%d-%m-%Y %H:%M:%S", 
                                   tz = "UTC"), 
                        as.POSIXct("01-01-2016 23:59:00", 
                                   format = "%d-%m-%Y %H:%M:%S", 
                                   tz = "UTC"), by = "min"),
  excitation = rmarkovchain(n = 1440, mc_excitation))

# plot
df_excitation %>% 
  ggplot(aes(x = datetime, y = as.numeric(factor(excitation)))) + 
  geom_step(stat = "identity") + 
  theme_bw() + 
  scale_y_discrete(name = "State", breaks = c(1, 2), 
                   labels = states_excitation)

これにより、次のことが可能になります。

ここに画像の説明を入力してください


0

私はこのアプローチが説明された論文を見失いましたが、ここに行きます。

遷移行列を分解して

T=(1pt)[1001]+pt[p0p0(1p0)(1p0)]=(1pt)I+ptE

1ptptp0

ptT11T11=(1pt)+pt(1p0)

この分解の有用な機能の1つは、高次元の問題における相関マルコフモデルのクラスに非常に簡単に一般化できることです。


この表現を発展させた論文を見た人がいたら教えてください。
デイブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.