以下代码是我所想到的,有点慢,有什么建议吗?谢谢!
详细信息是,首先使用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;
答案 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可以消除这种开销。