我试图创建一个函数唱马尔科夫链来进行未来预测,但它给我一个警告信息。请帮助我。
我的R版本是3.6.1。
你所遇到的问题是,你把一个长度为> 1的向量传给了参数------。t0
在 rmarkovchain()
,当它期望 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