You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于共享IDD关联IDB:Stata构建网络邻接矩阵方法问询

如何在Stata中生成基于共享idd的邻接矩阵?

我来帮你搞定这个Stata里生成邻接矩阵的需求,刚好我对这类网络数据处理很熟悉!你的目标是:当两个idb共享至少一个idd(不管在哪个列)时,邻接矩阵对应位置为1,否则为0,同时要适配nwcommands的格式。下面是分步实现的方法,每一步我都会解释清楚:


步骤1:将宽格式数据转为长格式

首先,你的原始数据是宽格式(每个idb对应多个idd列),我们需要转成长格式,这样每个idd和对应的idb是一一对应的关系,方便后续匹配:

* 加载你的示例数据
clear
input str11 idb long(idd1 idd2 idd3)
"62014" 370490 879271 1112878
"62015" 457013 1112878 370490
"62016" 341863 1366174 533773
"62017" 879271 327069 341596
"62018" 1391443 1366174 879271
end

* 转长格式,把idd1/idd2/idd3转为行
reshape long idd, i(idb) j(seq)
drop seq  // 序列编号没用,直接删除

步骤2:生成所有idb的配对组合

我们需要得到所有可能的idb配对(包括每个idb和自己的配对,因为对角线要设为1),用交叉合并来实现:

* 先保存唯一的idb列表
preserve
keep idb
duplicates drop
tempfile idb_list
save `idb_list'
restore

* 交叉合并得到所有idb配对
cross using `idb_list'
rename idb idb1
rename idb_idb idb2
tempfile all_pairs
save `all_pairs'

步骤3:标记共享idd的idb对

接下来,我们通过joinby按idd合并数据,找到所有共享同一个idd的idb对,并标记它们:

* 回到长格式数据,按idd合并找到共享的idb对
joinby idd using `idb_list'
rename idb idb_a
rename idb_idb idb_b

* 标记共享状态,每对idb只保留一行
gen shared = 1
bysort idb_a idb_b: keep if _n == 1
tempfile shared_pairs
save `shared_pairs'

步骤4:补全所有配对的共享状态

现在我们把标记好的共享配对和所有配对合并,给没有共享idd的配对赋值0,同时确保对角线(自己和自己)的值为1:

* 合并所有配对和共享配对
use `all_pairs', clear
merge 1:1 idb1 idb2 using `shared_pairs'
replace shared = 0 if shared == .  // 没有共享的设为0
drop _merge

* 对角线强制设为1(每个idb和自己的关系)
replace shared = 1 if idb1 == idb2

步骤5:转换为邻接矩阵格式

最后一步,把数据转成宽格式,就得到你想要的邻接矩阵了,同时调整变量名和顺序匹配你的示例:

* 转宽格式生成邻接矩阵
reshape wide shared, i(idb1) j(idb2) string

* 去掉变量名的shared前缀,让列名直接是idb
rename shared* *

* 调整变量顺序,和示例输出一致
order idb1 62014 62015 62016 62017 62018
rename idb1 idb

运行完这些代码后,你得到的结果就和你给出的示例完全一致了,这个格式可以直接用于nwcommands的后续网络分析。


内容的提问来源于stack exchange,提问作者Colin Tissen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:14:42