Проблема
Проблема в том, что вы передаете вектор длины> 1 аргументу t0
в rmarkovchain()
, когда он ожидает, что t0
будет иметь длину ровно один. Подумайте о своей функции прогнозирования:
predict <- function(initial_state, t) {
prediction <- rmarkovchain(n = t, object = mcWeather, t0 = initial_state)[t]
prediction
}
Когда вектор длины больше единицы передается в качестве аргумента initial_state
, тогда rmarkovchain()
получает значение для t0
, которое является более чем одним элементом, который вызывает проблемы с markovchainSequence()
, который он вызывает.
Почему это вызывает проблему? Из help("markovchainSequence")
видно, что он ожидает, что t0
имеет длину один:
Аргументы
... [Некоторое содержимое опущено] ...
t0 начальное состояние
(выделено мной). Итак, когда он выполняет некоторую проверку значения t0
, он использует if()
, который ожидает логический вектор только длины. Вот почему, когда он проверяет
if (!(t0 %in% markovchain@states))
, если вы передали вектор длиной больше единицы как t0
, вы получите предупреждение; функция if()
ожидает только одно логическое значение, поэтому в результирующем векторе будет использоваться только первое логическое значение. Вот почему вы получаете предупреждение, и именно поэтому все ваши прогнозы совпадают.
Решение
Итак, как мы это исправить? Мы слегка изменяем вашу функцию, чтобы обрабатывать векторы длиной больше единицы для 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