2

2 つのモデルから出力されたオッズ比を 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;

プロシージャソート.....

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

問題は、効果変数で並べ替えてマージすると、説明変数をモデルに配置した順序が失われることです。

モデルに配置した順序に従って、変数にインデックスを割り当てる方法はありますか?

ご協力いただきありがとうございます

4

4 に答える 4

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 に答える
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 に答える
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 に答える
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 に答える