Использование кода R для итеративного моделирования данных в Proc IML и последующего анализа в процедуре SAS, более быстрый способ?
Следующие коды - то, о чем я думал, это довольно медленно, какие-либо предложения? Спасибо!
Подробности в том, что сначала создать набор данных в 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 ответа
Идеальным подходом было бы сделать полное моделирование в SAS/IML, потому что это минимизировало бы передачу данных между SAS и R. Вы можете использовать функцию RANDNORMAL для моделирования многомерных нормальных данных. Используйте операторы CREATE/APPEND, чтобы сохранить смоделированные выборки в наборе данных SAS. Затем вызовите PROC MIXED и используйте оператор BY для анализа всех выборок. См. "Моделирование в SAS" для общих идей. Блоки SUBMIT не требуются. Если у вас возникли проблемы с программированием, обратитесь к публикациям "Simulation" в блогеDO Loop или если вы собираетесь много заниматься симуляцией в SAS, вы можете найти копию Simulation Data с помощью SAS (Wicklin, 2013)
Если вы недостаточно хорошо знаете SAS/IML для запуска симуляции, то сгенерируйте все 100000 выборок в R (векторизация, если это возможно) и создайте переменную SampleID для идентификации каждой выборки. Затем импортируйте все данные в SAS и используйте трюк с оператором BY для выполнения анализа.
Не знаю точно, что вы делаете, поэтому это должно быть общим.
Переместите цикл внутрь кода R. Оставайтесь внутри R, чтобы сгенерировать 1 большой кадр данных, а затем импортировать его в SAS. Цикл по этим представлениям будет медленнее. Для вызова R, импорта данных из R (который является еще одним R-вызовом) и последующего запуска приложения SAS необходимы дополнительные издержки. Помещение петли в R устраняет эти накладные расходы.