Last active
September 12, 2017 18:39
-
-
Save nickeubank/5970facdf644639d44f9cde7116d6fd7 to your computer and use it in GitHub Desktop.
modifications to functions.R to get reciprocal graph
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| stripAttributes <- function(g) { | |
| for (a in list.graph.attributes(g)) { | |
| g <- delete_graph_attr(g, a) | |
| } | |
| for (a in list.edge.attributes(g)) { | |
| g <- delete_edge_attr(g, a) | |
| } | |
| for (a in list.vertex.attributes(g)) { | |
| if (a != "name") { | |
| g <- delete_vertex_attr(g, a) | |
| } | |
| } | |
| return(g) | |
| } | |
| makeNetwork <- function(nodes, ties, type, village) { | |
| g <- ties[ties$type == type,c("i","j")] | |
| n_no_interview <- length(unique(g$j[!g$j %in% nodes$i[nodes$interviewed]])) | |
| reciprocity_construct <- NA | |
| if (type %in% c("friend", "family", "lender", "solver", "speak")) { | |
| g <- graph.data.frame(g, vertices = nodes) | |
| if (type %in% c("friend", "family")) { | |
| reciprocity_construct <- reciprocity(g) | |
| g <- as.undirected(g, "mutual", edge.attr.comb = list("type" = "first")) | |
| } | |
| # Add friends and family that does not require | |
| # reciprocation (nick, sept 12, 2017) | |
| if (type %in% c("friends_nonrecip", "family_nonrecip")) { | |
| reciprocity_construct <- reciprocity(g) | |
| g <- as.undirected(g, "collapse", edge.attr.comb = list("type" = "first")) | |
| } | |
| g <- induced_subgraph(g, V(g)[V(g)$interviewed]) | |
| } else if (type %in% c("Leader")) { | |
| leaders <- unique(g$j) | |
| g <- g[!g$i %in% leaders,] | |
| g <- graph.data.frame(g, vertices = nodes) | |
| g <- induced_subgraph(g, V(g)[V(g)$interviewed]) | |
| low <- V(g)[degree(g,mode = "in") < 5] | |
| g <- g - E(g)[V(g) %->% low] | |
| } else { | |
| stop("Unsupported type") | |
| } | |
| g$etype <- type | |
| g$village <- village | |
| stats_construct <- data.frame(village = village, | |
| etype = type, | |
| reciprocity_construct = reciprocity_construct, | |
| n_no_interview = n_no_interview, | |
| stringsAsFactors = F) | |
| return(list(g = g, | |
| stats_construct = stats_construct)) | |
| } | |
| makeNetworks <- function(nodes, ties, village) { | |
| types <- c("family","friend","solver","lender","Leader", "speak", "friends_nonrecip", "family_nonrecip") | |
| networks <- lapply(types, makeNetwork, nodes = nodes, ties = ties, village = village) | |
| stats_construct <- lapply(networks, function(l) l$stats_construct) | |
| networks <- lapply(networks, function(l) l$g) | |
| names(networks) <- types | |
| stats_construct <- do.call(rbind, stats_construct) | |
| # distances network | |
| p <- as_data_frame(networks$family, what = "vertices")[,c("name","lon","lat","nodist")] | |
| colnames(p)[1] <- "i" | |
| sto <- as.data.frame(t(combn(p$i, 2))) | |
| colnames(sto) <- c("i","j") | |
| sto <- merge(sto, p) | |
| sto <- merge(sto, p, by.x = "j", by.y = "i") | |
| sto$weight <- sapply(1:nrow(sto), function(i) distGeo(sto[i,c("lon.x","lat.x")],sto[i,c("lon.y","lat.y")])) | |
| sto$weight[sto$nodist.x | sto$nodist.y] <- NA | |
| sto$weight[is.na(sto$weight)] <- mean(sto$weight, na.rm = T) # those that don't have coordinates get assigned mean distance | |
| sto <- sto[,c("i","j","weight")] | |
| networks$geo <- graph.data.frame(sto, | |
| directed = F, | |
| vertices = as_data_frame(networks$family, what = "vertices")) | |
| networks$geo$etype <- "geo" | |
| networks$geo$village <- village | |
| # union of all networks | |
| networks$union <- networks$family %u% | |
| stripAttributes(networks$friend) %u% | |
| as.undirected(stripAttributes(networks$solver), mode = "collapse") %u% | |
| as.undirected(stripAttributes(networks$lender), mode = "collapse") | |
| networks$union <- simplify(networks$union) | |
| networks$union$etype <- "union" | |
| networks$union$village <- village | |
| # Union without requirement of reciprocity | |
| networks$union_nonrecip <- networks$family_nonrecip %u% | |
| stripAttributes(networks$friend_nonrecip) %u% | |
| as.undirected(stripAttributes(networks$solver), mode = "collapse") %u% | |
| as.undirected(stripAttributes(networks$lender), mode = "collapse") | |
| networks$union_nonrecip <- simplify(networks$union_nonrecip) | |
| networks$union_nonrecip$etype <- "union_nonrecrip" | |
| networks$union_nonrecip$village <- village | |
| networks$strong_ties <- networks$family %u% stripAttributes(networks$friend) | |
| networks$strong_ties <- simplify(networks$strong_ties) | |
| networks$strong_ties$etype <- "strong_ties" | |
| networks$weak_ties <- networks$solver %u% stripAttributes(networks$lender) | |
| networks$weak_ties <- simplify(networks$weak_ties) | |
| networks$weak_ties$etype <- "weak_ties" | |
| networks$leader_obj <- networks$union | |
| networks$leader_obj <- networks$leader_obj - | |
| difference(E(networks$leader_obj), | |
| E(networks$leader_obj)[inc(V(networks$leader_obj)[is_leader_obj == 1])]) | |
| networks$leader_obj$etype <- "leader_obj" | |
| n_no_interview <- nrow(nodes) - length(unique(ties$j[ties$j %in% nodes$i[nodes$interviewed]])) | |
| stats_construct <- rbind(stats_construct, | |
| data.frame(village = village, | |
| etype = "union", | |
| reciprocity_construct = NA, | |
| n_no_interview = n_no_interview, | |
| stringsAsFactors = F)) | |
| return(list(networks = networks, | |
| stats_construct = stats_construct)) | |
| } | |
| cleanDf <- function(df) { | |
| cols <- c("IDLINE", "key", "connection", | |
| "exist", "id", "confirmentryid", | |
| "village", "family_name", "first_name", | |
| "alias_name", "gender", "gender_rec", | |
| "hh_quadrant", "hh_number", "confirm", | |
| "newfamily", "newfirst", "newalias", | |
| "newgender", "qa13relation", "lineperperson", | |
| "connectionid", "fewconnections") | |
| nodes <- df[,which(!colnames(df) %in% cols)] | |
| nodes <- unique(nodes) | |
| if (length(unique(nodes$resid)) != nrow(nodes)) { | |
| dup <- table(nodes$resid) | |
| dup <- names(dup)[dup>1] | |
| stop("# unique ids: ", length(unique(nodes$resid)), | |
| ", # unique individual rows: ", nrow(nodes), "\n", | |
| "IDs: ", paste(dup, collapse = ", ")) | |
| } | |
| pol_index <- as.matrix(nodes[,c("qe2b_Attended", "qe2b_Contributesproject", | |
| "qe2b_Contributedmember", "qe2b_Contributedlabour", "qe2b_Reportedlead", | |
| "qe2b_Reportedgov")]) | |
| nodes <- nodes[,c("i", "interviewed", "heard", "adopt", "age", "female", "income", "edu", "phone", "immigrant", | |
| "is_leader_obj", | |
| "sent", "pborrow", "plend", "picontact", | |
| "no_dk", "no_dksms", "no_phone", "no_worth", "no_way", | |
| "lon", "lat", "nodist", | |
| "efficacy_int", "efficacy_ext", | |
| "prosoc_dic", "prosoc_pub", "attend", "satisfaction", "satisfaction2")] | |
| nomiss <- nodes[!nodes$nodist,c("lon","lat")] | |
| nomiss <- geomean(nomiss) | |
| nodes$lon[nodes$nodist] <- nomiss[1,1] | |
| nodes$lat[nodes$nodist] <- nomiss[1,2] | |
| nodes$adopt[is.na(nodes$adopt)] <- F | |
| pol_index <- scale(pol_index) | |
| weights <- cov(pol_index) | |
| weights <- solve(weights) | |
| weights <- colSums(weights) | |
| pol_index <- apply(pol_index, 1, weighted.mean, w = weights) | |
| nodes$pol_index <- pol_index | |
| ties <- df[,c("resid","id","connection")] | |
| number <- regexpr("[0-9]", ties$connection) | |
| # ties$order <- ifelse(number == -1, NA, as.numeric(substr(ties$connection, number, number))) | |
| ties$type <- ifelse(number == -1, ties$connection, substr(ties$connection, 1, number-1)) | |
| ties$connection <- NULL | |
| colnames(ties) <- c("i", "j", "type") | |
| ties$type[ties$type == "member"] <- "family" | |
| ties <- ties[ties$i != ties$j,] | |
| ties <- ties[!duplicated(ties),] | |
| # add in non-interviewed nodes | |
| missing <- unique(ties$j[!ties$j %in% nodes$i]) | |
| nodes <- rbind(nodes, | |
| data.frame(i = missing, | |
| interviewed = F, | |
| heard = NA, | |
| adopt = NA, | |
| age = NA, | |
| female = NA, | |
| income = NA, | |
| edu = NA, | |
| phone = NA, | |
| immigrant = NA, | |
| is_leader_obj = NA, | |
| lat = NA, | |
| lon = NA, | |
| nodist = NA, | |
| efficacy_int = NA, | |
| efficacy_ext = NA, | |
| pol_index = NA, | |
| prosoc_dic = NA, | |
| prosoc_pub = NA, | |
| attend = NA, | |
| satisfaction = NA, | |
| satisfaction2 = NA, | |
| sent = NA, pborrow = NA, plend = NA, picontact = NA, | |
| no_dk = NA, no_dksms = NA, no_phone = NA, no_worth = NA, no_way = NA), | |
| stringsAsFactors = F) | |
| leaders <- unique(ties$j[ties$type == "Leader"]) | |
| # nodes$is_leader <- nodes$i %in% leaders | |
| return(list(nodes = nodes, | |
| ties = ties)) | |
| } | |
| getStatistics <- function(g) { | |
| comp_g <- components(g) | |
| g_large <- groups(comp_g) | |
| # g_large <- induced.subgraph(g, g_large[[which.max(comp_g$csize)]]) | |
| if(g$etype %in% c("family","friend","solver","lender","union")) { | |
| graph_level <- data.frame(village = g$village, | |
| etype = g$etype, | |
| n_nodes = vcount(g), | |
| n_ties = ecount(g), | |
| diameter = diameter(g), | |
| mean_deg = mean(degree(g)), | |
| mean_deg_in = ifelse(is.directed(g), mean(degree(g, mode = "in")), NA), | |
| mean_deg_out = ifelse(is.directed(g), mean(degree(g, mode = "out")), NA), | |
| density = graph.density(g), | |
| mean_dist = mean_distance(g), | |
| clustering_coef = transitivity(g, type = "global"), | |
| n_ntrivial_comp = length(comp_g$csize[comp_g$csize > 1]), | |
| n_lcomp = max(comp_g$csize), | |
| pct_lcomp = max(comp_g$csize)/vcount(g), | |
| n_isolates = length(degree(g)[degree(g)==0]), | |
| pct_isolates = length(degree(g)[degree(g)==0])/vcount(g), | |
| reciprocity = ifelse(is.directed(g), reciprocity(g), NA), | |
| stringsAsFactors = F) | |
| node_level <- data.frame(village = g$village, | |
| etype = g$etype, | |
| i = V(g)$name, | |
| degree = degree(g), | |
| degree_in = ifelse(is.directed(g), degree(g, mode = "in"), NA), | |
| degree_out = ifelse(is.directed(g), degree(g, mode = "out"), NA), | |
| clustering_coef = transitivity(g, type = "local"), | |
| between = centr_betw(g)$res, | |
| close = centr_clo(g)$res, | |
| eigen = centr_eigen(g)$vector, | |
| stringsAsFactors = F) | |
| } else if(g$etype == "Leader") { | |
| graph_level <- data.frame(village = g$village, | |
| etype = g$etype, | |
| n_nodes = vcount(g), | |
| n_ties = ecount(g), | |
| n_ntrivial_comp = length(comp_g$csize[comp_g$csize > 1]), | |
| n_lcomp = max(comp_g$csize), | |
| pct_lcomp = max(comp_g$csize)/vcount(g), | |
| n_isolates = length(degree(g)[degree(g,mode="all")==0]), | |
| pct_isolates = length(degree(g)[degree(g,mode="all")==0])/(vcount(g)-length(comp_g$csize[comp_g$csize > 1]))) | |
| node_level <- NULL | |
| } else { | |
| graph_level <- NULL | |
| node_level <- NULL | |
| } | |
| return(list(graph_level = graph_level, | |
| node_level = node_level)) | |
| } | |
| processVillage <- function(df, village) { | |
| df <- df[df$village_rec == village,] | |
| df <- cleanDf(df) | |
| networks <- makeNetworks(df$nodes, df$ties, village) | |
| stats_construct <- networks$stats_construct | |
| networks <- networks$networks | |
| etypes <- names(networks) | |
| stats <- lapply(networks, getStatistics) | |
| stats_lead <- stats[[which(etypes == "Leader")]]$graph_level | |
| rownames(stats_lead) <- NULL | |
| stats_graph <- lapply(stats[etypes != "Leader"], function(l) l$graph_level) | |
| stats_graph <- do.call(rbind, stats_graph) | |
| stats_graph <- merge(stats_graph, stats_construct) | |
| stats_graph$pct_no_interview <- stats_graph$n_no_interview / (stats_graph$n_no_interview + stats_graph$n_nodes) | |
| rownames(stats_graph) <- NULL | |
| stats_node <- lapply(stats[etypes != "Leader"], function(l) l$node_level) | |
| stats_node <- do.call(rbind, stats_node) | |
| rownames(stats_node) <- NULL | |
| return(list(village = village, | |
| networks = networks, | |
| stats_graph = stats_graph, | |
| stats_node = stats_node, | |
| stats_lead = stats_lead)) | |
| } | |
| processVillages <- function(df) { | |
| villages <- unique(d$village_rec) | |
| v <- lapply(villages, function(v) tryCatch(processVillage(df,v), | |
| error = function(m) return(m))) | |
| names(v) <- villages | |
| return(v) | |
| } | |
| prepareVillage <- function(village) { | |
| if(is.null(village)) return(NULL) | |
| n <- list(union = list(as_adjacency_matrix(village$networks$union, sparse = F)), | |
| solver = list(as_adjacency_matrix(village$networks$solver, sparse = F)), | |
| lender = list(as_adjacency_matrix(village$networks$lender, sparse = F)), | |
| family = list(as_adjacency_matrix(village$networks$family, sparse = F)), | |
| friend = list(as_adjacency_matrix(village$networks$friend, sparse = F)), | |
| leader = list(as_adjacency_matrix(village$networks$Leader, sparse = F)), | |
| speak = list(as_adjacency_matrix(village$networks$speak, sparse = F)), | |
| strong_ties = list(as_adjacency_matrix(village$networks$strong_ties, sparse = F)), | |
| weak_ties = list(as_adjacency_matrix(village$networks$weak_ties, sparse = F)), | |
| leader_obj = list(as_adjacency_matrix(village$networks$leader_obj, sparse = F)), | |
| geo = list(as_adjacency_matrix(village$networks$geo, sparse = F, attr = "weight")), | |
| df = as_data_frame(village$networks$union, what = "vertices")) | |
| n$df$heard <- as.numeric(n$df$heard) | |
| n$df$adopt <- as.numeric(n$df$adopt) | |
| n$df$is_leader <- degree(village$networks$Leader, mode = "in") > 0 | |
| n$heard <- data.frame(t1 = n$df$heard, row.names = rownames(n$df)) | |
| n$adopt <- data.frame(t1 = n$df$adopt, row.names = rownames(n$df)) | |
| return(n) | |
| } | |
| prepare <- function(villages) { | |
| out <- lapply(villages, prepareVillage) | |
| names(out) <- names(villages) | |
| return(out) | |
| } | |
| fit <- function(y, formula.glm, formula.tnam, data, sub = NULL, rename = NULL, ...) { | |
| if(!is.null(sub)) data <- data[sub] | |
| df.glm <- lapply(data, function(l) { | |
| df.glm <- model.frame(formula.glm, l$df) | |
| for (i in 1:length(colnames(df.glm))) { | |
| if(is.logical(df.glm[,i])) df.glm[,i] <- as.numeric(df.glm[,i]) | |
| } | |
| df.glm$node <- rownames(df.glm) | |
| return(df.glm) | |
| }) | |
| df.glm <- do.call(rbind, df.glm) | |
| if(!is.null(formula.tnam)) { | |
| df.tnam <- lapply(data, function(n) { | |
| makeCol <- function(v) { | |
| out <- data.frame(t1 = v) | |
| rownames(out) <- rownames(n$df) | |
| out | |
| } | |
| env <- new.env() | |
| isActive <- as.integer(n$df$pol_index > 0.1625646) | |
| assign("uni", n$union, envir = env) | |
| assign("solver", n$solver, envir = env) | |
| assign("lender", n$lender, envir = env) | |
| assign("family", n$family, envir = env) | |
| assign("friend", n$friend, envir = env) | |
| assign("leader", n$leader, envir = env) | |
| assign("leader_obj", n$leader_obj, envir = env) | |
| assign("is_leader", makeCol(n$df$is_leader), envir = env) | |
| assign("is_leader_obj", makeCol(n$df$is_leader_obj), envir = env) | |
| assign("is_peer_obj", makeCol(1-n$df$is_leader_obj), envir = env) | |
| assign("is_active", makeCol(isActive), envir = env) | |
| assign("is_inactive", makeCol(1-isActive), envir = env) | |
| assign("geo", n$geo, envir = env) | |
| assign("heard", n$heard, envir = env) | |
| assign("adopt", n$adopt, envir = env) | |
| assign("speak", n$speak, envir = env) | |
| satisfaction <- data.frame(t1 = n$df$satisfaction, row.names = n$df$name) | |
| satisfaction2 <- data.frame(t1 = n$df$satisfaction2, row.names = n$df$name) | |
| assign("satisfaction", satisfaction, envir = env) | |
| assign("satisfaction2", satisfaction2, envir = env) | |
| assign("weak_ties", n$weak_ties, envir = env) | |
| assign("strong_ties", n$strong_ties, envir = env) | |
| assign("leaderAdopt", makeCol(n$df$is_leader_obj * n$df$adopt)) | |
| assign("peerAdopt", makeCol((1-n$df$is_leader_obj) * n$df$adopt)) | |
| assign("activeAdopt", makeCol(isActive * n$df$adopt)) | |
| assign("inactiveAdopt", makeCol((1-isActive) * n$df$adopt)) | |
| environment(tnamdata) <- env | |
| df.tnam <- tnamdata(formula.tnam) | |
| df.tnam <- df.tnam[,-(1:2)] | |
| return(df.tnam) | |
| }) | |
| cols <- sapply(df.tnam, colnames) | |
| cols <- apply(cols, 1, function(i) rev(sort(unique(i)))[1]) | |
| df.tnam <- lapply(df.tnam, function(df) { | |
| colnames(df) <- cols | |
| return(df) | |
| }) | |
| df.tnam <- do.call(rbind, df.tnam) | |
| if(!is.null(rename)) colnames(df.tnam)[-1] <- rename | |
| df <- merge(df.glm, df.tnam) | |
| } else { | |
| df <- df.glm | |
| } | |
| nodes <- df$node | |
| df$node <- NULL | |
| formula <- as.formula(paste0(y, "~.")) | |
| mod <- glm(formula, data = df, ...) | |
| # mod <- lm(formula, data = df, ...) | |
| return(list(mod = mod, | |
| nodes = nodes, | |
| formula.glm = formula.glm, | |
| formula.tnam = formula.tnam)) | |
| } | |
| simIter <- function(mod, y, offset, coef, mnet, mdist) { | |
| adopt <- data.frame(t1 = y) | |
| env <- new.env() | |
| assign("uni", mnet, envir = env) | |
| assign("geo", mdist, envir = env) | |
| assign("adopt", adopt, envir = env) | |
| environment(tnamdata) <- env | |
| df.tnam <- tnamdata(mod$formula.tnam) | |
| df.tnam <- df.tnam[,-(1:2)] | |
| df.tnam$node <- NULL | |
| df.tnam <- as.matrix(df.tnam) | |
| pr <- as.numeric(1/(1+exp(-(offset + df.tnam %*% coef)))) | |
| y.new <- sapply(pr[!as.logical(y)], rbinom, size = 1, n = 1) | |
| y[!as.logical(y)] <- y.new | |
| return(list(y = y, pr = pr)) | |
| } | |
| simulate <- function(mod, offset, coef, mnet, mdist, i = NULL, maxit = 150, verbose = F, seeds = NULL) { | |
| nobs <- nrow(mnet) | |
| y <- rep(0,nobs) | |
| if(!is.null(seeds)) y <- seeds | |
| if(is.null(i)) i <- 1:nobs | |
| rownames(mnet) <- 1:nobs | |
| rownames(mdist) <- 1:nobs | |
| output <- data.frame(t = 0, | |
| i = i, | |
| y = y, | |
| pr = 0) | |
| t <- 0 | |
| while(sum(y) < nobs & t < maxit) { | |
| t <- t+1 | |
| it <- simIter(mod, y, offset, coef, mnet, mdist) | |
| output <- rbind(output, | |
| data.frame(t = t, | |
| i = i, | |
| y = it$y, | |
| pr = it$pr)) | |
| y <- it$y | |
| if (verbose) message("t = ", t, | |
| "; pct = ", round(sum(y)/nobs), | |
| "; Pr(adopt) = ", round(mean(it$pr[it$y == 0]), 4)) | |
| } | |
| return(output) | |
| } | |
| bootPredict <- function(formula, coefs, vcov, newdata, n) { | |
| boot <- mvrnorm(n, coefs, vcov) | |
| df <- model.matrix(formula, data = newdata) | |
| predict <- df %*% t(boot) | |
| predict <- 1/(1+exp(-predict)) | |
| return(predict) | |
| } | |
| toOffset <- function(x) -log(1/x - 1) | |
| adjust <- function(g1, g2) { | |
| if(vcount(g1) == vcount(g2)) { | |
| return(NULL) | |
| } else if (vcount(g1) < vcount(g2)) { | |
| gsmall <- g1 | |
| glarge <- g2 | |
| } else { | |
| gsmall <- g2 | |
| glarge <- g1 | |
| } | |
| diff <- vcount(glarge) - vcount(gsmall) | |
| deg <- table(degree(glarge)) | |
| min.sat <- as.numeric(names(deg)[max(which(cumsum(deg) <= diff))]) | |
| max.sat <- as.numeric(names(deg)[min(which(cumsum(deg) > diff))]) | |
| select <- V(glarge)[degree(glarge) <= min.sat] | |
| if (max.sat > min.sat) { | |
| select <- c(select, | |
| sample(V(glarge)[degree(glarge) == max.sat], diff - length(select))) | |
| } | |
| glarge <- glarge - select | |
| return(glarge) | |
| } | |
| getSeeds <- function(g, n, strat) { | |
| if (strat == "base") { | |
| y <- as.numeric(V(g) %in% sample(V(g),n)) | |
| } else if (strat == "cty") { | |
| y0 <- sample(V(g),1) | |
| y <- y0 | |
| sizes <- sapply(1:5, neighborhood.size, graph = g, nodes = y0) | |
| max.sat <- min(which(sizes > n)) | |
| min.sat <- max(which(sizes <= n)) | |
| if(min.sat != -Inf) y <- unique(c(y, ego(g,min.sat,y0)[[1]])) | |
| if (max.sat > min.sat) { | |
| target <- ego(g, max.sat, y0)[[1]] | |
| target <- target[!target %in% y] | |
| y <- c(y, sample(target, n-length(y))) | |
| y <- as.numeric(V(g) %in% y) | |
| } | |
| } else { | |
| weight <- degree(g, V(g))/sum(degree(g, V(g))) | |
| y <- as.numeric(V(g) %in% sample(V(g),n,prob = weight)) | |
| } | |
| return(y) | |
| } | |
| aggregateSims <- function(sims) { | |
| maxt <- max(sapply(sims, function(sim) sapply(sim, function(df) max(df$t)))) | |
| sims <- lapply(sims, function(sim) lapply(sim, function(df) { | |
| df <- aggregate(y ~ t + sim + type, df, mean) | |
| sim <- df$sim[1] | |
| type <- df$type[1] | |
| df <- merge(df, data.frame(t=1:maxt), all = T) | |
| df[is.na(df)] <- 1 | |
| df$sim <- sim | |
| df$type <- type | |
| return(df) | |
| })) | |
| sims <- lapply(sims, function(sim) do.call(rbind, sim)) | |
| sims <- do.call(rbind, sims) | |
| sims$sim <- paste0(sims$sim, sims$type) | |
| sims$sim <- match(sims$sim, unique(sims$sim)) | |
| return(sims) | |
| } | |
| topUp <- function(g, ediff, strat, cut = .1) { | |
| if (strat == "random") { | |
| select <- length(g[(!g) & lower.tri(g)]) | |
| select <- sample.int(n = select, size = ediff) | |
| g[(!g) & lower.tri(g)][select] <- 1 | |
| g <- t(g) | |
| g[(!g) & lower.tri(g)][select] <- 1 | |
| } else { | |
| diag(g) <- 1 | |
| n <- nrow(g) | |
| for (k in 1:ediff) { | |
| deg <- colSums(g) | |
| if (strat == "low") { | |
| ccut <- quantile(deg, cut) | |
| select <- which(deg <= ccut & deg < n) | |
| } else { | |
| ccut <- quantile(deg, 1-cut) | |
| select <- which(deg >= ccut & deg < n) | |
| } | |
| if (length(select) == 0) { | |
| stop("target is fully connected") | |
| } else if (length(select) == 1) { | |
| i <- select | |
| } else { | |
| i <- i <- sample(select, 1) | |
| } | |
| j <- sample(which(!g[i,]), 1) | |
| if (length(j) > 1) j <- sample(j, 1) | |
| g[i,j] <- g[j,i] <- 1 | |
| } | |
| diag(g) <- 0 | |
| } | |
| return(g) | |
| } | |
| fit2 <- function(formula.glm.hear, formula.tnam.hear = NULL, | |
| formula.glm.adopt, formula.tnam.adopt = NULL, | |
| rename.hear = NULL, rename.adopt = NULL, | |
| data, bayes = F, clogit = F, ...) { | |
| # if(!is.null(sub)) data <- data[sub] | |
| df.glm.hear <- lapply(data, function(l) { | |
| df.glm <- model.frame(formula.glm.hear, l$df) | |
| for (i in 1:length(colnames(df.glm))) { | |
| if(is.logical(df.glm[,i])) df.glm[,i] <- as.numeric(df.glm[,i]) | |
| } | |
| df.glm$node <- rownames(df.glm) | |
| return(df.glm) | |
| }) | |
| df.glm.hear <- do.call(rbind, df.glm.hear) | |
| df.glm.adopt <- lapply(data, function(l) { | |
| df.glm <- model.frame(formula.glm.adopt, l$df) | |
| for (i in 1:length(colnames(df.glm))) { | |
| if(is.logical(df.glm[,i])) df.glm[,i] <- as.numeric(df.glm[,i]) | |
| } | |
| df.glm$node <- rownames(df.glm) | |
| return(df.glm) | |
| }) | |
| df.glm.adopt <- do.call(rbind, df.glm.adopt) | |
| if(!is.null(formula.tnam.hear)) { | |
| df.tnam.hear <- lapply(data, function(n) { | |
| env <- new.env() | |
| assign("uni", n$union, envir = env) | |
| assign("solver", n$solver, envir = env) | |
| assign("lender", n$lender, envir = env) | |
| assign("family", n$family, envir = env) | |
| assign("friend", n$friend, envir = env) | |
| assign("leader", n$leader, envir = env) | |
| assign("leader_obj", n$leader_obj, envir = env) | |
| assign("geo", n$geo, envir = env) | |
| assign("heard", n$heard, envir = env) | |
| assign("adopt", n$adopt, envir = env) | |
| assign("is_leader", n$df$is_leader, envir = env) | |
| assign("is_leader_obj", n$df$is_leader_obj, envir = env) | |
| assign("weak_ties", n$weak_ties, envir = env) | |
| assign("strong_ties", n$strong_ties, envir = env) | |
| assign("speak", n$speak, envir = env) | |
| satisfaction <- data.frame(t1 = n$df$satisfaction, row.names = n$df$name) | |
| satisfaction2 <- data.frame(t1 = n$df$satisfaction2, row.names = n$df$name) | |
| assign("satisfaction", satisfaction, envir = env) | |
| assign("satisfaction2", satisfaction2, envir = env) | |
| environment(tnamdata) <- env | |
| df.tnam <- tnamdata(formula.tnam.hear) | |
| df.tnam <- df.tnam[,-(1:2)] | |
| return(df.tnam) | |
| }) | |
| cols <- sapply(df.tnam.hear, colnames) | |
| cols <- apply(cols, 1, function(i) rev(sort(unique(i)))[1]) | |
| df.tnam.hear <- lapply(df.tnam.hear, function(df) { | |
| colnames(df) <- cols | |
| return(df) | |
| }) | |
| df.tnam.hear <- do.call(rbind, df.tnam.hear) | |
| if(!is.null(rename.hear)) colnames(df.tnam.hear)[-1] <- rename.hear | |
| df.hear <- merge(df.glm.hear, df.tnam.hear) | |
| df.hear <- df.hear[, | |
| c(colnames(df.tnam.hear)[-which(colnames(df.tnam.hear) == "node")], | |
| colnames(df.glm.hear))] | |
| } else { | |
| df.hear <- df.glm.hear | |
| } | |
| if(!is.null(formula.tnam.adopt)) { | |
| df.tnam.adopt <- lapply(data, function(n) { | |
| env <- new.env() | |
| assign("uni", n$union, envir = env) | |
| assign("solver", n$solver, envir = env) | |
| assign("lender", n$lender, envir = env) | |
| assign("family", n$family, envir = env) | |
| assign("friend", n$friend, envir = env) | |
| assign("leader", n$leader, envir = env) | |
| assign("leader_obj", n$leader_obj, envir = env) | |
| assign("is_leader", n$df$is_leader, envir = env) | |
| assign("is_leader_obj", n$df$is_leader_obj, envir = env) | |
| assign("geo", n$geo, envir = env) | |
| assign("heard", n$heard, envir = env) | |
| assign("adopt", n$adopt, envir = env) | |
| assign("speak", n$speak, envir = env) | |
| satisfaction <- data.frame(t1 = n$df$satisfaction, row.names = n$df$name) | |
| satisfaction2 <- data.frame(t1 = n$df$satisfaction2, row.names = n$df$name) | |
| assign("satisfaction", satisfaction, envir = env) | |
| assign("satisfaction2", satisfaction2, envir = env) | |
| assign("weak_ties", n$weak_ties, envir = env) | |
| assign("strong_ties", n$strong_ties, envir = env) | |
| environment(tnamdata) <- env | |
| df.tnam <- tnamdata(formula.tnam.adopt) | |
| df.tnam <- df.tnam[,-(1:2)] | |
| return(df.tnam) | |
| }) | |
| cols <- sapply(df.tnam.adopt, colnames) | |
| cols <- apply(cols, 1, function(i) rev(sort(unique(i)))[1]) | |
| df.tnam.adopt <- lapply(df.tnam.adopt, function(df) { | |
| colnames(df) <- cols | |
| return(df) | |
| }) | |
| df.tnam.adopt <- do.call(rbind, df.tnam.adopt) | |
| if(!is.null(rename.adopt)) colnames(df.tnam.adopt)[-1] <- rename.adopt | |
| df.adopt <- merge(df.glm.adopt, df.tnam.adopt) | |
| df.adopt <- df.adopt[, | |
| c(colnames(df.tnam.adopt)[-which(colnames(df.tnam.adopt) == "node")], | |
| colnames(df.glm.adopt))] | |
| } else { | |
| df.adopt <- df.glm.adopt | |
| } | |
| # nodes <- intersect(df.hear$node, df.adopt$node) | |
| # df.hear <- df.hear[df.hear$node %in% nodes,] | |
| # df.adopt <- df.adopt[df.adopt$node %in% df$nodes,] | |
| df.adopt.full <- df.adopt[df.adopt$node %in% df.hear$node,] | |
| df.adopt <- df.adopt[df.adopt$node %in% df.hear$node[df.hear$hear == 1],] | |
| nodes <- df.hear$node | |
| nodesa <- df.adopt$node | |
| df.hear$node <- NULL | |
| df.adopt$node <- NULL | |
| df.adopt.full$node <- NULL | |
| if (bayes) { | |
| mod.hear <- bayesglm(heard ~ ., data = df.hear, ...) | |
| mod.adopt <- bayesglm(adopt ~ ., data = df.adopt, ...) | |
| } else if (clogit) { | |
| mod.hear <- clogit(heard ~ . - village + strata(village), data = df.hear, model = TRUE, y = TRUE, ...) | |
| mod.adopt <- clogit(adopt ~ . - village + strata(village), data = df.adopt, model = TRUE, y = TRUE, ...) | |
| mod.hear$AIC <- AIC(mod.hear) | |
| mod.adopt$AIC <- AIC(mod.adopt) | |
| } else { | |
| mod.hear <- glm(heard ~ ., data = df.hear, ...) | |
| mod.adopt <- glm(adopt ~ ., data = df.adopt, ...) | |
| } | |
| obj <- list(nodes = nodes, | |
| nodesa = nodesa, | |
| mod.hear = mod.hear, | |
| mod.adopt = mod.adopt, | |
| df.adopt.full = df.adopt.full, | |
| formula.glm.hear = formula.glm.hear, | |
| formula.glm.adopt = formula.glm.adopt, | |
| formula.tnam.hear = formula.tnam.hear, | |
| formula.tnam.adopt = formula.tnam.adopt) | |
| if(clogit) obj$loglik <- mod.hear$loglik[2] + mod.adopt$loglik[2] | |
| obj$AIC <- 2 * (length(coef(obj$mod.hear)) + length(coef(obj$mod.adopt)) - obj$loglik) | |
| class(obj) <- "mfit2" | |
| return(obj) | |
| } | |
| predict.mfit2 <- function(obj, dfHear = NULL, dfAdopt = NULL) { | |
| if(is.null(dfHear) || is.null(dfAdopt)) { | |
| return(predict(obj$mod.hear, type = "response") * | |
| predict(obj$mod.adopt, newdata = obj$df.adopt.full, type = "response")) | |
| } | |
| return(predict(obj$mod.hear, newdata = dfHear, type = "response") * | |
| predict(obj$mod.adopt, newdata = dfAdopt, type = "response")) | |
| } | |
| summary.mfit2 <- function(obj) summary(obj$mod.adopt) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment