2

我正在尝试将两个模型输出的优势比与 SAS 中的不同调整相结合:

IE:

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;

过程排序.....

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

问题是,如果我按效果变量进行排序和合并,我会丢失将解释变量放入模型的顺序。

反正有没有按照我放在模型中的顺序给变量分配一个索引,这样最终的表就会有顺序的效果列:bdcae?

谢谢你的帮助

4

4 回答 4

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;
于 2012-10-15T09:08:47.590 回答
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;

这比 Keith 建议使用 PROC SQL(顺便说一句也可以)对排序序列进行硬编码更通用一些。

感谢 Keith 提供了一个实际的例子!

于 2012-10-15T13:09:25.493 回答
0

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

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

这并不是保留的真正用途,但它确实有效。

但我想知道为什么你关心数据集中变量的顺序是什么。例如,您可以指定显示结果时的顺序proc print

于 2012-10-14T23:54:14.990 回答
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;
于 2012-10-15T14:36:00.283 回答