2017-01-05 12 views
0
proc iml; 
start f_prob(beta) global(one_m_one, pone_m_one); 

p = nrow(one_m_one); 
td = j(p,3,0.); 
a = 1; 
do i = 1 to p; 
    td[i,1] = exp((one_m_one[i,1])*(beta[1]) + (one_m_one[i,2])*(beta[2]) + (one_m_one[i,3])*(beta[3]) + (one_m_one[i,4])*(beta[4]) + (one_m_one[i,5])*(beta[5]) + (one_m_one[i,6])*(beta[6]) + (one_m_one[i,7])*(beta[7]) + (one_m_one[i,8])*(beta[8]) + (one_m_one[i,9])*(beta[9]) + (one_m_one[i,10])*(beta[10])); 
    do j = a to 11+a; 
     td[i,2] = td[i,2] + exp((pone_m_one[j,1])*(beta[1]) + (pone_m_one[j,2])*(beta[2]) + (pone_m_one[j,3])*(beta[3]) + (pone_m_one[j,4])*(beta[4]) + (pone_m_one[j,5])*(beta[5]) + (pone_m_one[j,6])*(beta[6]) + (pone_m_one[j,7])*(beta[7]) + (pone_m_one[j,8])*(beta[8]) + (pone_m_one[j,9])*(beta[9]) + (pone_m_one[j,10])*(beta[10])); 
    end; 
    a = a + 12; 
end; 
td[,3] = td[,1]/td[,2]; 
f = 1; 
do i = 1 to p; 
    f = f*td[i,3]; 
end; 
return(f); 

finish f_prob; 

/* Set up the constraints: sum(x)=0 */ 
/*  x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 SIGN VALUE */ 
con = {. . . . . . . . . . . ., /* specify lower bounds */ 
     . . . . . . . . . . . ., /* specify upper bounds */ 
     1 1 1 1 1 1 1 1 1 1 0 0}; /* constraints */ 


beta0 = j(1,10,0); 
optn = {1,4}; 

call nlpnra(rc, result, "f_prob", beta0, optn) blc=con; 

こんにちは、10個のパラメータのすべてが10個の合計でゼロになるように、10個のパラメータを持つ関数fを最適化しようとしています。SAS Proc IMLの最適化

どのように私はfを最適化し、私が望む結果を得ることができるように最後の部分のコードを書くことができますか?前もって感謝します。

+0

'f_prob'では' j'を越えるループがありますが、 'j'はループの式に現れません。また、あなたは 'proc optmodel'を持っていますか? – Leo

+0

私はループにjを含めるように変更しました。それを指摘してくれてありがとう。 Proc optmodelはうまく機能しますか? – Sopon

+0

私は試しましたが、sas ueを使用していますが、Proc optmodelを持っていません – Sopon

答えて

0

an example of how to specify a linear constraint matrixを提供しています。あなたの例では、3 x 12の行列を使用します。

  • 最初の行(列1:10)に、パラメータの下限制約を設定します。
  • 2番目の行(列1:10)に、パラメータの上限制約を設定します。
  • 3列目にすべての列を1:10の列に入れます。列11に0を入れて等号を示す。第12列に0を入れて、制約の値を示します。

コードは次のようになります

/* Set up the constraints: sum(x)=0 */ 
/*  x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 SIGN VALUE */ 
con = {. . . . . . . . . . . ., /* specify lower bounds */ 
     . . . . . . . . . . . ., /* specify upper bounds */ 
     1 1 1 1 1 1 1 1 1 1 0 0}; /* constraints */ 
call nlpnra(rc, result, "f_prob", beta, optn) blc=con; 

最後の行がC = {1 1 ... 1}の含有マトリックス式C * X = 0、の係数を指定します3行目。

+0

こんにちは、私は私のコードにいくつかのマイナーチェンジを行ってあなたの提案に追加しましたが、私はまだこの "エラー:(実行)操作に無効なオペランドを持っている。問題。このエラーの原因は何ですか?本当に助けに感謝します。 – Sopon

+0

一般的には、質問を編集して回答を組み込むべきではありません。それは、将来の読者が元の問題を見て答えを投票することを困難にする。 これで別の問題が発生しました。おそらく算術計算のエラーです。 SASログには、エラーが発生した行番号が表示されます。 – Rick