如何基于指定节点属性计算政治网络的模块化分数?
基于指定节点属性计算网络模块化的方法
要基于已有的partisanship节点属性计算模块化,分两种核心场景处理:
1. 计算整个网络基于党派分组的模块化(衡量党派聚类效果)
这里将党派属性直接作为预定义的社区分组,计算整个网络的模块化分数——分数越高,说明同党派节点间的修辞相似度(边权重)显著高于跨党派节点,党派群体的聚类效果越好。
实现代码:
# 将字符型党派属性转换为数值型社区归属向量 party_membership <- as.integer(factor(V(g)$partisanship)) # 计算基于党派分组的模块化(支持边权重) party_overall_mod <- modularity(g, membership = party_membership, weights = E(g)$weight) cat("整个网络基于党派的模块化分数:", party_overall_mod, "\n")
2. 分别计算民主党/共和党子图的内部模块化(衡量党派内部社区结构)
如果需要单独分析每个党派内部的社区划分效果,先提取对应子图,再用社区检测算法计算子图的模块化分数——分数越高,说明该党派内部存在更清晰的子社区结构。
实现代码:
# 提取民主党节点构成的子图 dem_subgraph <- induced_subgraph(g, v = which(V(g)$partisanship == "democrat")) # 提取共和党节点构成的子图 rep_subgraph <- induced_subgraph(g, v = which(V(g)$partisanship == "republican")) # 计算民主党子图的模块化(以Louvain算法为例,可替换为你常用的walktrap等) if (ecount(dem_subgraph) > 0) { dem_cl <- cluster_louvain(dem_subgraph, weights = E(dem_subgraph)$weight) dem_mod <- modularity(dem_cl) cat("民主党子图内部模块化分数:", dem_mod, "\n") } else { cat("民主党子图无有效边,无法计算模块化\n") } # 计算共和党子图的模块化 if (ecount(rep_subgraph) > 0) { rep_cl <- cluster_louvain(rep_subgraph, weights = E(rep_subgraph)$weight) rep_mod <- modularity(rep_cl) cat("共和党子图内部模块化分数:", rep_mod, "\n") } else { cat("共和党子图无有效边,无法计算模块化\n") }
补充说明
- 若要替换社区检测算法,只需把
cluster_louvain换成你之前用的cluster_walktrap或cluster_leading_eigen即可,参数保持一致。 - 模块化分数范围通常在[-1,1]之间,正数代表社区内部连接比随机情况更紧密,负数则相反。
内容的提问来源于stack exchange,提问作者lwe
相关产品推荐
相关产品推荐

