我打算进行网络分析,我需要以一种可以使用社区贡献命令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
最终,当一个1
连接到另一个idb
时,我想有一个值为idb
的矩阵,如果没有连接,则为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中做到这一点?
答案 0 :(得分:1)
这是使用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 |
+------------------------------------------------------------------------+