Question

J'écris une macro qui exécutera PROC MIXED avec la variance résiduelle de niveau 1 fixée à une valeur proche de zéro à l'aide de l'instruction PARMS.J'essaie de générer la majeure partie des valeurs de départ pour l'instruction PARMS en utilisant SAS/IML, quelque chose comme :

%macro test (dataset= , classroom= , preds= , outcome=);
proc iml;

/*count number of variables*/
    %let nvars = 0; 
    %do %while(%qscan(&preds,&nvars+1,%str( )) ne %str());
        %let nvars = %eval(&nvars+1);
    %end; 

/*determine location of level-1 residual in the start value vector*/
    %let error_location = %eval(((&nvars*(&nvars-1))/2)+&nvars+1);

/*create vector of start values from lower triangle of identity matrix*/
    start_vector = symsqr(I(&nvars));
    %let starts = %str(start_vector[label=""]); 

/*analyze data*/
    proc mixed data=&dataset noprofile method=ml;
        class &classroom;
        model &outcome = &preds /noint;
        random &preds /type=un sub=&classroom g; 
        parms 
            &starts
            .00000001 /hold= &error_location;
    run;
quit;
%mend;

Le code fonctionne correctement sans l'instruction PARMS dans le code PROC MIXED.Cependant, lorsque j'exécute le code tel quel, SAS place apparemment la chaîne littérale 'start_vector[label=""]' après PARMS plutôt que de lister les valeurs générées par IML.

Comment puis-je éviter cette erreur et demander à SAS de spécifier les valeurs contenues dans START_VECTOR comme valeurs de départ pour l'instruction PARMS ?

Était-ce utile?

La solution

Vous devriez utiliser le SYMPUT ou SYMPUTX routines en SAS/IML pour convertir un vecteur en variable macro.

C'est une façon d'obtenir un vecteur dans une seule chaîne dans une variable macro.

proc iml;
  start = {"Hi","Bye"};
  call symput("start",rowcat(start`));
  %put &start;
quit;

Avec un vecteur numérique, vous devez utiliser char pour le convertir :

proc iml;vecteur_début = j(5);appelez symputx("start_vector",rowcat(char(j)));%put &start_vector;quitter;

Avec une matrice numérique, vous devez utiliser SHAPE pour l'aplatir :

proc iml; 
    start_vector = j(5,5); 
    call symputx("start_vector",rowcat(shape(char(start_vector),1))); 
    %put &start_vector;
quit;

Autres conseils

Votre problème et deux solutions sont discutées dans l'article " Passage des valeurs de PROC IML dans les procédures SAS . "

Devez-vous envelopper cela dans une macro?Si tel est le cas, les déclarations de soumission et d'arrivée ne fonctionneront pas, car elles ne peuvent pas être appelées forment une macro.Cependant, étant donné que SAS / IML vous permet de définir et d'appeler des modules avec des arguments, j'évite généralement la macro-language et définissez un module qui prend des arguments, puis appelez le module directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top