我刚刚开始使用'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]
我知道这是一个伪代码是一个函数,但是我不确定是否应该为这一行创建另一个函数,因为它有两个命令。任何人都可以帮助编码这行吗?
答案 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)