0

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

细节是首先proc iml使用 R 代码创建一个数据集,然后将其传输到常规 SASproc 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;
4

2 回答 2

3

理想的方法是在 SAS/IML 中进行全面模拟,因为这样可以最大限度地减少 SAS 和 R 之间的数据传输。您可以使用 RANDNORMAL 函数来模拟多元正态数据。使用 CREATE/APPEND 语句将模拟样本保存到 SAS 数据集。然后调用 PROC MIXED 并使用 BY 语句分析所有样本。有关一般概念,请参阅“SAS 中的仿真” 。不需要 SUBMIT 块。如果您遇到编程问题,请查阅DO Loop博客上的“模拟”帖子,或者如果您打算在 SAS 中进行大量模拟,您可能需要找到一份使用 SAS 模拟数据的副本(Wicklin,2013)

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

于 2018-09-05T00:10:48.430 回答
1

不知道你在做什么,所以这必须是一般的。

将循环移动到 R 代码内。留在 R 中生成 1 个大数据框,然后将其导入 SAS。循环这些提交会更慢。调用 R、从 R 导入数据(这是另一个 R 调用),然后运行 ​​SAS 附加,有必要的开销。将循环放入 R 消除了这种开销。

于 2018-09-04T14:54:15.850 回答