我正在使用 sna for R 的经纪(g,属性)函数来查找我的网络的 Gould Fernandez 经纪角色。然后我想找到这个经纪角色的具体三合会,以进一步分析不同自我之间的关系。
有人知道我可以使用哪个公式来识别这个特定的三元组吗?
可复制样本
g2 <- make_graph(~ A --+ B:D, B --+ D:F, C--+B , D--+A:B:F:E, E--+ D, F--+ A:E:G, G--+ F)
type<-c("one","two","three","one","two","three","one")
vertex_attr(g2,"type")<-type
g2_N<-intergraph::asNetwork(g2)
brokerage_roles<-brokerage(g2_N,type)
brokerage_roles$raw.nli
我收到以下经纪角色输出
w_I w_O b_IO b_OI b_O t
A 0 0 2 0 0 2
B 0 1 2 0 0 3
D 0 1 3 2 1 7
F 1 0 1 3 1 6
C 0 0 0 0 0 0
E 0 0 0 1 0 1
G 0 0 0 0 0 0
我想找到一种方法来找出例如在经纪角色节点普查中找到的 2 b_01 三元组中哪些特定的变更节点 A 正在经纪以及它们具有什么类型(节点属性)。
示例网络中很容易识别,但我的实际数据集包含 125 个节点。
提前感谢您的帮助!
潜在方法
我尝试了此处描述的潜在方法来查找所有可能的三合会,根据三合会普查术语对它们进行分类,然后筛选开放的三合会以开始识别经纪机会。
然而,结果似乎与经纪角色分析不一致,因此该方法是错误的。
node_triad_census(g2_N)
triads <- combn(1:network.size(g2_N),3, simplify = F) # all potential triad combinations
triad_census_test <- lapply(1:length(triads),
function(x) triad.classify(g,tri=triads[[x]])) #create data frame with all possible triads
triads <- data.frame(matrix(unlist(triads), nrow=length(triads), byrow=T),
triad = unlist(triad_census_test)) #give classification to each triad
open_triads <- triads[which(triads$triad == "021D" | # subset of triads
triads$triad == "021U" |
triads$triad == "021C" |
triads$triad == "111D" |
triads$triad == "111U" |
triads$triad == "201"),]
我不知道答案,但请注意,经纪函数调用了一个名为brokerage_R 的C 函数(请参阅源代码此处)。通过检查此函数以了解幕后发生的情况,您可能会取得一些进展。我通过修改经纪函数以仅输出 C 代码的原始结果来检查该函数的输出:
rawbrokerage <- function (g, cl)
{
g <- as.edgelist.sna(g)
if (is.list(g))
return(lapply(g, brokerage, cl))
N <- attr(g, "n")
m <- NROW(g)
classes <- unique(cl)
icl <- match(cl, classes)
br <- matrix(0, N, 5)
br <- .C("brokerage_R", as.double(g), as.integer(N),
as.integer(m), as.integer(icl), brok = as.double(br),
PACKAGE = "sna", NAOK = TRUE)
return(br)
}
但是我没有发现这很有启发性,这就是为什么检查 C 代码可能会有所帮助。我在 SNA 源代码中找不到 C 代码,但它一定在某个地方。该方法基于最短路径,而不是三元组普查,因此即使它仅限于长度为 2 的路径,我也不确定您是否可以重现三元组普查的结果。