代码之家  ›  专栏  ›  技术社区  ›  sarovasta

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

r
  •  0
  • sarovasta  · 技术社区  · 7 年前

    因此,我想修改我的系列为单调递减。此外,我会尽量减少修改评估的数量。最后,如果两个或两个以上的系列满足这些标准,将选择总值和较高的一个。

    例如。

    记录评估

    理想评价

    4332222111

    记录评估

    4332322111

    4333322111 (在本例中,4332222111也可以满足标准,但我选择了更高的值)

    我尝试用残酷的力量方法,生成所有可能的组合,选择那些单调递减的,最后将每一个与记录的进行比较。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Ben Bolker    7 年前
    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)