## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----simulate-----------------------------------------------------------------
library(INCVCommunityDetection)

set.seed(42)
net <- community.sim(k = 3, n = 150, n1 = 50, p = 0.5, q = 0.05)
table(net$membership)

## ----adj-dim, fig.width=5, fig.height=5---------------------------------------
dim(net$adjacency)
ord <- order(net$membership)
image(net$adjacency[ord, ord],
      main = "Adjacency matrix (3-community SBM, reordered)",
      xlab = "Node", ylab = "Node")

## ----incv-ffold---------------------------------------------------------------
result <- nscv.f.fold(net$adjacency, k.vec = 2:6, f = 5)
result$k.loss   # K selected by neg-log-likelihood
result$k.mse    # K selected by MSE

## ----loss-curve, fig.width=6, fig.height=4------------------------------------
plot(2:6, result$cv.loss, type = "b", pch = 19,
     xlab = "Number of communities (K)",
     ylab = "CV Negative Log-Likelihood",
     main = "INCV f-fold: CV loss by K")
abline(v = result$k.loss, lty = 2, col = "red")

## ----incv-random--------------------------------------------------------------
result2 <- nscv.random.split(net$adjacency, k.vec = 2:6,
                             split = 0.66, ite = 20)
result2$k.chosen

## ----random-curve, fig.width=6, fig.height=4----------------------------------
plot(2:6, result2$cv.loss, type = "b", pch = 19,
     xlab = "Number of communities (K)",
     ylab = "CV Negative Log-Likelihood",
     main = "INCV random-split: CV loss by K")
abline(v = result2$k.chosen, lty = 2, col = "red")

## ----ecv----------------------------------------------------------------------
ecv <- ECV.for.blockmodel(net$adjacency, max.K = 6, B = 3)
ecv$dev.model   # best by deviance
ecv$l2.model    # best by L2
ecv$auc.model   # best by AUC

## ----ncv----------------------------------------------------------------------
ncv <- NCV.for.blockmodel(net$adjacency, max.K = 6, cv = 3)
ncv$dev.model
ncv$l2.model

## ----spectral-----------------------------------------------------------------
cl <- SBM.spectral.clustering(net$adjacency, k = 3)
table(cl$cluster)

prob <- SBM.prob(cl$cluster, k = 3, A = net$adjacency, restricted = TRUE)
round(prob$p.matrix, 3)

## ----sbm-decay----------------------------------------------------------------
net2 <- community.sim.sbm(n = 120, n1 = 40, eta = 0.3, rho = 0.2, K = 4)
round(net2$conn, 4)

## ----session------------------------------------------------------------------
sessionInfo()

