我试图将两种模型输出的优势比与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 sort .....
data Oddsratios (keep=Effect OR1 OR2);
merge adjustedOR1 adjustedOR2; by effect; run;
问题是如果我按效果变量排序和合并,我就会失去将解释变量放入模型的顺序。
无论如何根据我在模型中放置的顺序为变量分配索引,以便最终表格的顺序包含效果列:b d c a e?
感谢您的帮助
答案 0 :(得分: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;
答案 1 :(得分: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(顺便说一下也是如此)。
感谢基思提供了一个实际的例子!
答案 2 :(得分:0)
如果您只想更改变量在数据集中的显示顺序,可以使用retain语句:
data Oddsratios (keep=Effect OR1 OR2);
retain b d c a e;
merge adjustedOR1 adjustedOR2;
by effect;
run;
这不是保留的目的,但它有效。
但我想知道为什么你关心数据集中变量的顺序是什么。例如,您可以在使用proc print
显示结果时指定顺序。
答案 3 :(得分: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;