迫使离散时间序列单调递减

时间:2019-05-22 22:09:45

标签: r

我有一个评估系列。每个评估可以具有从0到4的离散值。序列应随时间减少。但是,由于值是手动插入的,因此可能会发生错误。 因此,我想将我的系列修改为单调递减。此外,我将尽量减少修改的评估次数。最后,如果两个或多个序列满足这些条件,则选择总值总和较高的一个。

例如

记录的评估

4332422111

理想评估

4332222111

记录的评估

4332322111

理想评估

4333322111 (在这种情况下,4332222111也会满足条件,但是我选择了较高的值)

我尝试通过产生所有可能的组合,选择那些单调递减的方法,最后将其中的每一个与记录的结果进行比较,使用残酷的力量方法。 但是,序列甚至可能长达20个评估,组合太多。

1 个答案:

答案 0 :(得分:1)

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)