基于共享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
相关产品推荐
相关产品推荐

