【问题标题】:Create adjacency matrix from dataset in SAS从SAS中的数据集创建邻接矩阵
【发布时间】:2015-01-08 19:02:59
【问题描述】:

我一直在拼命地尝试从数据集创建邻接矩阵(我在 R 中有等价物),但在 SAS 中无法这样做(初学者熟练程度)。如果你能帮我解决这个问题,那将非常有帮助。另外,请建议在 SAS(没有 SNA)中是否可以使用此矩阵和稀疏矩阵?

data test;
input id id_o;
cards;
100 300
600 400
200 300
100 200
;
run;

我找到所有唯一 id 和 id_o 的并集来创建一个列表

proc sql;
create table test2 as
select distinct id from
  (select id as id from test
   union all
   select id_o as id from test);
quit;

Test2 看起来像

100 600 200 300 400

现在我想要一个邻接矩阵,它在 Test2 (原始数据集的 100 和 id_o (300) )之间存在链接时在某个位置分配 1。将 Test2 视为 i,在对应的 j 处有 1。

所以,邻接矩阵看起来像

    100 600 200 300 400
100  0   0   1   1  0
600  0   0   0   0  1
200  0   0   0   1  0
300  0   0   0   0  0
400  0   0   0   0  0

【问题讨论】:

  • 您有 SAS/IML 许可吗?从技术上讲,这是 SAS 中拥有“矩阵”(IML=交互式矩阵语言)的唯一方法。否则,您正在使用数据集(相当于 R 的数据框,有点)。并不是说您不能以这种格式有效地表示矩阵,而是 IML 具有更好的矩阵处理工具(如果您习惯使用这种工具,感觉更像 R)。
  • 是的,我有 SAS 的许可版本,但在这里我处理的是大尺寸矩阵。知道 SAS 是如何处理它的吗?反之亦然,您能否建议如何在 SAS 中建模邻接表?
  • “SAS 的许可版本”在这里没有具体说明:IML 是一个您必须支付额外费用的模块,因此您可能拥有也可能没有。
  • 我尝试过使用 IML 命令并且它们有效。虽然下面建议的将边缘列表转换为邻接矩阵的策略是正确的,但它不是处理 1,000,000 边缘列表的最佳方法,因为它涉及笛卡尔积。你能提供一些改进它的方法吗?

标签: sql sas


【解决方案1】:

这是一种扩展您当前代码的方法。首先,您需要创建一个包含所有选项的空表,然后填写 1/0。其次将表格转置为所需的格式。 可能有一种方法可以通过 proc distance 或其他一些 proc 来做到这一点,但我不确定。

*get all the 1's for matrix;
proc freq data=test;
table id*id_o/sparse out=dist1;
run;

*Fill into matrix with all options;
proc sql;
create table test3 as
select a.id, b.id as id_o, coalesce(c.count, 0) as count
from test2 as a
cross join test2 as b
left join dist1 as c
on a.id=c.id
and b.id=c.id_o
order by a.id, b.id;
quit;

*Transpose to desired format.
proc transpose data=test3 out=test4 prefix=id_;
by id;
id id_o;
var count;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多