伪代码转换为R语言

时间:2014-08-11 11:33:43

标签: r pseudocode

我刚刚开始使用'wbs'包,我认为如果我在使用包之前在r中编码伪代码,我可以更好地理解它。因此,我目前正在将野生二进制分段伪代码转换为R编程语言材料。

function WildBinSeg(s, e, ζT) 
    if e−s < 1 then 
        STOP 
    else 
        Ms,e := set of those indices m for which [sm,em] ∈ FM T is such that [sm,em] ⊆ [s,e] 
        (Optional: augment Ms,e := Ms,e ∪{0}, where [s0,e0] = [s,e]) 
        (m0,b0) := argmaxm∈Ms,e,b∈{sm,...,em−1}| ˜ Xb sm,em| 
        if | Xb0 sm0,em0| > ζT then 
            add b0 to the set of estimated change-points 
            WildBinSeg(s, b0, ζT) 
            WildBinSeg(b0 + 1, e, ζT) 
        else 
            STOP 
        end if 
    end if 
end function

我对这条线感到困惑:

    Ms,e := set of those indices m for which [sm,em] ∈ FM T is such that [sm,em] ⊆ [s,e] 

我知道这是一个伪代码是一个函数,但是我不确定是否应该为这一行创建另一个函数,因为它有两个命令。任何人都可以帮助编码这行吗?

1 个答案:

答案 0 :(得分:0)

首先需要编写一个函数来绘制M个区间,并在每个区间中找到CUSUM统计量绝对值的最大值(详见WBS论文)。

在下面的R代码中,我假设这样一个函数的输出存储在&#39; res&#39;变量,是一个4乘M矩阵。前两列包含绘制区间的左右端点(sm,em),第三列包含每个区间(bm)的CUSUM统计量的最大值,最后一列包含相应CUSUM统计量的值(Xbm sm,em)

WildBinSeg <- function(s, e, threshold,res){
    if(e-s <1) return(NULL)
    else{
        #we leave only intervals contained in [s,e]
        res <- res[res[,1]>= s & res[,2]<= e,,drop=FALSE]
        #place for the optional augmentation

        #check if there are any intervals left
        if(nrow(res)==0) return(NULL)
        else{           
            #we find the maximum
            max.id <- which.max(abs(res[,4]))
            b0 <- res[max.id,3]
            Xb0 <- res[max.id,4]

            if(abs(Xb0) > threshold)
                return(c(
                                WildBinSeg(s, b0, threshold,res),
                                b0,
                                WildBinSeg(b0+1,e, threshold,res)
            ))
            else return(NULL)   
        }

    }
}

此函数返回更改点的本地化。您可以使用这段代码检查它是如何工作的。

require(wbs)
set.seed(12)
#we generate a piecewise constant function plus Gaussian noise vector
x <- rnorm(1000)
x[1:500] <- x[1:500]+1

res <- wbs(x)$res[,1:4]
#we set the threshold to the recommended value
threshold <- 1.3*sqrt(2*log(1000))



WildBinSeg(1,1000,threshold,res)