Функция HoltWinters прекрасно работает, когда используется сама по себе с purrr: map, но не при использовании в функции ifelse - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь использовать предсказание HoltWinters итеративно по вектору, без использования цикла, но не хочу, чтобы функция HoltWinters использовалась в первых двух. Я создал список векторов, используя accumulate:

library(purrr)

v <- c(73,77,71,73,86,87,90)
cumv <- accumulate(v,c)

Использование map через cumv:

# Omit first two 
hw1 <- map(cumv[-c(1:2)], function(x) HoltWinters(ts(x),gamma=F,alpha=0.35,beta=0.2))

> hw1[[5]]

#Holt-Winters exponential smoothing with trend and without seasonal component.

#Call:
#HoltWinters(x = ts(x), alpha = 0.35, beta = 0.2, gamma = F)

#Smoothing parameters:
# alpha: 0.35
# beta : 0.2
# gamma: FALSE

#Coefficients:
#       [,1]
#a 89.605082
#b  3.246215

Это дает желаемый результат, но не включает первые две итерации. Я предполагал, что использование ifelse будет работать нормально:

# Include first two, use ifelse
hw2 <- map(cumv, function(x) ifelse(length(x)>2,HoltWinters(ts(x),gamma=F,alpha=0.35,beta=0.2),
                                    ifelse(length(x)>1,max(x),NA)))

Теперь hw2[[7]] должен был (я думал) вернуть идентичный объект для hw1[[5]], но это не так.

> hw2[[7]]

#[[1]]
#Time Series:
#Start = 3 
#End = 7 
#Frequency = 1 
#      xhat    level    trend
#3 81.00000 77.00000 4.000000
#4 80.80000 77.50000 3.300000
#5 80.82400 78.07000 2.754000
#6 85.75192 82.63560 3.116320
#7 89.39243 86.18875 3.203686

Почему все портится?

1 Ответ

0 голосов
/ 16 мая 2018

Как отметил Дейсон в своем комментарии, функция ifelse() отличается от использования операторов if else.Первый возвращает одно значение для каждого элемента x, предполагая, что x является вектором, содержащим логические значения, например,

x <- c(TRUE, TRUE, FALSE, FALSE)
ifelse (x, "A", "B")

возвращает [1] "A" "A" "B" "B"

Для вашей цели вы хотите использовать обычныйif else конструкция:

hw2 <- map(cumv, function(x) {
    if (length(x) > 2) {
        return (HoltWinters(ts(x),gamma=F,alpha=0.35,beta=0.2))
    } else if (length(x) > 1) {
        return (max(x))
    } else {
        return (NA)
    }
})
...