在 r 中构建马尔可夫链
Building markov chain in r
我在专栏中有一个文本,我想构建一个马尔可夫链。我想知道有一种方法可以为状态 A、B、C、D 构建马尔可夫链并生成具有该状态的马尔可夫链。有什么想法吗?
A<- c('A-B-C-D', 'A-B-C-A', 'A-B-A-B')
如果您想使用 MLE 从数据中计算转移概率矩阵(行随机),试试这个:
A <- c('A-B-C-D', 'A-B-C-A', 'A-B-A-B', 'D-B-C-A') # the data: by modifying your example data little bit
df <- as.data.frame(do.call(rbind, lapply(strsplit(A, split='-'), function(x) t(sapply(1:(length(x)-1), function(i) c(x[i], x[i+1]))))))
tr.mat <- table(df[,1], df[,2])
tr.mat <- tr.mat / rowSums(tr.mat) # make the matrix row-stochastic
tr.mat
# A B C D
# A 0.0000000 1.0000000 0.0000000 0.0000000 # P(A|A), P(B|A), P(C|A), P(D|A) with MLE from data
# B 0.2500000 0.0000000 0.7500000 0.0000000
# C 0.6666667 0.0000000 0.0000000 0.3333333
# D 0.0000000 1.0000000 0.0000000 0.0000000
既然你提到你知道如何使用 statetable.msm
,这里有一种方法可以将数据转换成它可以处理的形式:
dd <- c('A-B-C-D', 'A-B-C-A', 'A-B-A-B')
拆分破折号并按列排列:
d2 <- data.frame(do.call(cbind,strsplit(dd,"-")))
排列在数据框中,按顺序标识:
d3 <- tidyr::gather(d2)
构建转换矩阵:
statetable.msm(value,key,data=d3)
我在专栏中有一个文本,我想构建一个马尔可夫链。我想知道有一种方法可以为状态 A、B、C、D 构建马尔可夫链并生成具有该状态的马尔可夫链。有什么想法吗?
A<- c('A-B-C-D', 'A-B-C-A', 'A-B-A-B')
如果您想使用 MLE 从数据中计算转移概率矩阵(行随机),试试这个:
A <- c('A-B-C-D', 'A-B-C-A', 'A-B-A-B', 'D-B-C-A') # the data: by modifying your example data little bit
df <- as.data.frame(do.call(rbind, lapply(strsplit(A, split='-'), function(x) t(sapply(1:(length(x)-1), function(i) c(x[i], x[i+1]))))))
tr.mat <- table(df[,1], df[,2])
tr.mat <- tr.mat / rowSums(tr.mat) # make the matrix row-stochastic
tr.mat
# A B C D
# A 0.0000000 1.0000000 0.0000000 0.0000000 # P(A|A), P(B|A), P(C|A), P(D|A) with MLE from data
# B 0.2500000 0.0000000 0.7500000 0.0000000
# C 0.6666667 0.0000000 0.0000000 0.3333333
# D 0.0000000 1.0000000 0.0000000 0.0000000
既然你提到你知道如何使用 statetable.msm
,这里有一种方法可以将数据转换成它可以处理的形式:
dd <- c('A-B-C-D', 'A-B-C-A', 'A-B-A-B')
拆分破折号并按列排列:
d2 <- data.frame(do.call(cbind,strsplit(dd,"-")))
排列在数据框中,按顺序标识:
d3 <- tidyr::gather(d2)
构建转换矩阵:
statetable.msm(value,key,data=d3)