首页 > 其他分享 >2023-09-25 配对卡方设计的非劣效检验的SAS实现

2023-09-25 配对卡方设计的非劣效检验的SAS实现

时间:2023-09-25 14:37:21浏览次数:42  
标签:非劣效 25 -& 09 检验 Tango Test pi lambda

近期的工作过程中,需要对配对设计的数据进行非劣效检验,因为SAS中目前没有现成的模块可以使用,因此负责的同事查询了很多文献资料来进行参考,最后选定的是Tango法来计算置信区间,以实现非劣效检验。对同事提供的培训分享中的参考文献进行了比较粗浅的学习,在此记录分享一下。

1 示例导入

以下示例为对学龄前儿童进行了两次阅读障碍测试(Test A和Test B),其结果可分为两次测试都正确(Correct-Correct),Test A正确但Test B不正确(Correct-Incorrect),Test A不正确但Test B正确(Incorrect-Correct),两次测试均不正确(Incorrect-Incorrect)。
Table1

2 等效性检验:McNemar检验

来自相同观测样本或匹配配对样本的两个proportions是相关的(correlated)。McNemar's test(1947)常用于对两个相关的proportions进行等效性检验

在上述示例中,零假设为Test A的检测正确率\(\pi_{1+}=[a+b]/n\)等于Test B的检测正确率\(\pi_{+1}=[a+c]/n\)。因为\(\pi_{11}\)是\(\pi_{1+}\)和\(\pi_{+1}\)的共同项,因此检验零假设\(\pi_{1+}-\pi_{+1}=0\)等价于检验\(\pi_{12}-\pi_{21}=0\)。零假设的McNemar检验统计量\(Q\)计算公式如下:

\[Q=\frac{(b-c)^2}{b+c} \]

在零假设下,当\(b+c\)大于10时,\(Q\)统计量遵循自由度为1的近似卡方分布。

3 非劣效检验-置信区间的计算:Tango Confidence Interval

参考文献SAS® Macros CORR_P and TANGO: Interval Estimation for the Difference Between Correlated Proportions in Dependent Samples 中介绍的Tango's score confidence interval 来计算配对率差的置信区间。

Tango提出的两个相关的proportions的差值的置信区间是通过迭代求解以下两个方程来估计的,直到估计的变化值(change)在预先设定的cutoff值以下。

\[\frac{b-c-n\lambda}{\sqrt{n(2\hat{\pi}_{21})+\lambda(1-\lambda)}}=\pm{Z_{\alpha/2}}\ \ \ (1) \]

\(\hat{\pi}_{21}\)的估计公式为:

\[\hat{\pi}_{21}=\frac{\sqrt{(B^2-4AC)-B}}{2A}\ \ \ (2) \]

其中,\(A=2n\),\(B=-b-c+(2n-b+c)\lambda\),\(c=-c\lambda(1-\lambda)\)。

尽管Tango CI的计算过程比Wald和调整后的Wald区间更复杂,但上下限很容易通过割线法找到,具有经验上良好的覆盖概率( Improved confidence intervals for the difference between binomial proportions based on paired data by Robert G. Newcombe, Statistics in Medicine, 17, 2635-2650 (1998)),并且可以应用于具有非对角线零单元的小样本。

割线法原理可见百度:割线法_百度百科 (baidu.com)

根据公式(1)可知,要求置信区间,需先得到\(\lambda\)值,而\(\lambda\)值则可通过割线法求解得到。具体的程序实现可参考文献:SAS® Macros CORR_P and TANGO: Interval Estimation for the Difference Between Correlated Proportions in Dependent Samples ,此处也附上我自己参考文献程序理解后写的宏程序:

/*---Tango---*/
/*割线法*/
%MACRO secant(x0,x1,Z,out);
/*--------------------------------
x0:初始值1
x1:初始值2
Z:百分位数
--------------------------------*/
data &out;
    /*迭代次数*/
    iteration=1;
    x0=&x0;
    x1=&x1;
    do until (abs(change)<0.000001);/*迭代停止条件*/
        /*位点1函数值*/
        lambda=x0;
        AA=2*&n;
        BB=-1*&b-&c+(2*&n-&b+&c)*lambda;
        CC=-1*&c*lambda*(1-lambda);
        q=(sqrt(BB**2-4*AA*CC)-BB)/(2*AA);
        /*fx0分情况考虑:分母为0与分母不为0*/
        if (&n*(2*q)+lambda*(1-lambda)>=0) then fx0=&b-&c-&n*lambda-&z*sqrt(&n*(2*q+lambda*(1-lambda)));
        if (&n*(2*q)+lambda*(1-lambda)<0) then fx0=&b-&c-&n*lambda;

  
        /*位点2函数值*/
        lambda=x1;
        AA=2*&n;
        BB=-1*&b-&c+(2*&n-&b+&c)*lambda;
        CC=-1*&c*lambda*(1-lambda);
        q=(sqrt(BB**2-4*AA*CC)-BB)/(2*AA);
        /*fx0分情况考虑:分母为0与分母不为0*/
        if (&n*(2*q)+lambda*(1-lambda)>=0) then fx1=&b-&c-&n*lambda-&z*sqrt(&n*(2*q+lambda*(1-lambda)));
        if (&n*(2*q)+lambda*(1-lambda)<0) then fx1=&b-&c-&n*lambda;
  
        /*位点1与位点2的割线值*/
        secant=(fx1-fx0)/(x1-x0);

        /*迭代位点*/
        x2=x1-(fx1/secant);

        /*位点差值*/
        change=x2-x1;

        /*继续迭代*/
        x0=x1;
        x1=x2;
        iteration=iteration+1;
    end;
    keep x1;
