非線形最適化をNLMIXEDプロシジャで

Last-modified: 2009-03-22 (日) 18:04:41

SASで非線形最適化を行う、となると、一般的にはSAS/ORのNLPプロシジャやOPTMODELプロシジャ、
またはSAS/IMLのNLPXXXサブルーチンを利用しますが、簡単な問題であればSAS/STATのNLMIXED
プロシジャでも実行できます。

NLMIXEDプロシジャでは、ユーザー指定の対数尤度関数を最大化する機能があります。この対数尤度と
して目的関数を書けばよいわけです。
まずは、x^2+3*x という2次関数を最小化するxを求めます。これは、x=-1.5ですね。結果を見ると、
確かに正しい答えが得られています。最小値の値は、 NegLogLikeの下に出ています。

data _temp;
  _dummy=0;
run;

proc nlmixed data=_temp;
  parms x=0;         /*パラメータとその初期値を指定*/
  obj=x**2+x*3;   /*目的関数を指定*/
  model _dummy~general(-obj);
run;

/*
                                             Parameter Estimates

                         Standard
Parameter    Estimate       Error      DF    t Value    Pr > |t|     Alpha       Lower       Upper    Gradient

x             -1.5000      0.7071       1      -2.12      0.2804      0.05    -10.4846      7.4846    3.11E-15

*/

もし最大値を求めたい場合は、general~(-obj)のマイナスの符号をとってください。

次はロジスティック回帰の例です。結果のパラメータ推定値が同じであることを確認しましょう。

data sample1;
  input res x1 x2;
datalines;
1 1 2
1 2 4
1 5 5
0 4 1
0 2 6
0 6 2
;
run;
proc logistic data=sample1 desc;
  model res=x1 x2;
run;
proc nlmixed data=sample1;
  parms b0=0 b1=0 b2=0;
  xbeta=b0+b1*x1+b2*x2;
  p=1/(1+exp(-xbeta));
  obj=(res=1)*log(p)+(res=0)*(log(1-p));
  model res~general(obj);
run;