2012-10-14 49 views
2

我试图在SAS从两个型号不同的调整输出的比值比合并:如何为sas中的唯一变量创建索引?

即:

ods output oddsratios=adjustedOR1(rename=(OddsRatioEst=OR1); 
proc logistic data=dataname; 
     model y= b d c a e; run; 

ods output oddsratios=adjustedOR2 (rename=(OddsRatioEst=OR2); 
proc logistic data=dataname; 
     model y= b d c; run; 

PROC排序.....

data Oddsratios (keep=Effect OR1 OR2); 
merge adjustedOR1 adjustedOR2; by effect; run; 

问题是,如果我通过Effect变量进行排序和合并,则会失去将解释变量放入模型中的顺序。

有没有办法根据我把它放入模型中的顺序为变量分配一个索引,以便最后的表具有以下顺序的效果列:b d c a e?

感谢您的帮助

回答

1

我建议用你想要的排序顺序在你的“主”数据集中创建一个新的序列变量。然后重新排序由该变量的合并结果:

data adjustedOR1; 
    set adjustedOR1; 
    sortkey = _n_; 
run; 
proc sort data=adjustedOR1; 
    by effect; 
run; 
proc sort data=adjustedOR2; 
    by effect; 
run; 
data Oddsratios (keep=Effect OR1 OR2 sortkey); 
    merge adjustedOR1 adjustedOR2; 
     by effect; 
run; 
proc sort data=Oddsratios; 
    by sortkey; 
run; 

这将是一个有点不是硬编码排序顺序基思建议使用PROC SQL(也可以工作的方式)更通用。

感谢Keith提供的实例!

+0

好的答案鲍勃,我想可以归结为有多少效应变量以及数据使用的进一步步骤。我总是喜欢看数据,而不是将它想象成我的头脑,因此就是例子。 (加上我知道我提议的解决方案!) – Longfish

+0

感谢Bob和Keith!我最终使用了Bobs示例,因为它是最快的,因为我有连续变量和分类变量的混合。但基思一个会很好的修改我写的宏。再次感谢! – user1285021

0

如果你想只改变其中的变量出现在数据集的顺序,你可以使用保留语句:

data Oddsratios (keep=Effect OR1 OR2); 
retain b d c a e; 
merge adjustedOR1 adjustedOR2; 
by effect; 
run; 

这是不是真的什么保留是为了,但它有效。

但我想知道为什么你在乎数据集中变量的顺序是什么。例如,当您使用proc print显示结果时,您可以指定订单。

+0

b,d,c,a,e是变量'Effect'的值,而不是单独的变量名。我相信这个问题涉及到一个特定变量的自定义排序 – Longfish

1

我认为排序数据最简单的方法是在Proc Sql中进行合并,并在'order by'子句中使用case语句。这是一个例子。

ods output oddsratios=adjustedOR1(rename=(OddsRatioEst=OR1)); 
proc logistic data=sashelp.class; 
     model sex= height age weight; run; 

ods output oddsratios=adjustedOR2 (rename=(OddsRatioEst=OR2)); 
proc logistic data=sashelp.class; 
     model sex= height age; run; 

proc sql; 
create table Oddsratios as select 
a.effect, 
a.or1, 
b.or2 
from adjustedOR1 as a 
      left join 
     adjustedOR2 as b 
      on a.effect=b.effect 
order by 
    case a.effect 
     when 'Height' then 1 
     when 'Age' then 2 
     when 'Weight' then 3 
    end; 
quit; 
0

最简单的答案我认为这仍然相当灵活是从您的原始数据集创建信息。然后在合并过程中,您可以使用数字顺序变量创建一个新变量,然后对其进行排序。

另一种解决方案是以不需要排序的方式进行合并 - 例如创建一个哈希表,或者创建出胜算比2数据集的格式,然后在简单的数据步骤中添加它,而不是通过合并。

data have; 
input effect $; 
datalines; 
b 
d 
c 
a 
e 
;;;; 
run; 

data for_format; 
set have; 
fmtname='EFF'; 
type='j'; 
hlo='s'; 
start=effect; 
label=_n_; 
keep hlo type fmtname start label; 
run; 

proc format cntlin=for_format; 
quit; 

proc sort data=have; 
by effect; 
run; 

data want; 
set have; *your merge here instead; 
by effect; 
eff_order=input(effect,$EFF.); 
run; 

proc sort data=want; 
by eff_order; 
run; 
proc print data=want; 
run; 
相关问题