Stata 基于行中的值连接ID
我计划做一个网络分析,我需要以这样一种方式构建我的数据,即我可以使用社区贡献的命令Stata 基于行中的值连接ID,stata,Stata,我计划做一个网络分析,我需要以这样一种方式构建我的数据,即我可以使用社区贡献的命令nwcommands 以下是数据示例: * Example generated by -dataex-. To install: ssc install dataex clear input str11 idb long(idd1 idd2 idd3) "62014" 370490 879271 1112878 "62015" 457013 1112878 370490 "62016" 341863 13
nwcommands
以下是数据示例:
* Example generated by -dataex-. To install: ssc install dataex
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
最后,当一个idb
连接到另一个idb
时,我希望有一个值为1
的矩阵,如果不是0
。只要两个idb
至少共享一个idd
(不必在同一idd
列中),就会有一个连接
示例输出:
62014 62015 62016 62017 62018
62014 1 1 0 1 1
62015 1 1 0 0 0
62016 0 0 1 0 1
62017 1 0 0 1 1
62018 1 0 1 1 1
在Stata中如何实现这一点?在Stata的矩阵编程语言mata中,有一种实现这一点的方法:
/* Prepare data */
putmata A = (idd*), replace
/* Define mata functions */
mata:
function foo2(b, c)
{
res = 0
for (i = 1; i <= cols(b); i++) {
for (j = 1; j <= cols(c); j++) {
if (b[i] == c[j]) res = 1
}
}
return(res)
}
function foo1(a)
{
M = J(rows(a), rows(a), 0)
for (i = 1; i <= rows(a); i++) {
for (j = 1; j <= rows(a); j++) {
k = foo2(a[i,.], a[j,.])
if (k == 1) M[i, j] = 1
}
}
return(M)
}
end
/* Execute and get results */
mata: B = foo1(A)
getmata (idb*) = B
list
+------------------------------------------------------------------------+
| idb idd1 idd2 idd3 idb1 idb2 idb3 idb4 idb5 |
|------------------------------------------------------------------------|
1. | 62014 370490 879271 1112878 1 1 0 1 1 |
2. | 62015 457013 1112878 370490 1 1 0 0 0 |
3. | 62016 341863 1366174 533773 0 0 1 0 1 |
4. | 62017 879271 327069 341596 1 0 0 1 1 |
5. | 62018 1391443 1366174 879271 1 0 1 1 1 |
+------------------------------------------------------------------------+