如何在马尔科夫链中使用预测()函数?

问题描述 投票:0回答:1

我试图创建一个函数唱马尔科夫链来进行未来预测,但它给我一个警告信息。请帮助我。

我的R版本是3.6.1。

r debugging predict markov-chains
1个回答
1
投票

问题

你所遇到的问题是,你把一个长度为> 1的向量传给了参数------。t0rmarkovchain(),当它期望 t0 长于 恰恰 一个。想想你的预测函数。

predict <- function(initial_state, t) {
    prediction <- rmarkovchain(n = t, object = mcWeather, t0 = initial_state)[t] 
    prediction 
}

当一个长度大于1的向量作为参数传入时 initial_state那么 rmarkovchain() 得到一个值为 t0 多元素,这就导致了与 markovchainSequence(),它调用的。

为什么会出现这样的问题呢?我们可以从 help("markovchainSequence") 它期望 t0 长度为1。

Arguments

...[部分内容省略]...

t0 初始状态

(强调是后加的)。所以,当它在进行一些关于 t0 值,它使用 if()的逻辑向量。只是 长度为一。这就是为什么当它检查

if (!(t0 %in% markovchain@states)) 

如果你传递了一个长度大于1的向量作为 t0,你会得到一个警告;该 if() 函数只期望一个逻辑值,所以它将只使用 第一 在结果向量中的逻辑值。这就是为什么你会收到警告,这也是为什么你所有的预测都是一样的。

解决方案

那么,我们如何解决这个问题呢?我们稍稍修改一下你的函数,以处理长度大于1的向量,比如 initial_state:

predict <- function(initial_state, t) {
    prediction <- sapply(initial_state, function(state) {
        rmarkovchain(n = t, object = mcWeather, t0 = state)[t]
    })
    return(prediction)
}

这将跨越传入的值 initial_state 并逐一为他们预测,因为。markovchainSequence() 会期望的。我们可以看到,它的工作原理和预期一样。

x <- data.frame("AccountNo" = 1:5, 
                "CurrentState" = c("sunny", "sunny", "rain" , "cloudy" ,"rain"), 
                stringsAsFactors = FALSE)

set.seed(42)
x$Prediction3 <- predict(x$CurrentState,3)
x

  AccountNo CurrentState Prediction3
1         1        sunny       sunny
2         2        sunny       sunny
3         3         rain       sunny
4         4       cloudy        rain
5         5         rain       sunny
© www.soinside.com 2019 - 2024. All rights reserved.