Как многократно вызывать R в цикле и получать результаты для дальнейшей обработки в SAS - PullRequest
0 голосов
/ 14 сентября 2018

Я упростил код, чтобы проиллюстрировать проблему:

proc iml;
var=40;
call ExportMatrixToR(var, "var" );
submit / R;
sample<-sample(1:var, 50, replace=TRUE)
endsubmit;
call ImportDataSetFromR( "WORK.rdata", "sample" );
proc means data=rdata; 
output out=a;
run;

Как лучше контролировать var, например, если я хочу попробовать другое значение var=(20,40,80,100,120...), какчтобы сделать это, как люди могут легко сделать в макросе?

Обратите внимание, что rdata переносится из R в SAS для анализа, поэтому нам может потребоваться создать разные фреймы данных в R с именами в зависимости от значения var.Любой более простой способ?

******* Обновление ********

Др.Уиклин, у меня на столе твоя книга, это удивительно.Спасибо большое, что нашли время ответить на вопрос.

Я попробовал ваш код, и он отлично работал, но я забыл упомянуть, что в моих смоделированных данных есть символьная переменная.Представленный код R выглядит следующим образом:

 submit Ni / R;
 sample<-sample(1:&Ni, 50, replace=TRUE)   
 group<-rep(LETTERS[1:2],25)
 df<-data.frame(sample, group)
 endsubmit;

Я пытался обойти ваш код, чтобы приспособиться к этой функции, но в журнале SAS все время говорилось: «Группа переменных имеет тип, несовместимый с набором данных».Не могли бы вы помочь?


******* Обновление2 **************


    proc iml;
    N = do(20, 120, 20);
    ID = 1; sample = .; group="";     
    create rdata var {ID "sample" "group"}; /* open data set for writing */
    do i = 1 to ncol(N);
    Ni = N[i];    /* get the i_th parameter; pass in on the SUBMIT statement */
       submit Ni / R;
     sample<-sample(1:&Ni, 50, replace=TRUE)   
     group<-rep(LETTERS[1:2],25)
       endsubmit;
    call ImportMatrixFromR(sample, "sample"); 
    call ImportMatrixFromR(group, "group"); 
       ID = j(nrow(sample), 1, i);   /* also save ID variable */
       append;              /* write IML data to SAS data set */
    end;
    close rdata;
    quit;

    proc means data=rdata; 
    by ID;        /* analyze all the results in a single call */
    output out=a;
    run;`

1 Ответ

0 голосов
/ 15 сентября 2018

Я предполагаю, что вы хотите попробовать эти значения последовательно, как в цикле?Если это так, ваш вопрос, возможно, лучше сформулировать так: «как многократно вызывать R в цикле и получать результаты для дальнейшей обработки в SAS».

Сначала прочитайте статью «Двенадцать преимуществ вызоваR из языка SAS / IML. " В первом пункте описывается, как вызывать R в цикле, и приводится пример.Третий пункт показывает, как передать параметры из SAS в R.

Далее прочитайте статью "Моделирование в SAS: медленный или BY-путь" , в которой описывается, как создатьНабор данных SAS, позволяющий эффективно выполнять повторные вычисления.Объединение этих двух идей приводит к следующей структуре программы:

  1. Создать цикл в IML и повторно вызывать R.В качестве альтернативы, вы можете отправить вектор параметров и выполнить цикл по R. Второй метод может быть более эффективным, но первый лучше соответствует вашему примеру, поэтому давайте перейдем к этой опции.
  2. После каждого анализа,получить результат (ы).Вы можете записать результат в набор данных SAS и включить переменную ID, которая будет использоваться в качестве переменной BY на следующем шаге.
  3. Теперь у вас есть набор данных SAS, который содержит k результатов, каждый из которых определяетсяпеременная индикатора.Вызовите процедуру SAS (PROC MEANS в вашем примере) для анализа каждого результата.

Вот пример:

proc iml;
N = do(20, 120, 20);
ID = 1; sample = .;     /* we will write a numeric variable */
create rdata var {ID "sample"}; /* open data set for writing */
do i = 1 to ncol(N);
   Ni = N[i];    /* get the i_th parameter; pass in on the SUBMIT statement */
   submit Ni / R;
      sample<-sample(1:&Ni, 50, replace=TRUE)   # access parameter in R
   endsubmit;
   call ImportMatrixFromR(sample, "sample"); /* create IML var; copy from R */
   ID = j(nrow(sample), 1, i);   /* also save ID variable */
   append;              /* write IML data to SAS data set */
end;
close rdata;
quit;

proc means data=rdata; 
by ID;        /* analyze all the results in a single call */
output out=a;
run;

В программе я жестко закодировал вектор{20, 40, 60, ...}.Вы также можете получить эти значения из макропеременной или из набора входных данных.Например

data NValues;
input Vals @@;
datalines;
20 40 60 80 100 120
;

proc iml;
use NValues; read all var "Vals"; close;
N = T( Vals );
/* ...etc ... */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...