Использование кода R для итеративного моделирования данных в Proc IML и последующего анализа в процедуре SAS, более быстрый способ? - PullRequest
0 голосов
/ 04 сентября 2018

Следующие коды - то, о чем я думал, это довольно медленно, какие-либо предложения? Спасибо!

Подробности в том, что сначала создайте набор данных в proc iml с использованием кода R, затем перенесите его в обычный оператор SAS proc mixed для его анализа, затем используйте proc append для сохранения результатов, а затем повторите процесс 10000 раз.

proc iml;
  do i= 1 to 100000;  
    submit / R;
       library(mvtnorm)
       library(dplyr)
       library(tidyr)
       beta <- matrix(1:50, byrow = TRUE,10,5)
       sigma <- matrix(1:25, 5)
       sigma [lower.tri(sigma )] = t(sigma )[lower.tri(sigma )]
       sample <- t(apply(beta, 1, function(m) rmvnorm(1, mean=m, sigma=sigma)))
       Group = rep(factor(LETTERS[1:2]),each=5,1)
       sample <- cbind(sample,Group,c(1:5))
       concat <- function(x) paste0('Visit', x[, 2], 'Time', x[, 1])
       cnames <- c(paste0("Time", 1:5),"Group","ID")
       colnames(sample) <- cnames
       sample <- data.frame(sample)
       sample <- gather(sample, Visit, Response, paste0("Time", 1:5), factor_key=TRUE)
    endsubmit;

    call ImportDataSetFromR( "rdata", "sample" );

    submit;
       Proc mixed data=rdata;
          ods select none;
          class Group Visit ID;
          model Response = Visit|Group;
          repeated  Visit/ subject=ID type=un;
          ods output  Tests3=Test;
       run;
       proc append data=Test base=result force ;
       run;
    ENDSUBMIT;
  end;
Quit;
proc print data=result;
run;

Ответы [ 2 ]

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

Идеальным подходом было бы выполнить полное моделирование в SAS / IML, поскольку это минимизировало бы передачу данных между SAS и R. Вы можете использовать функцию RANDNORMAL для моделирования многомерных нормальных данных . Используйте операторы CREATE / APPEND, чтобы сохранить смоделированные выборки в наборе данных SAS. Затем вызовите PROC MIXED и используйте оператор BY для анализа всех выборок. См. «Моделирование в SAS», для общих идей. Блоки SUBMIT не требуются. Если у вас возникли проблемы с программированием, обратитесь к публикациям "Simulation" на В цикле DO blog , или если вы собираетесь много заниматься симуляцией в SAS, возможно, вы захотите найти копию Моделирование данных с помощью SAS (Wicklin, 2013)

Если вы недостаточно хорошо знаете SAS / IML для запуска симуляции, то сгенерируйте все 100 000 выборок в R (векторизация, если это возможно) и создайте переменную SampleID для идентификации каждой выборки. Затем импортируйте все данные в SAS и используйте трюк с оператором BY для выполнения анализа.

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

Не знаю точно, что вы делаете, поэтому это должно быть общим.

Переместить цикл внутрь кода R. Оставайтесь внутри R, чтобы сгенерировать 1 большой кадр данных, а затем импортировать его в SAS. Цикл по этим представлениям будет медленнее. Для вызова R необходимы дополнительные издержки, импортируются данные из R (что является еще одним вызовом R), а затем запускается приложение SAS. Помещение цикла в R устраняет эти накладные расходы.

...