データは、2変量マルコフ連鎖の観点から考えることができます。女性には2つの異なる変数があり、男性にはがあります。これらの変数は、時間におけるとの4つの異なる状態の1 つへの変化の確率過程を表します。レッツ示すの移行からへから時間に番目の番目の状態。この場合、時間内の別の状態への遷移は、および前の状態を条件とします。XYXYtXt−1,i→Xt,jXt−1tiX YjX Y
Pr(Xt−1,i→Xt,j)=Pr(Xt,j|Xt−1,i,Yt−1,k)Pr(Yt−1,h→Yt,k)=Pr(Yt,h|Yt−1,k,Xt−1,i)
遷移確率は、遷移履歴をカウントし、後で確率を正規化することで簡単に計算できます。
states <- c("absent", "present", "attack", "threat")
# data is stored in 3-dimensional array, initialized with
# a very small "default" non-zero count to avoid zeros.
female_counts <- male_counts <- array(1e-16, c(4,4,4), list(states, states, states))
n <- length(male_seq)
for (i in 1:n) {
male_counts[female_seq[i-1], male_seq[i-1], male_seq[i]] <- male_counts[female_seq[i-1], male_seq[i-1], male_seq[i]] + 1
female_counts[male_seq[i-1], female_seq[i-1], female_seq[i]] <- female_counts[male_seq[i-1], female_seq[i-1], female_seq[i]] + 1
}
male_counts/sum(male_counts)
female_counts/sum(female_counts)
限界確率を使用して簡単にシミュレーションすることもできます。
male_sim <- female_sim <- "absent"
for (i in 2:nsim) {
male_sim[i] <- sample(states, 1, prob = male_counts[female_sim[i-1], male_sim[i-1], ])
female_sim[i] <- sample(states, 1, prob = female_counts[male_sim[i-1], female_sim[i-1], ])
}
そのようなシミュレーションの結果を以下にプロットします。
さらに、1ステップ先の予測を行うために使用できます。
male_pred <- female_pred <- NULL
for (i in 2:n) {
curr_m <- male_counts[female_seq[i-1], male_seq[i-1], ]
curr_f <- female_counts[male_seq[i-1], female_seq[i-1], ]
male_pred[i] <- sample(names(curr_m)[curr_m == max(curr_m)], 1)
female_pred[i] <- sample(names(curr_f)[curr_f == max(curr_f)], 1)
}
あなたが提供したデータの69-86%の精度で:
> mean(male_seq == male_pred, na.rm = TRUE)
[1] 0.8611111
> mean(female_seq == female_pred, na.rm = TRUE)
[1] 0.6944444
遷移がランダムに発生した場合、遷移確率は離散均一分布に従います。これは証明ではありませんが、単純なモデルを使用してデータについて考える方法として役立ちます。