楼主: angeloliu
10477 13

有关多个观测者测量结果的一致性检验 [推广有奖]

  • 0关注
  • 0粉丝

初中生

4%

还不是VIP/贵宾

-

威望
0
论坛币
4 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
358 点
帖子
6
精华
0
在线时间
16 小时
注册时间
2013-3-7
最后登录
2019-3-29

楼主
angeloliu 发表于 2013-3-7 15:11:48 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
求助各位大侠,希望有高手能够帮助解答疑问,感激不尽。
统计目的:希望知道不同的3个医生对同一患者MRI的诊断结果的一致性。
在下通过文献研究,发现使用加权Kappa检验,可以达到统计目的,可是于此同时问题产生了。
在SAS 中使用proc freq table A*B/agree 过程部来实现,可是这个只适用于数据为2格表的形式,而我的数据不是一个二格表(因为是3个医生对同一患者MRI的诊断)所以不知道在SAS中应当如何处理此问题。
希望高手帮忙,再次感谢。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:一致性检验 一致性 kappa agree Table 测量 检验

已有 1 人评分热心指数 收起 理由
eijuhz + 1 精彩帖子

总评分: 热心指数 + 1   查看全部评分

本帖被以下文库推荐

  • · MyLib|主题: 414, 订阅: 41

沙发
playmore 发表于 2013-3-7 17:32:54
不理解你的问题啊,不懂医学
但是你说的“3个医生对同一患者MRI的诊断”不是一张二维表吗?
另外proc freq的table项可以用(A B)*C得到A*C和B*C两张表,但表总是二维的啊
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

藤椅
angeloliu 发表于 2013-3-8 09:42:37
是这样,我看SAS对kappa检验录入的数据形式是如下图:
capture.bmp
如果是不只2个医生有多个医生,那么应该怎么写程序呢?

板凳
playmore 发表于 2013-3-8 09:49:31
angeloliu 发表于 2013-3-8 09:42
是这样,我看SAS对kappa检验录入的数据形式是如下图:

如果是不只2个医生有多个医生,那么应该怎么写程序 ...
不了解你这里的Kappa检验
你可以研究下,是不是只能用于检验两组样本
如果多于两个,是不是就要用到其他的检验
比如单一变量显著性用t,多个就要用f了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

报纸
angeloliu 发表于 2013-3-8 12:09:25
非常感谢。
这个文献中都提示直接用加权KAPPA就可以了,用STATA软件倒是可以解决这个问题,就是不知道SAS应该怎么做。

地板
moyunzheng 发表于 2013-3-11 11:13:04
结果是Categorical才能用kappa,如果是连续型的话用icc。

请参照以下链接:
A Macro to Calculate Kappa Statistics for Categorizations by Multiple  Raters

