楼主: Imasasor
6181 5

怎么不利用proc freq过程在data步计算fisher检验的p值 [推广有奖]

  • 1关注
  • 64粉丝

VIP

已卖:215份资源

学科带头人

33%

还不是VIP/贵宾

-

TA的文库  其他...

超哥喜欢的文章

威望
1
论坛币
47033 个
通用积分
3.1376
学术水平
238 点
热心指数
246 点
信用等级
231 点
经验
37132 点
帖子
849
精华
3
在线时间
2235 小时
注册时间
2012-7-4
最后登录
2024-10-10

初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章

楼主
Imasasor 发表于 2013-10-18 09:23:02 |AI写论文
888论坛币
data a;
input a b c d;
cards;
12 132 9 78
;
run;
/*a为实验组的阳性数,b为实验组的阴性数
c为对照组的阳性数,D为对照组的阴性数*
如何生成两个新的变量p1 p2
p1为卡方检验的p值
p2为fisher精确检验的p值
不通过proc freq过程
怎么利用数学运算以及SAS函数完成?*/

关键词:Fisher data步 freq Fish Data 如何 数学
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

沙发
邓贵大 发表于 2013-10-18 09:23:03
  1. data a;
  2. input a b c d;
  3. XPL_FISH = cdf('hyper', a, a+b+c+d, a+b, a+c);
  4. XPR_FISH = 1-cdf('hyper', a-1, a+b+c+d, a+b, a+c);
  5. if a/(a+b)<c/(c+d) then do;
  6.         p = pdf('hyper', a, a+b+c+d, a+b, a+c);
  7.         do e=c to 0 by -1;
  8.                 p1 = pdf('hyper', e, a+b+c+d, c+d, a+c);
  9.                 if p1<p then leave;
  10.         end;
  11.         XP2_FISH = XPL_FISH + cdf('hyper', e, a+b+c+d, c+d, a+c);
  12. end;
  13. else do;
  14.         p = pdf('hyper', c, a+b+c+d, c+d, a+c);
  15.         do e=a to 0 by -1;
  16.                 p1 = pdf('hyper', e, a+b+c+d, a+b, a+c);
  17.                 if p1<p then leave;
  18.         end;
  19.         XP2_FISH = XPR_FISH + cdf('hyper', e, a+b+c+d, a+b, a+c);
  20. end;
  21. cards;
  22. 12 132 9 78
  23. 11 4 2 6
  24. ;
  25. run;
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 100 + 100 + 5 + 5 + 5 精彩帖子,大神newbility
pobel + 5 + 5 + 5 学习了

总评分: 经验 + 100  论坛币 + 100  学术水平 + 10  热心指数 + 10  信用等级 + 10   查看全部评分

Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

藤椅
pobel 在职认证  发表于 2013-10-18 10:39:48
按照公式,卡方检验的P值应该可以这样求:
data a;
input a b c d;

*** Chi Square;
sum=sum(a,b,c,d);
chi_square=((a*d-c*b)**2*sum)/((a+b)*(c+d)*(a+c)*(b+d));
p_chi=1-probchi(chi_square,1);
put chi_square= p_chi=;

cards;
12 132 9 78
;
run;
和谐拯救危机

板凳
Imasasor 发表于 2013-10-18 10:54:02
pobel 发表于 2013-10-18 10:39
按照公式,卡方检验的P值应该可以这样求:
data a;
input a b c d;
非常感谢,关键是fisher精确检验的p值不知道怎么算
欢迎加入亚太地区第一R&Python数据挖掘群: 251548215;

报纸
pobel 在职认证  发表于 2013-10-18 10:56:04
Imasasor 发表于 2013-10-18 10:54
非常感谢,关键是fisher精确检验的p值不知道怎么算
Fisher的我也不知道。版主可以问一下京剧大侠。
和谐拯救危机

地板
heperwong 在职认证  发表于 2013-10-18 13:45:29
按照fisher检验最原始的公式,我也贴出一个。因为楼主的数据太大,不符合fisher检验的条件,然后在sas运行由于阶乘太大报错,所以我就改小了,使其总和<40. 顺便说一句楼上大神啊。
  1. data a;
  2. input a b c d;
  3. n=sum(a,b,c,d);
  4. p_ = (fact(a+b)*fact(a+c)*fact(b+d)*fact(c+d))/(fact(a)*fact(b)*fact(c)*fact(d)*fact(n));
  5. array p[*] p1 - p15;
  6. do i = 1 to 15;
  7.    a1 = 22-i;
  8.    b1 = i+1;
  9.    c1 = i-1;
  10.    d1 = 15-i;
  11.    p[i] = (fact(a1+b1)*fact(a1+c1)*fact(b1+d1)*fact(c1+d1))/(fact(a1)*fact(b1)*fact(c1)*fact(d1)*fact(n));
  12.    if p[i] > p_ then p[i] = 0;
  13.    end;
  14.    p_fisher = sum(of p1 - p15);
  15. cards;
  16. 12 11 9 5
  17. ;
  18. run;
复制代码
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Imasasor + 100 + 100 + 5 + 5 + 5 牛人啊,非常感谢

总评分: 经验 + 100  论坛币 + 100  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 02:50