From 1175391357a630f8cb8f9c04b2ff65035659f92f Mon Sep 17 00:00:00 2001 From: Toby Dylan Hocking Date: Tue, 23 Jun 2020 14:58:29 -0700 Subject: [PATCH] sequence CV figs --- Makefile | 2 + README.org | 3 + figure-sequence-cv-OPART.pdf | Bin 0 -> 5822 bytes figure-sequence-cv-SegAnnot.pdf | Bin 0 -> 5948 bytes figure-sequence-cv-roc.pdf | Bin 0 -> 21564 bytes figure-sequence-cv.R | 343 ++++++++++++++++++++++++++++++++ figure-sequence-cv.pdf | Bin 0 -> 6114 bytes 7 files changed, 348 insertions(+) create mode 100644 figure-sequence-cv-OPART.pdf create mode 100644 figure-sequence-cv-SegAnnot.pdf create mode 100644 figure-sequence-cv-roc.pdf create mode 100644 figure-sequence-cv.R create mode 100644 figure-sequence-cv.pdf diff --git a/Makefile b/Makefile index 7c2a9e1..9e22407 100644 --- a/Makefile +++ b/Makefile @@ -14,3 +14,5 @@ figure-cv.pdf: figure-cv.R R --vanilla < $< figure-cv-BIC.pdf: figure-cv-BIC.R R --vanilla < $< +figure-sequence-cv.pdf: figure-sequence-cv.R + R --vanilla < $< diff --git a/README.org b/README.org index 7c0d28c..1bc9c91 100644 --- a/README.org +++ b/README.org @@ -8,6 +8,9 @@ Figures for Labeled Optimal PARTitioning paper - Cross-validation label error figures. [[file:figure-cv.R][R script]], [[file:figure-cv.pdf][OPART pdf (Fig 3 right)]], [[file:figure-cv-SegAnnot.pdf][SegAnnot pdf (Fig 4 right)]], [[file:figure-cv-roc.pdf][Fig 5 ROC curves]]. - Comparison with BIC figures. [[file:figure-cv-BIC.R][R script]], [[file:figure-cv-BIC-roc.pdf][ROC curves]], [[file:figure-cv-BIC.pdf][Error rates]]. +- Sequential cross-validation (fold 1 = first half of labels, fold 2 = + second half labels) figures. [[file:figure-sequence-cv.R][R script]], [[file:figure-sequence-cv-OPART.pdf][Best case OPART differences]], + [[file:figure-sequence-cv-SegAnnot.pdf][Best case SegAnnot differences]], [[file:figure-sequence-cv-roc.pdf][ROC curves]], [[file:figure-sequence-cv.pdf][Test error rates]]. Reproducibility: use "make" with one of the recipes defined in [[file:Makefile]]. diff --git a/figure-sequence-cv-OPART.pdf b/figure-sequence-cv-OPART.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c1608139274e74bb4c94e4ab0f1279eb09605157 GIT binary patch literal 5822 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 literal 0 HcmV?d00001 diff --git a/figure-sequence-cv-roc.pdf b/figure-sequence-cv-roc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3e9bbefcde984917b76551ea2d6f7528ddaaf19b GIT binary patch literal 21564 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 Va6IvQWjGl?wS|?HEgUR`{{wJ)!xR7j literal 0 HcmV?d00001 diff --git a/figure-sequence-cv.R b/figure-sequence-cv.R new file mode 100644 index 0000000..6e70fb8 --- /dev/null +++ b/figure-sequence-cv.R @@ -0,0 +1,343 @@ +source("packages.R") + +err.dt <- data.table( + csv=Sys.glob("figure-sequence-cv-data/*.csv") +)[, data.table::fread( + csv, + colClasses=list(character=5) +), by=csv] +err.dt[model.name=="LOPART" & set=="train", table(errors)] +err.dt[model.name=="LOPART" & set=="train" & 0fp)] + +SegAnnot.compare.counts <- SegAnnot.compare[, .( + test.sets=.N +), by=.(fewer.FN, fp)] +SegAnnot.compare.counts[, .( + test.sets=sum(test.sets) +), by=.(same = fp==fewer.FN)] +my.title <- ggtitle("Best penalty") +scale.fill <- scale_fill_gradient( + "log10(seqs)", + low="white", + high="violet") +gg <- ggplot()+ + ##ggtitle("LOPART is more accurate than SegAnnot")+ + my.title+ + geom_abline(aes( + slope=slope, intercept=intercept, color=test.errors), + data=data.table(slope=1, intercept=0, test.errors="equal"))+ + scale_color_manual(values=c(equal="grey"), guide=FALSE)+ + geom_tile(aes( + fewer.FN, fp, fill=log10(test.sets)), + alpha=0.8, + data=SegAnnot.compare.counts)+ + geom_text(aes( + fewer.FN, fp, label=test.sets), + data=SegAnnot.compare.counts)+ + scale.fill+ + coord_equal()+ + theme_bw()+ + scale_x_continuous( + "Number of LOPART true positive labels +(SegAnnot always has true positives=0)")+ + scale_y_continuous( + "Number of LOPART +false positive labels +(SegAnnot always has +false positives=0)") +pdf("figure-sequence-cv-SegAnnot.pdf", width=5, height=2.3) +print(gg) +dev.off() + +total.dt <- dcast( + data.table(data.frame(err.dt)), + sequenceID + test.fold + model.name + penalty ~ set, + value.var="errors") +total.dt[, train.test := test+train] +total.min <- total.dt[, .SD[ + which.min(train.test)], by=.(sequenceID, test.fold, model.name)] +total.min.wide <- dcast( + total.min, + sequenceID + test.fold ~ model.name, + value.var=c("test", "train", "train.test")) +total.min.wide[, diff := train.test_OPART-train.test_LOPART] +total.min.wide[, .( + prob.folds=.N +), keyby=.(diff)] +total.min.wide[diff<0] +total.min.wide[, train.test.diff := train.test_OPART - train.test_LOPART] +mytab <- function(dt, col.name){ + errors <- dt[, .( + count=.N, + percent=100*.N/nrow(dt) + ), by=col.name] + is.zero <- errors[[col.name]] == 0 + nonzero <- errors[!is.zero] + sum.wide <- data.table( + sum.count=sum(errors$count), + zero.count=errors$count[is.zero], + nonzero.count=sum(nonzero$count), + nonzero.min=min(nonzero[[col.name]]), + nonzero.max=max(nonzero[[col.name]])) + sum.tall <- melt(sum.wide, measure.vars=names(sum.wide)) + sum.tall[grepl("count", variable), percent := 100*value/nrow(dt) ] + list( + errors=errors, + summary=sum.tall) +} +mytab(total.min.wide, "train_OPART") + +total.min.wide[, test.diff := test_OPART-test_LOPART] +mytab(total.min.wide, "test.diff") + +train.test.counts <- total.min.wide[, .( + splits=.N +), by=.(train_OPART, test.diff)] +gg <- ggplot()+ + ##ggtitle("LOPART is more accurate\nthan OPART")+ + my.title+ + geom_hline(yintercept=0, color="grey")+ + geom_vline(xintercept=0, color="grey")+ + geom_tile(aes( + train_OPART, test.diff, fill=log10(splits)), + alpha=0.8, + data=train.test.counts)+ + geom_text(aes( + train_OPART, test.diff, label=splits), + data=train.test.counts)+ + scale.fill+ + coord_equal()+ + theme_bw()+ + scale_x_continuous( + "OPART train label errors +(LOPART is always=0)")+ + scale_y_continuous( + "Test label error difference +(OPART-LOPART)") +pdf("figure-sequence-cv-OPART.pdf", width=3, height=2.3) +print(gg) +dev.off() + +err.dt[, log.penalty := log(penalty)] +err.dt[, min.log.lambda := log.penalty + c( + -Inf, -diff(log.penalty)/2 +), by=.( + model.name, test.fold, set, sequenceID)] +err.dt[, max.log.lambda := c( + min.log.lambda[-1], Inf +), by=.( + model.name, test.fold, set, sequenceID)] +err.test <- err.dt[set=="test"] + +err.train <- err.dt[set=="train" & model.name=="OPART"] + +feature.dt <- data.table::fread( + "data-for-LOPART-signals.csv.gz" +)[, .( + log.log.data=log(log(.N)) +), by=sequenceID] +feature.mat <- feature.dt[, matrix( + log.log.data, + ncol=1, + dimnames=list(sequenceID=sequenceID, feature="log.log.data"))] + +pred.dt <- err.train[, { + best.penalty <- .SD[, .( + train.errors=sum(errors) + ), by=penalty][which.min(train.errors)] + target.dt <- penaltyLearning::targetIntervals(.SD, "sequenceID") + target.mat <- target.dt[ + rownames(feature.mat), + cbind(min.log.lambda, max.log.lambda), + on="sequenceID"] + keep <- -Inf < target.mat[, 1] | target.mat[,2] < Inf + fit <- penaltyLearning::IntervalRegressionUnregularized( + feature.mat[keep, , drop=FALSE], target.mat[keep, ]) + print(fit) + rbind( + data.table( + sequenceID=rownames(feature.mat), + Penalty="constant", + Parameters=1, + pred.log.lambda=log(best.penalty$penalty)), + data.table( + sequenceID=rownames(feature.mat), + Penalty="BIC", + Parameters=0, + pred.log.lambda=as.numeric(feature.mat)), + data.table( + sequenceID=rownames(feature.mat), + Penalty="linear", + Parameters=2, + pred.log.lambda=as.numeric(fit$predict(feature.mat)))) +}, by=test.fold] + +auc.dt <- err.test[, { + select.dt <- data.table(test.fold) + pred.fold <- pred.dt[select.dt, on="test.fold"] + model.dt <- .SD[order(sequenceID, min.log.lambda)] + pred.fold[, { + roc.list <- penaltyLearning::ROChange( + model.dt, + .SD[select.dt, on="test.fold"], + problem.vars="sequenceID") + with(roc.list, data.table( + roc=list(roc), auc, + thresholds[threshold=="predicted"])) + }, by=.(Penalty, Parameters)] +}, by=.(test.fold, model.name)] + +roc.dt <- auc.dt[, data.table( + roc[[1]] +), by=.(test.fold, model.name, Penalty, Parameters)] +possible.dt <- unique(auc.dt[, .( + test.fold, possible.fp, possible.fn)]) +pred.point.dt <- rbind( + auc.dt[model.name=="LOPART", data.table( + FPR=0, TPR=0, fp=0, tp=0, auc=NA, labels, + model.name="SegAnnot", test.fold, Penalty, Parameters + )], + auc.dt[, .( + FPR, TPR, fp, tp, auc, labels, + model.name, test.fold, Penalty, Parameters + )] +)[possible.dt, on=.(test.fold)] +algo.colors <- c( + OPART="#0077CC", + LOPART="black", + SegAnnot="#22CC22") +gg <- ggplot()+ + theme_bw()+ + scale_color_manual(values=algo.colors)+ + scale_size_manual(values=c( + LOPART=1.5, + OPART=1))+ + directlabels::geom_dl(aes( + FPR, TPR, + color=model.name, + label=paste0(model.name, ifelse(is.na(auc), "", sprintf( + " AUC=%.3f", auc + )))), + method=list( + cex=0.8, + directlabels::polygon.method( + "right", + offset.cm=0.5, + padding.cm=0.05)), + data=pred.point.dt)+ + geom_path(aes( + FPR, TPR, + color=model.name, + size=model.name, + group=paste(model.name, test.fold)), + data=roc.dt)+ + geom_point(aes( + FPR, TPR, + color=model.name), + size=3, + shape=21, + fill="white", + data=pred.point.dt)+ + theme( + panel.spacing=grid::unit(0, "lines"), + legend.position="none" + )+ + facet_grid(test.fold ~ Penalty + Parameters, labeller=label_both)+ + coord_equal()+ + scale_x_continuous( + "False Positive Rate (test set labels)", + breaks=c(0, 0.5, 1), + labels=c("0", "0.5", "1"))+ + scale_y_continuous( + "True Positive Rate (test set labels)", + breaks=c(0, 0.5, 1), + labels=c("0", "0.5", "1")) +##print(gg) +expansion <- 2.5 +pdf("figure-sequence-cv-roc.pdf", width=3*expansion, height=2*expansion) +print(gg) +dev.off() + +auc.wide <- dcast( + auc.dt, + test.fold + Parameters + Penalty ~ model.name, + value.var = "auc") +auc.wide[, diff := OPART-LOPART] +auc.wide + +pred.point.dt[, fn := possible.fn-tp ] +pred.point.dt[, errors := fn + fp ] +pred.point.dt[, percent.error := 100*errors/labels] +pred.point.dt[, Penalty.Params := paste0(Penalty, ".", Parameters)] +gg <- ggplot()+ + theme_bw()+ + theme(panel.spacing=grid::unit(0, "lines"))+ + geom_point(aes( + percent.error, Penalty.Params, color=model.name), + data=pred.point.dt)+ + facet_grid(. ~ test.fold, labeller=label_both)+ + scale_color_manual(values=algo.colors) + +pred.point.dt[, percent.accuracy := 100-percent.error] +pred.point.vars <- melt( + pred.point.dt, + measure.vars=c("percent.accuracy", "auc")) +ggplot()+ + theme_bw()+ + theme(panel.spacing=grid::unit(0, "lines"))+ + geom_point(aes( + value, Penalty.Params, color=model.name), + data=pred.point.vars)+ + facet_grid(test.fold ~ variable, labeller=label_both, scales="free")+ + scale_color_manual(values=algo.colors) + +ggplot()+ + theme_bw()+ + theme(panel.spacing=grid::unit(0, "lines"))+ + geom_point(aes( + value, Penalty.Params, color=model.name), + data=pred.point.vars)+ + facet_grid(. ~ variable + test.fold, labeller=label_both, scales="free")+ + scale_color_manual(values=algo.colors) + +pred.point.wide <- dcast( + pred.point.dt, + test.fold + Penalty.Params ~ model.name, + value.var="percent.error") +pred.point.tall <- melt( + pred.point.wide, + measure.vars=c("OPART", "SegAnnot"), + variable.name="competitor", + value.name="percent.error") + +ggplot()+ + theme_bw()+ + theme(panel.spacing=grid::unit(0, "lines"))+ + facet_grid(. ~ competitor)+ + geom_abline(aes( + slope=slope, intercept=intercept), + color="grey", + data=data.table(slope=1, intercept=0))+ + geom_point(aes( + LOPART, percent.error, color=Penalty.Params), + data=pred.point.tall)+ + coord_equal() + +pdf("figure-sequence-cv.pdf", width=4, height=2) +print(gg) +dev.off() diff --git a/figure-sequence-cv.pdf b/figure-sequence-cv.pdf new file mode 100644 index 0000000000000000000000000000000000000000..edcbfe51071a5d6914872cf4ce5698293c7150d3 GIT binary patch literal 6114 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 literal 0 HcmV?d00001