####Functions Needed to Fit Covariate MMSBM##### #edgelist = an m(m-1) x 3 matrix. (sender, receiver, tie value)# #m is network size #covariates = an m(m-1) x p matrix (p is the number of covariates) - these can be edgelevel or node-level, but nodelevel will require some dups. #logitb is a matrix showing the group-group tie probabilities #BETA is a vector of p parameters #M=m(m-1) is number of ties #group is a vector of n group memberships# library(Rcpp) sourceCpp("SBM-Ccode.cpp") loglikeSD=function(logitb, group, edgelist, covariates, beta){ return(sum(logLikeVectorC(edgelist, logitb, group, covariates, beta))) } logprior.beta<-function(beta, mu, sigmasq){ value=-1/2*log(sigmasq)-1/(2*sigmasq)*(beta-mu)^2 return(value) } f1 <- function(row, k) sapply(1:k, function(it) sum(row==it)) logitprior=function(logitb, prior, diag){ a=prior$B$diag[1] b=prior$B$diag[2] val=a*logitb-(a+b)*log(1+exp(logitb)) return(val) } constrain.logit=function(logitb){ if(logitb>10){logitb=10} if(logitb< -10){logitb=-10} return(logitb) } SBM.ID.rotation <- function(ID.labels, label.count=max(ID.labels)) { #ID.labels=c(3,4,4,1,1,2,5); label.count=max(ID.labels) #first pin down the keepers. assigned <- replaced <- rep(NA, label.count) replacements <- rep(NA, length(ID.labels)) for (ii in 1:label.count) { if (is.na(replacements[ii])) { assigned[ID.labels[ii]] <- ii replaced[ii] <- ID.labels[ii] replacements[ID.labels==ID.labels[ii]] <- ii } } while (sum(is.na(assigned))>0) { #node <- min(which(is.na(replacements))) vacancy <- min(which(is.na(assigned))) newlabel <- min(which(is.na(replaced))) assigned[vacancy] <- newlabel replaced[newlabel] <- vacancy replacements[ID.labels==vacancy] <- newlabel } return (assigned) } group.reassign=function(groups, assignment){ newgroups=groups for(i in 1:length(assignment)){ newgroups[which(groups==i)]=assignment[i]} return(newgroups)}