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 |
     +------------------------------------------------------------------------+