基于同一种子复制R中SAS(rancor)生成的随机正态分布?

基于同一种子复制R中SAS(rancor)生成的随机正态分布?,r,sas,random-sample,R,Sas,Random Sample,给定相同的种子,是否有方法使用rannor函数生成SAS中生成的完全相同的随机正态数?在R中?我对两者都进行了测试,似乎没有 data _null_; CALL STREAMINIT(1245); do i=1 to 10; x2 = rand('NORMAL',0,1); put x2; end; run; /* -1.295643934 0.0651085355 -0.391011151 1.1024205822 2.0712099724 -0.296163515 0.898941256 -

给定相同的种子,是否有方法使用rannor函数生成SAS中生成的完全相同的随机正态数?在R中?

我对两者都进行了测试,似乎没有

data _null_;
CALL STREAMINIT(1245);
do i=1 to 10;
x2 = rand('NORMAL',0,1);
put x2;
end;
run;
/*
-1.295643934
0.0651085355
-0.391011151
1.1024205822
2.0712099724
-0.296163515
0.898941256
-0.584950901
0.2027164546
-0.986522152*/

set.seed(1245)
df<-rnorm(10,0,1)
df
 [1]  0.41914007 -1.45583361 -1.45588008 -1.01564637 -0.53309914 -0.68360608  0.32590880 
 [8]  0.92256137 -0.05085288  0.29722361
数据\u空\u;
调用STREAMINIT(1245);
i=1到10;
x2=兰特(正常值),0,1;
放x2;
结束;
跑
/*
-1.295643934
0.0651085355
-0.391011151
1.1024205822
2.0712099724
-0.296163515
0.898941256
-0.584950901
0.2027164546
-0.986522152*/
种子集(1245)

df要使这些匹配,您需要两件事:

  • 用于生成随机数的种子
  • 用于生成随机数的公式
SAS用于
rannor
(我认为也用于
rand
,但我还没有看到对此的确认),以下算法(由Robert Johnson和Hui Liu在中发现):

其中,U1和U2是来自统一编号流的两个编号。(也可以获得第二个数字,但据我所知,该数字已被丢弃。)

请参阅以下SAS数据步骤:

data test1;
  U1 = ranuni(7);
  U2 = ranuni(7);
  X1 = (−2* log(U1))**.5*cos(2*constant('pi')*U2);
  U1 = ranuni(7);
  U2 = ranuni(7);
  X2 = (−2* log(U1))**.5*cos(2*constant('pi')*U2);
run;
data test2;
  x1 = rannor(7);
  x2 = rannor(7);
run;
test1
test2
具有相同的随机数值

我怀疑R和SA是否有共同的PRNG算法,尤其是
rannor
使用的算法不是很好(你应该使用
rand
,使用Mersenne Twister更好)。但是,只要输出Ranui结果,您就可以轻松地要求SAS输出它使用的种子

您可以要求SAS以以下方式执行此操作:

data rands_uni;
  seed=7;
  do _i_=1 to 10;
    seed1 = seed;
    call ranuni(seed,x1);
    seed2=seed;
    call ranuni(seed,x2);
    output;
  end;
run;
根据这一点,您可以在R中计算rannor结果(即,从x1和x2)。我把种子放在那里作为参考——也许R确实有能力使用它们。上面的文章确实引用了用于拉努尼的算法SAS,但它也指出,由于使用了一些修正(或者,可能是由于浮点精度问题),您无法完全复制它。

Proc IML;
调用RandSeed(6);
U1=J(6,1);
U2=J(6,1);
/*威布尔分布*/
调用RandGen(U1,“威布尔”,1.7737152,13.164695);
打印“威布尔分布:”U1;
/*统一分布*/
称RandGen(U2,“统一”,0,1);
打印“统一分发:”U2;
提交/R;
结实。种子(6);
##威布尔分布;

U1我想用户是在问是否可以用某种方式来做,而不是仅仅用基本工具来做。)
data rands_uni;
  seed=7;
  do _i_=1 to 10;
    seed1 = seed;
    call ranuni(seed,x1);
    seed2=seed;
    call ranuni(seed,x2);
    output;
  end;
run;
Proc IML;
Call RandSeed(6);
U1 = J(6,1);
U2 = J(6,1);
/* Weibull Distribution */
Call RandGen(U1,"WEIBULL",1.7737152,13.164695);
Print "Weibull Distribution:" U1;
/* Unifrom Distribution */
Call RandGen(U2,"UNIFORM",0,1);
Print "Uniform Distribution:" U2;

Submit/R;
    set.seed(6);
    ## Weibull Distribution;
    U1 <- rweibull(6,1.7737152,13.164695);
    cat("Weibull Distribution:", U1, "\n");
    ## Uniform Distribution;
    U2 <- runif(6,0,1);
    cat("Unifrom Distribution:", U2, "\n");
EndSubmit;

Quit;