SAS和R中的二项式检验-不同的结果

时间:2018-07-24 17:12:09

标签: r sas binomial-theorem

我需要从R复制一个二项式检验到SAS,但是我获得了不同的结果(或者可能是我误解了SAS结果)。

为了方便地解释我的问题,我将使用来自维基百科example的数据,因为它提供了最终的解决方案。

假设您要计算在235卷具有6个面的平模的样本中获得51个或更多6s的概率,因此在每个试验中将6卷的真实概率为1/6。 最终解决方案应为 0.02654

在R中,要执行的代码如下:

binom.test(51,235,(1/6),alternative = "greater")

得到的结果是:

  

精确的二项式检验

     

数据:51和235成功次数= 51,试验次数= 235,
   p值= 0.02654
  替代假设:成功的真实概率大于0.1666667
  95%置信区间:
  0.1735253 1.0000000
  样本估计:成功的可能性
               0.2170213

在SAS中,等效项应为:

DATA DICEROLL;
ROLL=51;
FREQQ=235;
PROB=1/6;
RUN;

data _null_;
set diceroll;
call symput("probability",prob);
run;

PROC FREQ DATA=DiceRoll ;
    TABLES FREQQ / BINOMIAL (P=&probability.) ALPHA=0.05;
    EXACT  BINOMIAL ;
    WEIGHT ROLL ;
RUN;

但是我得到的结果是THIS(其中没有p值= 0.02654)

我尝试了几种方法来调和我的结果(尝试了R中的所有三个替代方法,因为不确定,试图在sas中反转ROLL和FREQQ),但是我仍然没有找到解决方案。 binom.test和proc freq + BINOMIAL是否至少执行相同的测试? 我会误解SAS输出吗?

在此先感谢您的宝贵帮助!

=============================更新================ ===========

我尝试了reeza和BEMR提出的两种方法,我觉得我已经接近解决方案了! @BEMR:,正如我在评论中写道并解释的更好,如果我的变量是双态的,我该如何适应%r(1,6)?您的代码使用6面骰子的示例工作,但在我的实际情况下,我的成功变量假定值为0到1之间的值,因此我不确定该怎么做(如果我没有在代码中提及它,我深表歉意。开始)

@REEZA :您的解决方案似乎有效,但是我不得不删除了/ 2;我想您的第一个解决方案将p值计算为双面测试而不是单面测试。 无论如何,结果都不错,但是当成功次数为0或接近0(1,2,3)时,SAS和R之间存在巨大差异。您知道任何解决方法吗?还是更好,可以安全地假设测试在两种情况下都不可靠? 以下图片是我使用reeza方法得到的结果,感谢大家的宝贵合作! enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

您显然不需要以这种方式设置变量,但是更多的是一对一类型比较。 SAS没有能力执行我在该功能中看到的单面测试,但是我没有读太多或试图弄清楚它是否正确。但是,您应该在SAS中使用这种方法来获取相似的数字,而不是PROC FREQ。

    data demo;
nSuccesses=51;
prob_success=1/6;
nTrials = 235;

y=(1-cdf('BINOM', nsuccesses, prob_success, ntrials))/2;
run;

proc print data=demo;
run;

http://documentation.sas.com/?docsetId=lefunctionsref&docsetTarget=p1cxa81efqtsszn12ueyitll9esw.htm&docsetVersion=9.4&locale=ja#p03dt2kdzjjucxn198ytlpnrf1r4

答案 1 :(得分:1)

如果要比较binom.test和proc freq + BINOMIAL,可以在SAS中使用模拟。以下代码提供了一个示例:

掷骰子235,结果可以是1,...,6。

*Create df: random roll;
*macro: random int between min and max;;
  %macro r(min,max);
(&min + floor((1+&max-&min)*rand("uniform"))) 
   %mend;
  data df;
  f = 0;
  do i = 1 to 235; *number of trials;
    x = %r(1,6); *call macro %r() to generate random number between 1,...,6; 
if x = 6 then f = f + 1; *if the random number = 6, add freq from the previous;
relative = f/i; *relative freq;
 output;
end;
run;

*plot relative freq, reference line (1/6), probability of rolling 6;
symbol v=dot c=red;
proc gplot data=df;
plot relative * i/overlay vref=0.16666667 href=500 lh=3;
run;
quit;

enter image description here

这是这里的一个示例:http://www.stat.purdue.edu/~lfindsen/stat503/Lab2.pdf

*exact binomial using proc freq and simulated data; 
*test if simulation is different from the hypothized 1/6;
proc freq data = df;
tables x / binomial (level=6 p=.166667); 
exact binomial;
run;

当235例中有6例时。

*Create df2: assign approx 51 cases of 235 a roll of 6;
 data df2;
 do i = 1 to 235; *number of trials;
x = %r(1,5); 
 output;
 end;
 run;
 data df2;
  set df2;
    if i <= 51 then x = 6; *assign six to rows 1 to 51; 
  run;

  *exact binomial using proc freq and simulated data; 
  *test if simulation is different from the hypothized 1/6;
  proc freq data = df2;
tables x / binomial (level=6 p=.166667); 
exact binomial;
  run;

精确的二项式单侧p值= 0.0265 enter image description here

==============================更新============= ==============

对于二进制变量[0 = 2184,1 = 72],而不是使用宏,您可以执行以下操作:

    data df3;
    input success n;
    datalines;
    0 2184
    1 72
    ;

    proc freq data=df3;
    weight n; *number of obs for [0,1];
    tables success / binomial (level=2 p=0.509); 
    run;