استخدام المتجه الذي تم إنشاؤه في SAS/IML كمتغير ماكرو

StackOverflow https://stackoverflow.com//questions/25042043

  •  21-12-2019
  •  | 
  •  

سؤال

أقوم بكتابة ماكرو يقوم بتشغيل PROC MIXED مع التباين المتبقي من المستوى 1 الثابت بقيمة قريبة من الصفر باستخدام عبارة PARMS.أحاول إنشاء الجزء الأكبر من قيم البداية لبيان PARMS باستخدام SAS/IML، مثل:

%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;

يعمل الرمز بشكل جيد بدون عبارة PARMS في رمز PROC MIXED.عندما أقوم بتشغيل الكود كما هو، يبدو أن SAS تضع السلسلة الحرفية "start_vector[label = ""]" بعد PARMS بدلاً من سرد القيم التي تم إنشاؤها بواسطة IML.

كيف يمكنني تجنب هذا الخطأ وجعل SAS تحدد القيم الموجودة في START_VECTOR كقيم بداية لبيان PARMS؟

هل كانت مفيدة؟

المحلول

يجب عليك استخدام SYMPUT أو SYMPUTX إجراءات في SAS/IML لتحويل ناقل إلى متغير ماكرو.

هذه إحدى الطرق للحصول على متجه في سلسلة واحدة في متغير ماكرو.

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

مع ناقل رقمي، تحتاج إلى استخدامه char لتحويله:

بروك IML؛start_vector = j(5);استدعاء Symputx("start_vector",rowcat(char(j)));%وضع &start_vector;يترك؛

مع مصفوفة رقمية، تحتاج إلى استخدامها SHAPE لتسطيحها:

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

نصائح أخرى

مشكلتك وناقش حلنتين في المقالة " تمرير القيم من بروك IML في إجراءات SAS . "

هل لديك لالتفاف هذا في ماكرو؟إذا كان الأمر كذلك، فلن تعمل بيانات الإرسال والإبداع، حيث لا يمكن استدعاؤها في شكل ماكرو.ومع ذلك، نظرا لأن SAS / IML يمكنك من تحديد وحدات النمط مع الوسائط، فأنا عادة ما أتجنب لغة الماكرو وتحديد الوحدة النمطية التي تأخذ الوسائط، ثم استدعاء الوحدة النمطية مباشرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top