使用R代码在Proc IML中迭代模拟数据,然后在SAS过程中进行分析,这是一种更快的方法吗?

时间:2018-09-04 14:12:28

标签: r sas simulation do-loops sas-iml

以下代码是我所想到的,有点慢,有什么建议吗?谢谢!

详细信息是,首先使用R代码在proc iml中创建一个数据集,然后将其传输到常规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 :(得分:2)

理想的方法是在SAS / IML中进行完整的仿真,因为这样可以最大程度地减少SAS和R之间的数据传输。您可以use the RANDNORMAL function to simulate multivariate normal data。使用CREATE / APPEND语句将模拟的样本保存到SAS数据集。然后调用PROC MIXED并使用BY语句分析所有样本。有关一般思路,请参见"Simulation in SAS,"。不需要提交块。如果遇到编程问题,请查阅The DO Loop blog上的“模拟”文章,或者如果您打算在SAS中进行大量模拟,则可能需要查找Simulating Data with SAS (Wicklin, 2013)

的副本。

如果您对SAS / IML的了解不够深,无法运行模拟,请在R中生成所有100,000个样本(如果可能的话,进行矢量化),并制造一个SampleID变量以识别每个样本。然后将整个数据导入SAS,并使用BY语句技巧进行分析。

答案 1 :(得分:1)

完全不知道您在做什么,这必须很笼统。

将循环移到R代码内部。留在R内以生成1个大数据框,然后将其导入SAS。遍历这些提交将较慢。调用R,从R导入数据(这是另一个R调用),然后运行SAS附加,将产生必要的开销。将循环放入R可以消除这种开销。