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;