2017-01-05 3 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; 

Bonjour, J'essaie d'optimiser la fonction f qui a 10 paramètres avec une contrainte de tous les 10 paramètres jusqu'à zéro. Quelqu'un peut-il suggérer comment puis-je écrire le code pour la dernière partie afin que je puisse optimiser f et obtenir les résultats que je veux? Merci d'avance.SAS Proc IML Optimisation

+0

Il semble étrange que dans 'f_prob' vous ayez une boucle sur' j' mais que 'j' n'apparaisse pas dans l'expression de la boucle. Aussi: avez-vous 'proc optmodel'? – Leo

+0

Oups j'ai fait les changements pour inclure j dans la boucle. Merci de l'avoir signalé. Proc optmodel fonctionne-t-il mieux? – Sopon

+0

J'ai essayé, mais j'utilise la méthode et il n'a pas op optodel – Sopon

Répondre

0

La documentation fournit an example of how to specify a linear constraint matrix. Pour votre exemple, utilisez une matrice 3 x 12.

  • Sur la première ligne (colonnes 1:10), mettez les contraintes inférieures pour les paramètres.
  • Sur la deuxième ligne (colonnes 1:10), mettez des contraintes supérieures pour les paramètres.
  • Sur la troisième rangée, mettre tous ceux dans les colonnes 1:10. Mettez un 0 dans la colonne 11 pour indiquer le signe EQUAL. Mettez 0 dans la 12ème colonne pour indiquer la valeur de la contrainte.

Le code ressemble à ceci:

/* 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; 

La dernière ligne spécifie les coefficients de l'expression de la matrice c * x = 0, où c = {1} 1 ... 1 contient la troisième rangée.

+0

Salut, j'ai apporté quelques modifications mineures à mon code et ajouté dans votre suggestion, mais j'ai toujours ce "ERREUR: (exécution) Opérande invalide à l'opération." problème. Quelle pourrait être la cause de cette erreur? Vraiment apprécier l'aide. – Sopon

+0

En général, vous ne devriez pas éditer votre question pour incorporer la réponse. Il est difficile pour les futurs lecteurs de voir le problème original et de voter pour les réponses. Vous avez maintenant un problème différent, probablement une erreur dans un calcul arithmétique. Le journal SAS devrait vous montrer le numéro de ligne où l'erreur se produit. – Rick