马尔可夫链先前状态
Markov Chain previous states
我在马尔可夫链中模拟了 1000 步,总共有 6 个不同的状态 (0-5),我们从状态 5 开始。通过条形图,我们可以看到我们处于多少次每个州。
但是,我想知道的是,当它之前的步骤是从状态 1 开始时,我们进入状态 5 的次数有多少次。由于我们总共有 26 次进入状态 1,所以答案最多是26. 有没有办法查看在进入状态 5 之前我们处于状态 1 的次数?
spec_sim <- function(x){
u <- runif(1)
if(x==0){
if(u < 0.5){
y <- 3
} else {
y <- 5
}
} else if(x==1){
if(u<0.1){
y <- 0
} else if(u < 0.1 + 0.1){
y <- 1
} else if(u < 0.1 + 0.1 + 0.4){
y <- 3
} else {
y <- 5}
} else if(x==2){
if(u<0.2){
y <- 1
} else if(u < 0.2 + 0.2){
y <- 2
} else if(u < 0.2 + 0.2 + 0.3){
y <- 3
} else {
y <- 5
}
} else if(x==3){
if(u<0.3){
y <- 2
} else if(u < 0.3 + 0.5){
y <- 3
} else{
y <- 5
}
} else if(x==4){
if(u<0.4){
y <- 3
} else {
y <- 4
}
} else if(x==5){
if(u<0.4){
y <- 4
} else {
y <- 5
}
}
return(y)
}
set.seed(1)
results <- numeric(1001)
for(i in 2:length(results)){
results[i]<- spec_sim(results[i - 1])
}
results <- results[-1]
barplot(table(results), xlab="states", ylab="frequency",
main="1000 simuleringar av en Markovkedja")
table(results)
感谢您花时间回答我的问题。
你的代码不适合我 运行,但这里有一个例子可以满足你的要求:
library(dplyr)
df <- data.frame(state=c(1,5,3,5,4,5,2,5,2,1,5))
df <- mutate(df, state_diff= state - lag(state))
which(df$state==5 & df$state_diff == 4)
length(which(df$state==5 & df$state_diff == 4))
编辑:
现在应该可以使用您的固定代码:
df <- data.frame(results)
df<- mutate(df, results_diff = results - lag(results))
length(which(df$results==5 & df$results_diff == 4))
which(df$results==5 & df$results_diff == 4)
base R还有另外一个方法:
length(which(diff(results) == 4))
非常容易理解,即使不了解 dplyr
解释:
函数diff()
计算向量元素之间的差值。如果您的结果从状态 1 变为状态 5,则两个元素之间的差值为 +4。因此,您正在搜索元素,其中差异为 +4。使用 which
可以得到 diff(results) == 4
的索引号。使用 length
您可以计算索引。所以你得到从 1 到 5 的变化数。注意你没有得到从 5 到 1 的变化,因为那样结果是 -4。
此致,
J_F
我在马尔可夫链中模拟了 1000 步,总共有 6 个不同的状态 (0-5),我们从状态 5 开始。通过条形图,我们可以看到我们处于多少次每个州。
但是,我想知道的是,当它之前的步骤是从状态 1 开始时,我们进入状态 5 的次数有多少次。由于我们总共有 26 次进入状态 1,所以答案最多是26. 有没有办法查看在进入状态 5 之前我们处于状态 1 的次数?
spec_sim <- function(x){
u <- runif(1)
if(x==0){
if(u < 0.5){
y <- 3
} else {
y <- 5
}
} else if(x==1){
if(u<0.1){
y <- 0
} else if(u < 0.1 + 0.1){
y <- 1
} else if(u < 0.1 + 0.1 + 0.4){
y <- 3
} else {
y <- 5}
} else if(x==2){
if(u<0.2){
y <- 1
} else if(u < 0.2 + 0.2){
y <- 2
} else if(u < 0.2 + 0.2 + 0.3){
y <- 3
} else {
y <- 5
}
} else if(x==3){
if(u<0.3){
y <- 2
} else if(u < 0.3 + 0.5){
y <- 3
} else{
y <- 5
}
} else if(x==4){
if(u<0.4){
y <- 3
} else {
y <- 4
}
} else if(x==5){
if(u<0.4){
y <- 4
} else {
y <- 5
}
}
return(y)
}
set.seed(1)
results <- numeric(1001)
for(i in 2:length(results)){
results[i]<- spec_sim(results[i - 1])
}
results <- results[-1]
barplot(table(results), xlab="states", ylab="frequency",
main="1000 simuleringar av en Markovkedja")
table(results)
感谢您花时间回答我的问题。
你的代码不适合我 运行,但这里有一个例子可以满足你的要求:
library(dplyr)
df <- data.frame(state=c(1,5,3,5,4,5,2,5,2,1,5))
df <- mutate(df, state_diff= state - lag(state))
which(df$state==5 & df$state_diff == 4)
length(which(df$state==5 & df$state_diff == 4))
编辑:
现在应该可以使用您的固定代码:
df <- data.frame(results)
df<- mutate(df, results_diff = results - lag(results))
length(which(df$results==5 & df$results_diff == 4))
which(df$results==5 & df$results_diff == 4)
base R还有另外一个方法:
length(which(diff(results) == 4))
非常容易理解,即使不了解 dplyr
解释:
函数diff()
计算向量元素之间的差值。如果您的结果从状态 1 变为状态 5,则两个元素之间的差值为 +4。因此,您正在搜索元素,其中差异为 +4。使用 which
可以得到 diff(results) == 4
的索引号。使用 length
您可以计算索引。所以你得到从 1 到 5 的变化数。注意你没有得到从 5 到 1 的变化,因为那样结果是 -4。
此致,
J_F