我有一系列事件:
library(markovchain)
sequence<-c("LHR - BA","BOS - BA","BOS - ZE","IAD - ZE","BOS - BA","LHR - BA",
"LGW - BA","TPA - BA","TPA - BA","LGW - BA","LHR - BA","BOS - BA",
"BOS - ZE","BOS - ZE","BOS - BA","LHR - BA","LHR - BA","BOS - BA",
"BOS - ZE","BOS - ZE","BOS - DL","ATL - DL","LHR - BA","BRU - BA")
使用此序列,我使用以下函数获得马尔可夫链:
sequenceMatr <- createSequenceMatrix(sequence, sanitize=FALSE)
mcFit <- markovchainFit(data=sequence, method="mle")
考虑下一个状态是"LHR - BA"
;那么我如何以下列格式确定各州的概率分布:
"LHR - BA", "BOS - ZE", "IAD - ZE", "BOS - BA", "LHR - BA", "LGW - BA", "TPA - BA"
"LHR - BA" 0.1 , 0.2 , 0.2 , 0.3 , 0.1 , 0.1 , 0.1
答案 0 :(得分:1)
我发现你的问题有点难以理解,但这是我的解释。
考虑下一个状态是
"LHR - BA"
;那么如何识别各州的概率分布
所以我读这个的方式,你知道在某个时间 t +1你的系统处于状态"LHR - BA"
并且你想知道时间的分布概率 t 的。换句话说,您需要条件概率
P(S(t)=x | S(t+1)="LHR - BA")
根据Bayes' law,这个概率等于
P(S(t)=x) * P(S(t+1)="LHR - BA" | S(t)=x) / P(S(t+1)="LHR - BA")
为此,您需要对无条件分布进行一些估算。对于大的 t 和一个合理的(在这里不知道正确的术语)马尔可夫链你可以简单地采取(希望是唯一的)稳态在这里。通过这种解释,您可以直接将上述公式转换为R:
mcEst <- mcFit$estimate
mcSteady <- steadyStates(mcEst)
sapply(states(mcEst), function(x) transitionProbability(mcEst, x, "LHR - BA")*mcSteady[1,x]/mcSteady[1,"LHR - BA"])
但也许你想以更好的方式写这个,并为每个可能的S(t+1)
而不仅仅是"LHR - BA"
设置行。为此,您必须更直接地处理转换矩阵,而不是调用transitionProbability
,因为该方法不适用于矢量化参数。
tm <- mcEst@transitionMatrix
if (mcEst@byrow) tm <- t(tm)
res <- tm * t(outer(mcSteady[1,], mcSteady[1,], "/"))
前两行获取转换矩阵,并确保行(第一个索引)是目标状态,列(第二个索引)是源状态。有关执行此类操作的已发布函数,请参阅getMethods("transitionProbability")
。那么那时你已经
tm[i,j] = P(S(t+1)=i | S(t)=j)
然后你采取稳定状态,并做所有可能的组合。你得到了
outer(mcSteady[1,], mcSteady[1,], "/")[i,j] = mcSteady[1,i]/mcSteady[1,j]
这是错误的方式。所以你转置它并获得
t(outer(mcSteady[1,], mcSteady[1,], "/"))[i,j] = mcSteady[1,j]/mcSteady[1,i]
您乘以tm
以获得最终结果:
res[i,j] = P(S(t+1)=i | S(t)=j) * P(S(t)=j) / P(S(t+1)=i)
该结果表的每一行将是给定后继状态的一个分布。包括你要求的那个:
> res["LHR - BA",]
ATL - DL BOS - BA BOS - DL BOS - ZE BRU - BA IAD - ZE LGW - BA
0.23379630 0.37037037 0.00000000 0.00000000 0.02083333 0.00000000 0.20833333
LHR - BA TPA - BA
0.16666667 0.00000000