run;
%MEND secant;

  

/*TangoCI*/
%MACRO tangoci(indata,outdata,uid,row,col,level,alpha,format);

proc sql noprint;
    select count(&uid) into : n from &indata;
    select count(&uid) into : a from &indata where &row =  &level and &col =  &level;
    select count(&uid) into : b from &indata where &row =  &level and &col ne &level;
    select count(&uid) into : c from &indata where &row ne &level and &col =  &level;
    select count(&uid) into : d from &indata where &row ne &level and &col ne &level;

    select probit(1-&alpha/2) into : ZL from &indata;
    select probit(&alpha/2) into : ZU from &indata;
quit;

  
/*调用割线法宏求置信区间上下限*/
%secant(-0.9999,0.9999,&zl,cll);
%secant(-0.9999,0.9999,&zu,clu);


data &outdata;
length dif $40. cll 8. clu 8. cl $40.;
    merge cll(rename=(x1=cll)) clu(rename=(x1=clu));
    dif=put((&b-&c)/&n,&format);
    cl=cat("(",strip(put(cll,&format)),", ",strip(put(clu,&format)),")");
run;

  
/*清除过程所用数据集*/
proc datasets lib=work noprint;
    delete cll clu;
quit;

%MEND tangoci;

标签:非劣效,25,-&,09,检验,Tango,Test,pi,lambda
From: https://www.cnblogs.com/pluuus230713/p/17727850.html

相关文章

  • 925打卡
    1.合并两个有序链表(21)将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*List......
  • 2023.9.25——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午上课,下午学习。我了解到的知识点:1.软件设计模式;2.做软件要根据客户需求;明日计划:1.上课;......
  • 20230925 模拟赛总结
    模拟赛连接排名:\(\text{rank1}\)分数:\(100+100+100+100=400\)集训期间第二次AK!T1:灭火/fire题目描述:求出\(n\)个数\(a_1,a_2,\dots,a_n\)的和除以\(m\)向上取整的结果。(\(0<a_i,m<2^{63},0<n\le20\))思路:直接求和,然后向上取整即可,注意要用高精度,我用的是__int128......
  • 23/09/20 模拟赛总结
    时间安排7:50-8:00看A。8:00-9:30想了想性质,得到了一个假做法,直接莽上去了。9:30-10:20手造了一组数据,发现做法假了,开始打暴力的分段(然而海伦公式丢精度,最后只有\(20\)分)。10:20-11:00看B。写了B的\(50\)分暴力,但是眼瞎没看到数据范围,搞成了\(O(n^4)\),直......
  • 23/09/24 模拟赛总结
    时间安排8:10-8:15读题,BCD都毫无思路。8:15-8:30A题的60分暴力很好拿,15min敲完。8:30-9:05B题没想法,打完爆搜走人。9:13-9:20C题没想法,打完\(O(n^3)\)走人。9:20-9:45D题一个部分分都不会写。。。瞪眼\(25\)分钟走人。9:45-10:50继续观察......
  • FlashDuty Changelog 2023-09-21 | 自定义字段和开发者中心
    FlashDuty:一站式告警响应平台,前往此地址免费体验!自定义字段FlashDuty已支持接入大部分常见的告警系统,我们将推送内容中的大部分信息放到了Lables进行展示。尽管如此,我们用户还是会有一些扩展或定制性的需求,比如人工标记一个故障是否为误报。因此我们提供了自定义字段功能,......
  • 【2023-09-22】休息空间
    20:00心太小了,所有的小事就大了。心大了,所有的大事都小了。                                                 ——丰子恺昨晚何太下班晚,也不想她太折腾,就睡酒店了。说......
  • 2023-09-23-周日
    1),今天去骑行成都锦城绿道·天府绿道了所以一天也没干什么..就和ice,tyj,zk一起骑共享单车从早上9:00出发,,,到晚上9:00才骑行完毕..哭死......
  • 【2023-09-23】连岳摘抄
    23:59返照斜初彻,浮云薄未归。江虹明远饮,峡雨落馀飞。凫雁终高去,熊罴觉自肥。秋分客尚在,竹露夕微微。                                                 ——唐·杜甫《晚......
  • 内容搬迁至 SegmentFault #49a425
    https://www.cnblogs.com/zerofc/p/8710100.htmlhttps://www.cnblogs.com/zerofc/p/8710123.htmlhttps://www.cnblogs.com/zerofc/p/9038875.htmlhttps://www.cnblogs.com/zerofc/p/9940336.htmlhttps://www.cnblogs.com/zerofc/p/9974564.htmlhttps://www.cnblogs.com/z......