Nothing
context("stat tests")
library(testthat)
library(network)
library(ernm)
test_that("Stats", {
# ================
# Setup
# ================
set.seed(1)
# make 1 100 node network with some variables:
add_treated_neighs <- function(net,treatment_var){
tmp <- as.numeric(get.vertex.attribute(net,treatment_var))
tmp <- tmp == max(tmp)
set.vertex.attribute(net,paste(treatment_var,"_neighbors",sep=""),as.character(sapply(1:(net%n%'n'),function(i){sum(tmp[get.neighborhood(net,i)])})))
return(net)
}
make_net <- function(...){
tmp <- matrix(rnorm(10000)>2,nrow = 100)
net <- as.network(tmp,directed =F)
set.vertex.attribute(net,"var_1",as.character(apply(rmultinom(100,1,rep(1/3,3)),2,FUN = function(x){which(x==1)})))
set.vertex.attribute(net,"var_2",as.character(apply(rmultinom(100,1,rep(1/2,2)),2,FUN = function(x){which(x==1)})))
set.vertex.attribute(net,"var_3",as.character(apply(rmultinom(100,1,rep(1/2,2)),2,FUN = function(x){which(x==1)})))
summary(as.factor(get.vertex.attribute(net,"var_1")))
net <- add_treated_neighs(net,"var_1")
net <- add_treated_neighs(net,"var_2")
net <- add_treated_neighs(net,"var_3")
}
net<-make_net()
nets<-lapply(1:100,FUN = make_net)
# ================
# Node Count
# ================
v1 = (net %v% "var_2")
v2 = (net %v% "var_3")
r_stat_1 = sum((v1=="2"))
cpp_stat_1 = as.numeric(ernm::calculateStatistics(net ~ nodeCount("var_2")))
model <- ernm(net ~ nodeCount("var_2","1")| var_2 ,
tapered = FALSE,
maxIter = 2,
mcmcBurnIn = 100,
mcmcInterval = 10,
mcmcSampleSize = 100,
verbose = FALSE)
model <- model$m$sampler$getModel()
model$setNetwork(ernm::as.BinaryNet(net))
model$calculate()
model$statistics()
# Flip var 2 from 0 to 1 when var 3 is 0
y_pos = which(net %v% "var_2"== "2")
vert = y_pos[1]
model$discreteVertexUpdate(vert,"var_2",1)
cpp_stat_2 <- model$statistics()
r_stat_2 <- r_stat_1 - 1
#reset:
model$calculate()
y_neg = which(net %v% "var_2"== "1")
vert = y_neg[1]
model$discreteVertexUpdate(vert, "var_2",2)
cpp_stat_3 <- model$statistics()
r_stat_3 <- r_stat_1 + 1
#reset:
model$calculate()
# check a dyad update makes not difference:
r_stat_4 = r_stat_1
model$dyadUpdate(61,1)
cpp_stat_4 <- model$statistics()
#reset:
model$calculate()
# check a dyad update makes not difference:
r_stat_5 = r_stat_1
model$dyadUpdate(1,61)
cpp_stat_5 <- model$statistics()
#reset:
model$calculate()
nodeCount_test_1 <- (r_stat_1 == cpp_stat_1)
nodeCount_test_2 <- (r_stat_2 == cpp_stat_2)
nodeCount_test_3 <- (r_stat_3 == cpp_stat_3)
nodeCount_test_4 <- (r_stat_4 == cpp_stat_4)
nodeCount_test_5 <- (r_stat_5 == cpp_stat_5)
testthat::expect_true(nodeCount_test_1)
testthat::expect_true(nodeCount_test_2)
testthat::expect_true(nodeCount_test_3)
testthat::expect_true(nodeCount_test_4)
testthat::expect_true(nodeCount_test_5)
# ================
# Logistic Regression
# ================
v1 = (net %v% "var_2")
v2 = (net %v% "var_3")
r_stat_1 = sum((v1=="2")[v2=="2"])
r_stat_2 = r_stat_1
r_stat_3 = sum((v1=="2")[v2=="1"])
cpp_stat_1 = as.numeric(ernm::calculateStatistics(net ~ logistic("var_2","var_3","1") | var_2))
cpp_stat_2 = as.numeric(ernm::calculateStatistics(net ~ logistic("var_2","var_3") | var_2))
cpp_stat_3 = as.numeric(ernm::calculateStatistics(net ~ logistic("var_2","var_3","2") | var_2))
# Check the discreteVarUpdate function works
y_pos = which(net %v% "var_2"== "2")
y_neg = which(net %v% "var_2"== "1")
x_pos = which(net %v% "var_3"== "2")
x_neg = which(net %v% "var_3"== "1")
model <- ernm(net ~ logistic("var_2","var_3","1") | var_2 ,
tapered = FALSE,
maxIter = 2,
mcmcBurnIn = 100,
mcmcInterval = 10,
mcmcSampleSize = 100,
verbose = FALSE)
model <- model$m$sampler$getModel()
model$setNetwork(ernm::as.BinaryNet(net))
model$calculate()
model$statistics()
# Note updates take in the factor level that the
# Flip var 2 from 0 to 1 when var 3 is 0
vert = intersect(y_neg,x_neg)[1]
model$discreteVertexUpdate(vert, "var_2",2)
cpp_stat_4 <- model$statistics()
r_stat_4 <- sum((v1=="2")[v2=="2"])
#reset:
model$calculate()
# Flip var 2 from 0 to 1 when var 3 is 1
vert = intersect(y_neg,x_pos)[1]
model$discreteVertexUpdate(vert, "var_2",2)
cpp_stat_5 <- model$statistics()
r_stat_5 <- sum((v1=="2")[v2=="2"]) + 1
#reset:
model$calculate()
# Flip var 2 from 1 to 0 when var 3 is 0
vert = intersect(y_pos,x_neg)[1]
model$discreteVertexUpdate(vert, "var_2",1)
cpp_stat_6 <- model$statistics()
r_stat_6 <- sum((v1=="2")[v2=="2"])
#reset:
model$calculate()
# Flip var 2 from 1 to 0 when var 3 is 1
vert = intersect(y_pos,x_pos)[1]
model$discreteVertexUpdate(vert, "var_2",1)
cpp_stat_7 <- model$statistics()
r_stat_7 <- sum((v1=="2")[v2=="2"]) -1
#reset:
model$calculate()
logistic_test_1 <- (r_stat_1 == cpp_stat_1)
logistic_test_2 <- (r_stat_2 == cpp_stat_2)
logistic_test_3 <- (r_stat_3 == cpp_stat_3)
logistic_test_4 <- (r_stat_4 == cpp_stat_4)
logistic_test_5 <- (r_stat_5 == cpp_stat_5)
logistic_test_6 <- (r_stat_6 == cpp_stat_6)
logistic_test_7 <- (r_stat_7 == cpp_stat_7)
testthat::expect_true(logistic_test_1)
testthat::expect_true(logistic_test_2)
testthat::expect_true(logistic_test_3)
testthat::expect_true(logistic_test_4)
testthat::expect_true(logistic_test_5)
testthat::expect_true(logistic_test_6)
testthat::expect_true(logistic_test_7)
# ================
# Logistic Neighbors
# ================
# Calculate for base level = "2"
r_stat_1 <- sum(as.numeric(net %v% "var_2_neighbors")[which(net %v% "var_2" == "1")])
cpp_stat_1 <- ernm::calculateStatistics(net ~ logisticNeighbors("var_2","var_2","2") | var_2)
# Calculate for base level = "1"
r_stat_2 <- sum(as.numeric(net %v% "var_2_neighbors")[which(net %v% "var_2" == "2")])
cpp_stat_2 <- ernm::calculateStatistics(net ~ logisticNeighbors("var_2","var_2","1") | var_2)
# Test over all the nets to be sure:
r_stat_3 <- TRUE
cpp_stat_3 <- TRUE
for(i in 1:length(nets)){
method_1 <- sum(as.numeric(nets[[i]] %v% "var_2_neighbors")[which(nets[[i]] %v% "var_2" == "1")])
method_2 <- as.numeric(ernm::calculateStatistics(nets[[i]] ~ logisticNeighbors("var_2","var_2","2") | var_2))
if(method_1 != method_2){
print(paste("failed on net ",i))
r_stat_3 = FALSE
}
}
# test the dyadUpdate function :
which(net %v% "var_2"== "2")
net_2 <- net
tmp_model <- ernm(net ~ logisticNeighbors("var_2","var_2","2") | var_2,
tapered = FALSE,
maxIter = 2,
mcmcSampleSize = 1000,
mcmcBurnIn = 100,
verbose = FALSE)
r_stat_4 <- TRUE
cpp_stat_4 <- TRUE
for(i in which(net %v% "var_2"== "2")[-1]){
net_2 <- net
net_2[i,2] <- 1 - net_2[i,2]
change_1 <- ernm::calculateStatistics(net_2 ~ logisticNeighbors("var_2","var_2","2") | var_2) -
ernm::calculateStatistics(net ~ logisticNeighbors("var_2","var_2","2") | var_2)
model <- tmp_model
model <- model$m$sample$getModel()
model$setNetwork(as.BinaryNet(net))
model$calculate()
stat1 <- model$statistics()
model$dyadUpdate(2,i)
stat2 <- model$statistics()
change_2 <- stat2-stat1
if(change_1 != change_2){
r_stat_4 <- FALSE
}
}
# test for changing a node value to
r_stat_5 <- TRUE
cpp_stat_5 <- TRUE
for(i in 1:(net%n% "n")){
net_2 <- net
if((net_2 %v% "var_2")[i] == "1"){
new_value <- "2"
}else{
new_value <- "1"
}
set.vertex.attribute(net_2,"var_2",new_value,i)
change_1 <- ernm::calculateStatistics(net_2 ~ logisticNeighbors("var_2","var_2","2") | var_2) - ernm::calculateStatistics(net ~ logisticNeighbors("var_2","var_2","2") | var_2)
model <- tmp_model
model <- model$m$sample$getModel()
model$setNetwork(as.BinaryNet(net))
model$calculate()
stat1 <- model$statistics()
model$discreteVertexUpdate(i,"var_2",as.numeric(new_value))
stat2 <- model$statistics()
change_2 <- stat2-stat1
if(change_1 != change_2){
r_stat_5 <- FALSE
}
}
logistic_neighbot_test_1 <- (r_stat_1 == cpp_stat_1)
logistic_neighbot_test_2 <- (r_stat_2 == cpp_stat_2)
logistic_neighbot_test_3 <- (r_stat_3 == cpp_stat_3)
logistic_neighbot_test_4 <- (r_stat_4 == cpp_stat_4)
logistic_neighbot_test_5 <- (r_stat_5 == cpp_stat_5)
testthat::expect_true(logistic_neighbot_test_1)
testthat::expect_true(logistic_neighbot_test_2)
testthat::expect_true(logistic_neighbot_test_3)
testthat::expect_true(logistic_neighbot_test_4)
testthat::expect_true(logistic_neighbot_test_5)
# ================
# Hamming Distance
# ================
edges <- as.edgelist(net)*1
edges <- cbind(as.double(edges[,1]),as.double(edges[,2]))
edges <- cbind(edges[,1],edges[,2])
head(edges)
hamming_calc <- function(edges,net){
e_list = as.edgelist(net)*1.0
e_list = cbind(as.double(e_list[,1]),as.double(e_list[,2]))
tmp = rbind(e_list,edges)
shared = sum(duplicated(tmp))
dist = (dim(e_list)[1] - shared) + (dim(edges)[1] - shared)
return(dist)
}
hamming_test_1 <- (
ernm::calculateStatistics(net ~ hamming(edges,100)) == hamming_calc(edges,net)
)
edges[1,] <- c(1,11)
hamming_test_2 <- (
ernm::calculateStatistics(net ~ hamming(edges,100)) == hamming_calc(edges,net)
)
edges[2,] <- c(1,13)
hamming_test_3 <- (
ernm::calculateStatistics(net ~ hamming(edges,100)) == hamming_calc(edges,net)
)
# check dyad update function
edges <- as.edgelist(net)*1
edges <- cbind(as.double(edges[,1]),as.double(edges[,2]))
# update included edge that network has
model <- ernm(net ~ hamming(edges,100),
tapered = FALSE,
maxIter = 2,
mcmcBurnIn = 100,
mcmcInterval = 10,
mcmcSampleSize = 100,
verbose = FALSE)
model <- model$m$sampler$getModel()
model$setNetwork(ernm::as.BinaryNet(net))
model$calculate()
hamming_calc(edges,net)
net_tmp <- net
delete.edges(net_tmp,get.edgeIDs(net_tmp,1,61))
r_stat_1 <- hamming_calc(edges,net_tmp)
model$statistics()
model$dyadUpdate(1,61)
cpp_stat_1 <- model$statistics()
# update included edge that network has
model <- ernm(net ~ hamming(edges,100),
tapered = FALSE,
maxIter = 2,
mcmcBurnIn = 100,
mcmcInterval = 10,
mcmcSampleSize = 100,
verbose = FALSE)
model <- model$m$sampler$getModel()
model$setNetwork(ernm::as.BinaryNet(net))
model$calculate()
hamming_calc(edges,net)
net_tmp <- net
delete.edges(net_tmp,get.edgeIDs(net_tmp,61,1))
r_stat_2 <- hamming_calc(edges,net_tmp)
model$dyadUpdate(61,1)
cpp_stat_2 <- model$statistics()
# update included edge that network does not have
edges <- matrix(c(1,2),nrow = 1)
model <- ernm(net ~ hamming(edges,100),
tapered = FALSE,
maxIter = 2,
mcmcBurnIn = 100,
mcmcInterval = 10,
mcmcSampleSize = 100,
verbose = FALSE)
model <- model$m$sampler$getModel()
model$setNetwork(ernm::as.BinaryNet(net))
model$calculate()
hamming_calc(edges,net)
net_tmp <- net
add.edges(net_tmp,1,2)
r_stat_3 <- hamming_calc(edges,net_tmp)
model$dyadUpdate(1,2)
cpp_stat_3 <- model$statistics()
# update not included edge that network has
edges <- matrix(c(1,2),nrow = 1)
model <- ernm(net ~ hamming(edges,100),
tapered = FALSE,
maxIter = 2,
mcmcBurnIn = 100,
mcmcInterval = 10,
mcmcSampleSize = 100,
verbose = FALSE)
model <- model$m$sampler$getModel()
model$setNetwork(ernm::as.BinaryNet(net))
hamming_calc(edges,net)
net_tmp <- net
delete.edges(net_tmp,get.edgeIDs(net_tmp,1,61))
r_stat_4 <- hamming_calc(edges,net_tmp)
model$statistics()
model$dyadUpdate(1,61)
cpp_stat_4 <- model$statistics()
# update not included edge that network does not have
edges <- as.edgelist(net)*1.0
edges <- cbind(as.double(edges[,1]),as.double(edges[,2]))
head(edges)
model <- ernm(net ~ hamming(edges,100),
tapered = FALSE,
maxIter = 2,
mcmcBurnIn = 100,
mcmcInterval = 10,
mcmcSampleSize = 100,
verbose = FALSE)
model <- model$m$sampler$getModel()
model$setNetwork(ernm::as.BinaryNet(net))
model$calculate()
hamming_calc(edges,net)
net_tmp <- net
add.edges(net_tmp,1,2)
r_stat_5 <- hamming_calc(edges,net_tmp)
model$statistics()
model$dyadUpdate(1,2)
cpp_stat_5 <- model$statistics()
hamming_test_4 <- (r_stat_1 == cpp_stat_1)
hamming_test_5 <- (r_stat_2 == cpp_stat_2)
hamming_test_6 <- (r_stat_3 == cpp_stat_3)
hamming_test_7 <- (r_stat_4 == cpp_stat_4)
hamming_test_7 <- (r_stat_5 == cpp_stat_5)
testthat::expect_true(hamming_test_1)
testthat::expect_true(hamming_test_2)
testthat::expect_true(hamming_test_3)
testthat::expect_true(hamming_test_4)
testthat::expect_true(hamming_test_5)
testthat::expect_true(hamming_test_6)
testthat::expect_true(hamming_test_7)
}
)
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.