Как использовать функцию predic () в цепи Маркова - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь создать функцию для цепочки Маркова, чтобы делать прогнозы на будущее, но это дает мне предупреждающее сообщение. Пожалуйста, помогите.

Моя версия R - 3.6.1.

1 Ответ

1 голос
/ 30 мая 2020

Проблема

Проблема в том, что вы передаете вектор длины> 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
...