Nothing
# mysample <- strataSampling(precluststrata, sample.size=sample.size, prob=ac$probs, randomize=0)
bootclustrange <- function(object, seqdata, seqdist.args = list(method = "LCS"),
R = 100, sample.size = 1000,
parallel = FALSE, progressbar = FALSE,
sampling = "clustering", strata = NULL) {
## Preparing
start.time <- Sys.time() # debut du processus
if (inherits(object, "seqclararange")) {
medoids <- object$clara[[length(object$clara)]]$medoids
clustering <- as.data.frame(object$clustering)
} else {
clustering <- as.data.frame(object)
medoids <- NULL
}
if (is.null(strata) && sampling == "clustering") {
strata <- clustering[, ncol(clustering)]
tt <- prop.table(table(strata))
if (any(round(tt * sample.size) < 2)) {
stop("[!] sample size is to small for the stratified sampling of clustering. Consider a minimum value of ", 2 / min(tt))
}
sampling <- "strata"
}
if (parallel) {
oplan <- plan(multisession)
on.exit(plan(oplan), add = TRUE)
}
if (progressbar) {
if (requireNamespace("progress", quietly = TRUE)) {
old_handlers <- handlers(handler_progress(format = "(:spin) [:bar] :percent | Elapsed: :elapsed | ETA: :eta | :message"))
if (!is.null(old_handlers)) {
on.exit(handlers(old_handlers), add = TRUE)
}
} else {
message(" [>] Install the progress package to see estimated remaining time.")
}
oldglobal <- handlers(global = TRUE)
if (!is.null(oldglobal)) {
on.exit(handlers(global = oldglobal), add = TRUE)
}
}
p <- progressor(R)
## Parallel loop
calc_cqi <- foreach(loop = 1:R, .options.future = list(packages = c("TraMineR", "WeightedCluster"), seed = TRUE, globals = structure(TRUE, add = c("sample.size", "seqdist.args")))) %dofuture% { # on stocke chaque bootstrap
## function for stratified subsampling
stratsampling <- function() {
tt <- table(strata)
tosample <- round(prop.table(tt) * sample.size)
correction <- sample.size - sum(tosample)
if (correction != 0) {
correct <- sample(1:length(tosample), abs(correction))
tosample[correct] <- tosample[correct] + sign(correction)
}
mysample <- NULL
for (u in unique(strata)) {
mysample <- c(mysample, sample(which(strata == u), tosample[as.character(u)]))
}
return(mysample)
}
ltime <- proc.time()
## Ensure that we have at least one observation per cluster in our bootstrap
done <- FALSE
while (!done) {
if (sampling == "strata") {
mysample <- stratsampling()
} else if (sampling == "medoids" && !is.null(medoids)) {
mysample <- c(medoids, sample.int(nrow(clustering), sample.size - length(medoids)))
} else {
mysample <- sample.int(nrow(clustering), sample.size)
}
clust_sample <- clustering[mysample, ]
done <- all(sapply(1:ncol(clustering), function(x) length(unique(clustering[, x])) == length(unique(clust_sample[, x]))))
}
## Subsample
seqdist.args$seqdata <- seqdata[mysample, ]
suppressMessages(diss <- do.call(seqdist, seqdist.args))
cqi <- as.clustrange(clustering[mysample, ], diss = diss)
rm(diss)
gc()
cqi$stats
}
reframeData <- function(ll, clust, matrix = FALSE) {
xx <- lapply(ll, FUN = function(x) x[clust, ])
if (matrix) {
return(do.call(rbind, xx))
}
return(do.call(c, xx))
}
## Build the corresponding clustrange object.
ret <- list(clustering = clustering)
numclust <- ncol(ret$clustering)
ret$kvals <- numeric(numclust)
ret$meant <- matrix(-1, nrow = numclust, ncol = 10)
ret$stderr <- matrix(-1, nrow = numclust, ncol = 10)
ret$boot <- list()
for (i in 1:numclust) {
ret$boot[[i]] <- reframeData(calc_cqi, i, TRUE)
ret$kvals[i] <- length(unique(ret$clustering[, i]))
ret$meant[i, ] <- colMeans(ret$boot[[i]])
ret$stderr[i, ] <- apply(ret$boot[[i]], 2L, function(x) sqrt(var(x)))
}
clnames <- paste0("cluster", ret$kvals)
colnames(ret$clustering) <- clnames
ret$meant <- as.data.frame(ret$meant)
ret$stderr <- as.data.frame(ret$stderr)
colnames(ret$meant) <- colnames(ret$boot[[i]])
colnames(ret$stderr) <- colnames(ret$boot[[i]])
rownames(ret$meant) <- clnames
rownames(ret$stderr) <- clnames
ret$stats <- ret$meant
class(ret) <- c("bootclustrange", "clustrange", class(ret))
return(ret)
}
plot.bootclustrange <- function(x, stat = "noCH", legendpos = "bottomright", norm = "none",
withlegend = TRUE, lwd = 1, col = NULL, ylab = "Indicators",
xlab = "N clusters", conf.int = 0.95, ci.method = "perc", ci.alpha = .3, line = "median", ...) {
# NextMethod("plot")
getS3method("plot", "clustrange")(x, stat = stat, legendpos = legendpos, norm = norm,
withlegend = withlegend, lwd = lwd, col = col, ylab = ylab,
xlab = xlab, conf.int = conf.int, ci.method = ci.method, ci.alpha = ci.alpha, line = line, ...)
}
print.bootclustrange <- function(x, digits = 2, bootstat = c("mean"), ...) {
getS3method("print", "clustrange")(x, digits = digits, bootstat = bootstat, ...)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.