2015-01-08 2 views
0

Я отчаянно пытался создать матрицу смежности из набора данных (у меня есть эквивалент в R), но я не могу это сделать в SAS (знание начинающих). Было бы очень полезно, если бы вы могли помочь мне в этом. Также, любезно предположите, возможны ли эти и разреженные матрицы в SAS (без SNA)?Создание матрицы смежности из набора данных в SAS

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

Я считаю, объединение всего уникального идентификатора и 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 выглядит

Сейчас я требуется матрица смежности, которая назначает 1 в позиции, когда есть связь между Test2 (1 00 и id_o (300) из исходного набора данных). Рассмотрим Test2 как i, и есть 1 в соответствующем j.

Таким образом, матрица смежности будет выглядеть

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

У вас есть лицензия SAS/IML? Технически это единственный способ в SAS иметь «матрицу» (IML = язык интерактивной матрицы). В противном случае вы работаете с набором данных (что эквивалентно кадру данных R, например). Не то, чтобы вы не могли эффективно представлять матрицу в этом формате, но у IML есть намного лучшие инструменты обработки матриц (и они чувствуют себя намного больше как R, если это то, к чему вы привыкли). – Joe

+0

Да, у меня есть лицензионная версия SAS, но здесь я имею дело с матрицами огромных размеров. Любая идея, как SAS справляется с этим? или наоборот, можете ли вы предложить, как моделировать список смежности в SAS? – Rads

+0

«Лицензионная версия SAS» здесь не является конкретной: IML - это модуль, за который вы должны платить дополнительно, поэтому у вас может быть или не быть этого. – Joe

ответ

1

Вот один из способов, расширения вашего текущего кода. Сначала вам нужно создать пустую таблицу со всеми параметрами, а затем заполнить 1/0. Второй транспонирует таблицу в желаемый формат. Возможно, есть способ сделать это с помощью дистанции 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; 
Смежные вопросы