Принудительное монотонное убывание дискретных временных рядов - PullRequest
0 голосов
/ 23 мая 2019

У меня есть серия оценок.Каждая оценка может иметь дискретные значения в диапазоне от 0 до 4. Серии должны уменьшаться во времени.Однако, поскольку значения вставляются вручную, могут возникнуть ошибки.Поэтому я бы хотел, чтобы мои ряды были монотонно убывающими.Более того, я бы минимизировал количество модифицированных оценок.Наконец, если две или более серии удовлетворяют этим критериям, выбирается та, у которой общая сумма более высоких значений.

Например,

Записанная оценка

4332422111

* 1008.* Идеальная оценка

4332222111

Записанная оценка

4332322111

Идеальная оценка

4333322111 (в этом случае 4332222111 будет удовлетворять критериямтоже, но я выбрал с более высокими значениями)

Я попытался с применением подхода брутальной силы, сгенерировав все возможные комбинации, выбрав эти монотонные убывающие и, наконец, сравнив каждую из них с записанными.Тем не менее, серия может быть длиной даже в 20 оценок, а комбинаций - слишком много.

1 Ответ

1 голос
/ 23 мая 2019
x1 <- c(4,3,3,2,4,2,2,1,1,1)
x2 <- c(4,3,3,2,3,2,2,1,1,1)

Вы почти наверняка можете нарушить этот алгоритм, но вот первая попытка: замените местоположения увеличенными значениями на NA, а затем заполните их предыдущим местоположением.

dfun <- function(x) {
    r <- replace(x,which(c(0,diff(x))>0),NA)
    zoo::na.locf(r)
}

dfun(x1)
dfun(x2)

Это дает «менее идеальный» ответ во втором случае.

Для записи я тоже попробовал

dfun2 <- function(x) {
    s <- as.stepfun(isoreg(-x))
    -s(seq_along(x))
}

, но первый пример не обрабатывается так, как хотелось бы.

Вы также можете попытаться сделать это с помощью дискретного программирования (о котором я почти ничего не знаю) или чуть более сложной формы грубой силы - используйте стохастический алгоритм, который строго наказывает немонотонность и слабо наказывает расстояние от начальная последовательность ... (например, optim(..., method="SANN") с функцией-кандидатом, которая добавляет или вычитает 1 из произвольного элемента)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...