SAS 和 R 中的二项式检验 - 不同的结果
Binomial Test in SAS and R - Different Results
我需要将二项式检验从 R 复制到 SAS,但我得到了不同的结果(或者我可能误解了 SAS 结果)。
为了以一种简单的方式解释我的问题,我将使用来自这个维基百科的数据 example 因为它提供了最终的解决方案;
假设您要计算在 6 个面的公平骰子的 235 卷样本中获得 51 个或更多 6 的概率,因此每次试验掷出 6 的真实概率是 1/6。
最终的解应该是0.02654.
在 R 中,代码如下:
binom.test(51,235,(1/6),alternative = "greater")
得到的结果是:
Exact binomial test
data: 51 and 235 number of successes = 51, number of trials = 235,
p-value = 0.02654
alternative hypothesis: true probability of success is greater than 0.1666667
95 percent confidence interval:
0.1735253 1.0000000
sample estimates: probability of success
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-value = 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方法的结果,谢谢大家的宝贵配合!
您显然不需要以这种方式设置变量,但这更像是一对一的类型比较。 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;
如果您想比较 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;
这遵循此处的示例: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;
当 51 例是 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
==============================更新========= ===================
对于二进制变量 [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;
我需要将二项式检验从 R 复制到 SAS,但我得到了不同的结果(或者我可能误解了 SAS 结果)。
为了以一种简单的方式解释我的问题,我将使用来自这个维基百科的数据 example 因为它提供了最终的解决方案;
假设您要计算在 6 个面的公平骰子的 235 卷样本中获得 51 个或更多 6 的概率,因此每次试验掷出 6 的真实概率是 1/6。 最终的解应该是0.02654.
在 R 中,代码如下:
binom.test(51,235,(1/6),alternative = "greater")
得到的结果是:
Exact binomial test
data: 51 and 235 number of successes = 51, number of trials = 235,
p-value = 0.02654
alternative hypothesis: true probability of success is greater than 0.1666667
95 percent confidence interval:
0.1735253 1.0000000
sample estimates: probability of success
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-value = 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方法的结果,谢谢大家的宝贵配合!
您显然不需要以这种方式设置变量,但这更像是一对一的类型比较。 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;
如果您想比较 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;
这遵循此处的示例: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;
当 51 例是 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
==============================更新========= ===================
对于二进制变量 [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;