我修改了一下下,程序如下:
  1. %MACRO KAPPA(dataset=,vars_rater=);
  2. %local dataset vars_rater label n_rater1 n_rater2 i j id;
  3. %let n_raters=%sysfunc(countw("&vars_rater."));
  4. data kappa_t1(keep=subj ranking) ; /*Transform dataset structure*/
  5. set &dataset.(KEEP=&vars_rater.);
  6. subj=_n_;
  7. %do i=1 %to %sysfunc(countw("&vars_rater."));
  8.         rater=&i.;
  9.         ranking=%scan(&vars_rater.,&i.);
  10.         output;
  11.         %end;
  12. run;
  13. proc freq data=kappa_t1 noprint;
  14. table subj*ranking/out=kappa_t2(keep=subj ranking count);
  15. run;
  16. proc sql NOPRINT;
  17. select count(distinct subj),count(distinct ranking) into :n_subjs,:n_rankings
  18.         from kappa_t2;
  19. create table kappa_t3
  20.         as select distinct subj
  21.         from kappa_t2       
  22.         where subj is not null
  23.         order by subj;
  24. create table kappa_t4
  25.         as select distinct ranking
  26.         from kappa_t2
  27.         where ranking is not null
  28.         order by ranking;
  29. create table kappa_t5
  30.         as select *
  31.         from kappa_t3,kappa_t4
  32.         order by subj,ranking;
  33. proc sort data=kappa_t2;by subj ranking;run;
  34. data kappa_t6;
  35. merge kappa_t2 kappa_t5(in=a);
  36. by subj ranking;
  37. if a;
  38. RUN;
  39. data kappa_t6;
  40. set kappa_t6;
  41. if count=. then count=0;
  42. xmx=count*(&n_raters.-count);
  43. run;
  44. proc sort data=kappa_t6;
  45. by ranking;
  46. run;
  47. data kappa_t6(keep=ranking x xmx2);
  48. set kappa_t6;
  49. by ranking;
  50. retain x xmx2;
  51. if first.ranking then do; x=0; xmx2=0; end;
  52. x=x+count; xmx2=xmx2+xmx;
  53. if last.ranking then output;
  54. run;
  55. data kappa_t6;
  56. set kappa_t6;
  57. p=x/(&n_subjs.*&n_raters.);
  58. pq=p*(1-P);
  59. pqp=p*(1-p)*(1-2*p);
  60. kj=abs(1 - xmx2/(&n_subjs.*&n_raters.*(&n_raters.-1)*pq));
  61. numj=kj*pq;
  62. run;
  63. data kappa_t6;
  64. set kappa_t6;
  65. if p=0 then do;
  66.         kj=0; numj=0;
  67.         end;
  68. run;
  69. data kappa_t7;
  70. set kappa_t6 end=end;
  71. retain num den pqpsum;
  72. if _n_=1 then do;
  73.         num=0; den=0; pqpsum=0;
  74.         end;
  75. num=num+numj;
  76. den=den+pq;
  77. pqpsum=pqpsum+pqp;
  78. if end then output;
  79. run;
  80. data kappa_t8; set kappa_t7;
  81. keep Kappa SE CI pvalue;
  82. Kappa=num/den;
  83. SE=sqrt(2*(den*den-pqpsum))/(den*sqrt(&n_subjs.*&n_raters.*(&n_raters.-1)));
  84. ci=cats(put(kappa-1.96*se,8.3),"~",put(kappa+1.96*se,8.3));
  85. pvalue=1-probnorm(kappa/se);
  86. run;
  87. proc print data=kappa_t8 noobs label;
  88. label kappa="Overall Kappa" SE="Standard Error" ci="95% CI" pvalue="Prob>Z";
  89. title "Kappa statistics for &N_rankings.-category ratings by &N_raters raters";
  90. run;
  91. /*---------------------------------------Calculate inner 2 raters kappa----------------------------------*/
  92. %let start=1;%let id=1;
  93. %do i=&start. %to %eval(&n_raters.-1);
  94.         %do j=%eval(&i.+1) %to &n_raters.;
  95.                 %let rater1=%scan(&vars_rater.,&i.);
  96.                 %let rater2=%scan(&vars_rater.,&j.);
  97.                 data kappa_temp1 kappa_temp2 kappa_temp3 kappa_temp4 kappa_temp5 kappa_temp6;run;
  98.                 data kappa_temp1;
  99.                 set &dataset.(keep=&rater1. &rater2.);
  100.                 retain weight 1;
  101.                 run;
  102.                 proc tabulate data=kappa_temp1;
  103.                 class  &rater1. &rater2.;
  104.                 table &rater1.="" all="ALL",(&rater2. all="ALL")*n=""/box="&rater1." MISSTEXT="0";
  105.                 title "distribution of &rater1. and &rater2.";
  106.                 run;
  107.                 proc sql NOPRINT;
  108.                 select count(distinct &rater1.) into :n_rater1
  109.                 from kappa_temp1
  110.                 where  &rater1. is not null;
  111.                 select count(distinct &rater2.) into :n_rater2
  112.                 from kappa_temp1
  113.                 where  &rater2. is not null;
  114.                 create table kappa_temp2
  115.                 as select distinct &rater1.
  116.                         from kappa_temp1
  117.                         where &rater1. is not null
  118.                 union
  119.                         select distinct &rater2. as &rater1.
  120.                         from kappa_temp1
  121.                         where &rater2. is not null;
  122.                 quit;
  123.                 data kappa_temp3;
  124.                 set kappa_temp2;
  125.                 rename &rater1.=&rater2.;
  126.                 run;
  127.                 proc sql NOPRINT;
  128.                 create table kappa_temp4
  129.                         as select *
  130.                         from kappa_temp2,kappa_temp3;
  131.                         quit;
  132.                 data kappa_temp4;
  133.                 set kappa_temp4;
  134.                 retain weight 0;
  135.                 run;
  136.                 proc sql NOPRINT;
  137.                 create table kappa_temp5
  138.                         as select  &rater1.,&rater2.,weight
  139.                         from kappa_temp1
  140.                 union all
  141.                         select &rater1.,&rater2.,weight
  142.                         from kappa_temp4
  143.                         where sum(kappa_temp4.&rater1.*100,kappa_temp4.&rater2.) not in
  144.                                 (select sum(kappa_temp1.&rater1.*100,kappa_temp1.&rater2.) from kappa_temp1);
  145.                 quit;
  146.                 proc freq data=kappa_temp5 noprint;                /*Kappa Statistics*/
  147.                 table &rater1.*&rater2./agree;
  148.                 test kappa WTKAP;
  149.                 weight weight/zero;
  150.                 output out=kappa_temp6 agree;
  151.                 run;
  152.                 %if &n_rater1.=2 and &n_rater2.=2 %then %do;                /*Prepare for report*/
  153.                         data kappa_temp6(keep=name stat se ci stat3 p1 p2);
  154.                         set kappa_temp6;
  155.                         length name $ 18 stat 8 SE 8 CI $ 16 stat 8 stat 8 p1 8 p2 8;
  156.                         retain raters "&rater1. - &rater2.";
  157.                         name="McNemarS";Stat=_mcnem_;P2=p_mcnem;output;
  158.                                 name="";stat=.;se=.;ci="";stat2=.;stat3=.;p1=.;p2=.;
  159.                         name="简单Kappa系数";Stat=_KAPPA_;SE=E_KAPPA;
  160.                                 CI=cats(put(l_kappa,8.3),"~",put(U_KAPPA,8.3));stat2="Kappa=0检验"; stat3=z_KAPPA;
  161.                                 P1=mean(PR_KAPPA,PL_KAPPA);P2=P2_KAPPA;output;
  162.                         label name="统计方法" stat="统计量" SE="标准误" CI="95% CI" stat2="检验" stat3="Z值" P1="单侧P值" P2="双侧P值";
  163.                         run;
  164.                                 data kappa_temp6;
  165.                                 length id 8 raters $ 24;
  166.                                 set kappa_temp6;                               
  167.                                 n=_n_;
  168.                                 if n=1 then do;
  169.                                         id=%eval(&id.);
  170.                                         raters="&rater1. - &rater2.";
  171.                                         end;
  172.                                 drop n;
  173.                                 run;
  174.                         %end;
  175.                         %else %do;
  176.                                 data kappa_temp6(keep= name stat se ci stat3 p1 p2);
  177.                                 set kappa_temp6;
  178.                                 length name $ 18 stat 8 SE 8 CI $ 16 stat 8 stat 8 p1 8 p2 8;
  179.                                 retain raters "&rater1. - &rater2.";
  180.                                 name="对称性检验S";Stat=_tsymm_;P2=p_tsymm;output;
  181.                                         name="";stat=.;se=.;ci="";stat2=.;stat3=.;p1=.;p2=.;
  182.                                 name="简单Kappa系数";Stat=_KAPPA_;SE=E_KAPPA;
  183.                                         CI=cats(put(l_kappa,8.3),"~",put(U_KAPPA,8.3));stat2="Kappa=0检验"; stat3=z_KAPPA;
  184.                                         P1=mean(PR_KAPPA,PL_KAPPA);P2=P2_KAPPA;output;
  185.                                 name="";stat=.;se=.;ci="";stat2=.;stat3=.;p1=.;p2=.;
  186.                                 name="加权Kappa系数";Stat=put(_wtkap_,8.3);SE=put(E_wtkap,8.3);
  187.                                         CI=cats(put(l_wtkap,8.3),"~",put(U_wtkap,8.3));stat2="加权Kappa=0检验"; stat3=z_wtkap;
  188.                                         P1=mean(PR_wtkap,PL_wtkap);P2=P2_wtkap;output;
  189.                                 label name="统计方法" stat="统计量" SE="标准误" CI="95% CI" stat2="检验" stat3="Z值" P1="单侧P值" P2="双侧P值";
  190.                                 run;
  191.                                 data kappa_temp6;
  192.                                 length id 8 raters $ 24;
  193.                                 set kappa_temp6;                               
  194.                                 n=_n_;
  195.                                 if n=1 then do;
  196.                                         id=%eval(&id.);
  197.                                         raters="&rater1. - &rater2.";
  198.                                         end;
  199.                                 drop n;
  200.                                 run;
  201.                                 %end;
  202.                 %if &i.=1 and &j.=2 %then %do;
  203.                         data kappa_temp7;
  204.                         set kappa_temp6;
  205.                         run;
  206.                         %end;
  207.                         %else %do;;
  208.                         data kappa_temp7;
  209.                         set kappa_temp7 kappa_temp6;
  210.                         run;
  211.                         %end;
  212.                 %let id=%eval(&id.+1);       
  213.                 %end;
  214.                 %let start=%eval(&start.+1);               
  215.         %end;
  216. proc sql;
  217. create table kappa_temp8
  218.         as select avg(stat) as stat,avg(se) as se,"平均的简单Kappa系数" as name
  219.         from kappa_temp7
  220.         where name="简单Kappa系数"
  221. union
  222.         select avg(stat) as stat,avg(se) as se,"平均的加权Kappa系数" as name
  223.         from kappa_temp7
  224.         where name="加权Kappa系数";
  225. data kappa_temp8;
  226. length raters $ 24;
  227. set kappa_temp8;
  228. id=0;
  229. raters="All";
  230. run;
  231. data kappa_temp8;
  232. set kappa_temp8 kappa_temp7;
  233. run;
  234. proc print data=kappa_temp8 label noobs;                /*Report Kappa Statistics*/
  235.                 title "Kappa Statistics ";
  236.                 var id raters name stat SE  CI  stat3  p1  p2 ;
  237.                 run;
  238.                 proc datasets nolist ;
  239.                 delete kappa_: k_temp:;
  240.                 run;quit;
  241. %MEND;
  242. %KAPPA(dataset=k_temp3,vars_rater=rater1 rater2 rater3 );
复制代码
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
angeloliu + 1 + 1 + 1 强人呐,强人,实在是非常感谢
webgu + 50 + 50 + 3 + 3 + 3 强悍!

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

7
angeloliu 发表于 2013-3-11 17:13:28
moyunzheng 发表于 2013-3-11 11:13
结果是Categorical才能用kappa,如果是连续型的话用icc。

请参照以下链接:
非常感谢~~~

8
yushandour 发表于 2013-6-5 16:23:25
楼主,你的问题解决了吗?STATA里面倒是可以做多个观察者间的一致性

9
eagle277 发表于 2013-6-5 23:22:37
有用,谢谢

10
哎吆哎吆真是的 发表于 2016-5-22 20:04:43
楼主,您好,请问您的问题解决了吗?

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 18:41