get_complexity {binsegRcpp} R Documentation

## get complexity

### Description

Get empirical and extreme split counts, in order to compare the empirical and theoretical time complexity of the binary segmentation algorithm.

### Usage

get_complexity(models,
y.increment = 0.1)

### Arguments

 models result of binseg. y.increment Offset for y column values of totals output table.

### Value

List of class "complexity" which has a plot method. Elements include "iterations" which is a data table with one row per model size, and column splits with number of splits to check after computing that model size; "totals" which is a data table with total number of splits for each case.

### Author(s)

Toby Dylan Hocking

### Examples


## Example 1: empirical=worst case.
data.vec <- rep(0:1, l=8)
plot(data.vec)
worst.model <- binsegRcpp::binseg_normal(data.vec)
worst.counts <- binsegRcpp::get_complexity(worst.model)
plot(worst.counts)

## Example 2: empirical=best case for full path.
data.vec <- 1:8
plot(data.vec)
full.model <- binsegRcpp::binseg_normal(data.vec)
full.counts <- binsegRcpp::get_complexity(full.model)
plot(full.counts)

## Example 3: empirical=best case for all partial paths.
data.vec <- c(0,3,6,10,21,22,23,24)
plot(data.vec)
best.model <- binsegRcpp::binseg_normal(data.vec)
best.counts <- binsegRcpp::get_complexity(best.model)
plot(best.counts)

## ggplot comparing examples 1-3.
if(require("ggplot2")){
library(data.table)
splits.list <- list()
for(data.type in names(worst.counts)){
splits.list[[data.type]] <- rbind(
data.table(data="worst", worst.counts[[data.type]]),
data.table(data="best always", best.counts[[data.type]]),
data.table(data="best full", full.counts[[data.type]]))
}
ggplot()+
facet_grid(data ~ .)+
geom_line(aes(
segments, cum.splits, color=case, size=case),
data=splits.list$iterations[case!="empirical"])+ geom_point(aes( segments, cum.splits, color=case), data=splits.list$iterations[case=="empirical"])+
scale_color_manual(
values=binsegRcpp::case.colors,
breaks=names(binsegRcpp::case.colors))+
scale_size_manual(
values=binsegRcpp::case.sizes,
guide="none")
}

## Example 4: empirical case between best/worst.
data.vec <- rep(c(0,1,10,11),8)
plot(data.vec)
m.model <- binsegRcpp::binseg_normal(data.vec)
m.splits <- binsegRcpp::get_complexity(m.model)
plot(m.splits)

## Example 5: worst case for normal change in mean and variance
## model.
mv.model <- binsegRcpp::binseg("meanvar_norm", data.vec)
mv.splits <- binsegRcpp::get_complexity(mv.model)
plot(mv.splits)

## Compare examples 4-5 using ggplot2.
if(require("ggplot2")){
library(data.table)
splits.list <- list()
for(data.type in names(m.splits)){
splits.list[[data.type]] <- rbind(
data.table(model="mean and variance", mv.splits[[data.type]]),
data.table(model="mean only", m.splits[[data.type]]))
}
ggplot()+
facet_grid(model ~ .)+
geom_line(aes(
segments, splits, color=case, size=case),
data=splits.list$iterations[case!="empirical"])+ geom_point(aes( segments, splits, color=case), data=splits.list$iterations[case=="empirical"])+
geom_text(aes(
x, y,
label=label,
color=case),
hjust=1,
data=splits.list$totals)+ scale_color_manual( values=binsegRcpp::case.colors, guide="none")+ scale_size_manual( values=binsegRcpp::case.sizes, guide="none") } ## Compare cumsums. if(require("ggplot2")){ library(data.table) splits.list <- list() for(data.type in names(m.splits)){ splits.list[[data.type]] <- rbind( data.table(model="mean and variance", mv.splits[[data.type]]), data.table(model="mean only", m.splits[[data.type]])) } ggplot()+ facet_grid(model ~ .)+ geom_line(aes( segments, cum.splits, color=case, size=case), data=splits.list$iterations[case!="empirical"])+
geom_point(aes(
segments, cum.splits, color=case),
data=splits.list\$iterations[case=="empirical"])+
scale_color_manual(
values=binsegRcpp::case.colors,
breaks=names(binsegRcpp::case.colors))+
scale_size_manual(
values=binsegRcpp::case.sizes,
guide="none")
}



[Package binsegRcpp version 2023.8.31 Index]