QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2538|回复: 0
打印 上一主题 下一主题

[其他资源] 净重新分类指数NRI的计算

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-12 18:43 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    " B' N& D2 O3 x  `. p& h净重新分类指数NRI的计算5 Y2 @7 F$ W* [2 g, ~6 m4 k
    “ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。
    - D2 Z* ^; N7 K5 z- V* v& _  c+ W+ cNRI,net reclassification index,净重新分类指数,是用来比较模型准确度的,这个概念有点难理解,但是非常重要,在临床研究中非常常见,是评价模型的一大利器!
      m$ z* h* O0 x6 d; i1 W
    ) |3 Z0 V7 N' W1 n0 M在R语言中有很多包可以计算NRI,但是能同时计算logistic回归和cox回归的只有nricens包,PredictABEL可以计算logistic模型的净重分类指数,survNRI可以计算cox模型的净重分类指数。
    , g' q- v5 {  w5 G7 X, P/ c- E
    $ {+ X: x; c/ a2 N- L" vlogistic的NRI: s8 l8 H- f  x5 ~/ d; R) T6 L0 h+ E0 C
    nricens包3 p9 ?6 C1 @  e" m" `* P
    PredictABEL包1 Z; A8 d. h* c% `
    生存分析的NRI
    8 s. W$ M& h2 p# y* h& z: dnricens包
    ( c% [$ a- x2 Z4 }/ MsurvNRI包! ?% J& L, [! L. f
    logistic的NRI; h6 [2 W3 p7 C
    nricens包
    9 I/ ~. m4 N1 ]$ L$ H5 U#install.packages("nricens") # 安装R包: o+ W$ w' I- i5 l) Q
    library(nricens)
    & ?7 Q7 M. e  N  `1* f2 |$ n+ `. \
    ## Loading required package: survival3 V# y' t; j$ `' R1 p" a0 M
    11 x2 G. H% Q: Q9 ~. |5 `
    使用survival包中的pbc数据集用于演示,这是一份关于原发性硬化性胆管炎的数据,其实是一份用于生存分析的数据,是有时间变量的,但是这里我们用于演示logistic回归,只要不使用time这一列就可以了。2 S5 L0 k% q& m: A) z

    5 P+ a% p* ]! d" T- j% L; k/ Mlibrary(survival)  a" f. Z+ E" \7 Z1 }3 q- D) e

    . B. P) A+ G- z2 c# 只使用部分数据5 C$ \4 s! d. q
    dat = pbc[1:312,] 3 ^& [4 P- F7 V/ ^* k
    dat = dat[ dat$time > 2000 | (dat$time < 2000 & dat$status == 2), ]+ @( O1 v6 v! \: F7 l( ^9 a

    4 S0 R7 _5 r3 }  w. g7 Ostr(dat) # 数据长这样" e7 q( [' x% q5 \7 R7 j
    16 B& J2 W! u# R! v2 F, h) b
    ## 'data.frame': 232 obs. of  20 variables:# w0 Z# _& E7 u- s
    ##  $ id      : int  1 2 3 4 6 8 9 10 11 12 ...* H7 A3 [; ?- N% {. @5 b
    ##  $ time    : int  400 4500 1012 1925 2503 2466 2400 51 3762 304 ...( U  `$ t8 n% h4 ?3 V: l3 v1 S
    ##  $ status  : int  2 0 2 2 2 2 2 2 2 2 ...
    1 F+ J# f, ~" L9 D8 y##  $ trt     : int  1 1 1 1 2 2 1 2 2 2 ...
    : |4 ?. }; d/ U- ?$ M##  $ age     : num  58.8 56.4 70.1 54.7 66.3 ...+ N7 d8 C4 ~8 ]" J
    ##  $ sex     : Factor w/ 2 levels "m","f": 2 2 1 2 2 2 2 2 2 2 ...
    - h! ]! n! X- p. R3 c% E##  $ ascites : int  1 0 0 0 0 0 0 1 0 0 ...$ W! e7 }6 T5 h# Y" L
    ##  $ hepato  : int  1 1 0 1 1 0 0 0 1 0 ..., k2 M0 X8 v+ O: P% ~7 @( G
    ##  $ spiders : int  1 1 0 1 0 0 1 1 1 1 ...+ z/ r6 c) }2 V! I4 }) U; K" v
    ##  $ edema   : num  1 0 0.5 0.5 0 0 0 1 0 0 ...! @* c: c; t2 c
    ##  $ bili    : num  14.5 1.1 1.4 1.8 0.8 0.3 3.2 12.6 1.4 3.6 ...4 l) z! Z" G1 E2 \: X( _
    ##  $ chol    : int  261 302 176 244 248 280 562 200 259 236 ...5 k4 X; X1 J$ o3 e& r  b
    ##  $ albumin : num  2.6 4.14 3.48 2.54 3.98 4 3.08 2.74 4.16 3.52 ...9 }! W  e: `+ J5 C
    ##  $ copper  : int  156 54 210 64 50 52 79 140 46 94 ...
    ( ^, a/ B3 x! p: i##  $ alk.phos: num  1718 7395 516 6122 944 ...
    " p5 G9 H$ ^1 O##  $ ast     : num  137.9 113.5 96.1 60.6 93 ...
    5 N$ n6 q. q" y1 B##  $ trig    : int  172 88 55 92 63 189 88 143 79 95 ...: H8 o, j5 t" Q- a, A7 y2 {' J2 c
    ##  $ platelet: int  190 221 151 183 NA 373 251 302 258 71 ...
    % T  i. g0 W3 ?! Y##  $ protime : num  12.2 10.6 12 10.3 11 11 11 11.5 12 13.6 ...
    ! I  J' I% _3 D  Q+ v/ @##  $ stage   : int  4 3 4 4 3 3 2 4 4 4 ...
    ! X- l( w9 i7 d8 U9 l  _& V0 \! D! @* o/ ^6 v
    17 u. x( {9 c4 I
    dim(dat) # 232 20
    , P4 P! w. e  y1
    1 Q9 D) a9 f; Z## [1] 232  203 ~" y6 t* O- T0 ^8 I; z4 ]- c
    13 T& Y/ B$ m6 u" S7 \
    然后就是准备计算NRI所需要的各个参数。5 q3 |" t4 V) ~! b

    6 y7 F" P( s4 e  a" X# 定义结局事件,0是存活,1是死亡
    0 ]1 ^3 v9 m: l+ s  v$ l: Devent = ifelse(dat$time < 2000 & dat$status == 2, 1, 0)
    # @' q& G4 }$ G. r$ k" p/ a: i# P2 F: U: Z$ Q4 Z  y; W2 N
    # 两个只由预测变量组成的矩阵
    % o& f1 e' v, Y6 c7 C2 Oz.std = as.matrix(subset(dat, select = c(age, bili, albumin)))" L4 ?) M# |' j, @: }! y3 V4 U
    z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))
    1 I/ S! g& Y1 U
    $ Q0 K3 i( f0 ?2 D" k9 V- t: U# 建立2个模型2 A0 U0 f: ^: a$ k$ ?+ Y6 Q: s
    mstd = glm(event ~ age + bili + albumin, family = binomial(), data = dat, x=TRUE)& k: g! U# z# Q# [& C, s+ m3 t
    mnew = glm(event ~ age + bili + albumin + protime, family = binomial(), data = dat, x=TRUE)
    2 C# e3 F4 v) r& }% }9 u8 g. G" {
    # 取出模型预测概率
    * U# e, W+ P1 Y8 y+ q' P: \1 Dp.std = mstd$fitted.values
    6 X8 w6 A  y" v* Lp.new = mnew$fitted.values
    9 W; G1 j! v9 A+ K: L
    ) i9 u% d5 G: ?3 w1
    , r% S' R# ]. @- K/ j' M! T: m( v然后就是计算NRI,对于二分类变量,使用nribin()函数,这个函数提供了3种参数使用组合,任选一种都可以计算出来(结果一样),以下3组参数任选1组即可。 mdl.std, mdl.new 或者 event, z.std, z.new 或者 event, p.std, p.new。" Q) m+ X5 U( T7 m
      B4 F- {4 A- `2 k; P8 ~  K& w; l
    # 这3种方法算出来都是一样的结果
    9 Z% r' J# D9 Z2 Q% m3 z2 R  g: F" j# [( z9 v
    # 两个模型
    8 t: v. r- k$ o# Ynribin(mdl.std = mstd, mdl.new = mnew,
    ( C' B' u2 f: `* [7 g8 B       cut = c(0.3,0.7), % a* B! f8 R2 m# L
           niter = 500,   E, l0 n. ~* F  d
           updown = 'category')9 S( k7 O* N) o+ M5 |+ X) S

    ; D, I. m% P: s# 结果变量 + 两个只有预测变量的矩阵
    $ _( l+ W2 B7 G3 u* z& S& Cnribin(event = event, z.std = z.std, z.new = z.new,
    % F' v; x% Y- g$ p7 E" ]5 T       cut = c(0.3,0.7),
    ' e; t( l. Q1 L# t  ]2 s! B+ b       niter = 500, + E$ A5 Q; [8 L" b4 z) r7 f
           updown = 'category')
    . o) J5 [+ d. }4 \% x0 T! d( W/ G. [1 H
    ## 结果变量 + 两个模型得到的预测概率
    ' C! V, C$ H" _. u' mnribin(event = event, p.std = p.std, p.new = p.new,
    2 i8 V. D. t# g$ i( m       cut = c(0.3,0.7), 8 f, _! x4 t8 g& L: \+ K" L
           niter = 500,
    - n  C2 f5 P  \+ B5 W       updown = 'category')
    ; }' a3 D# c$ Z4 a
    ) Q2 y1 z/ u% L4 V7 s1 z1; \2 H4 y# `" \) D4 |
    其中,cut是判断风险高低的阈值,我们使用了0.3,0.7,代表0-0.3是低风险,0.3-0.7是中风险,0.7-1是高风险,这个阈值是自己设置的,大家根据经验或者文献设置即可。$ k4 \4 w$ T% I+ ^7 d
    ) y! M& P2 G# Y; s6 `
    niter是使用bootstrap法进行重抽样的次数,默认是1000,大家可以自己设置。
    ; R" x; V" m( I( a9 M' t$ ~6 F; W4 z' X# r. E7 L7 e! J- i6 u( B7 }$ M( f
    updown参数,当设置为category时,表示低、中、高风险这种方式;当设置为diff时,此时cut的取值只能设置1个,比如设置0.2,即表示当新模型预测的风险和旧模型相差20%时,认为是重新分类。
    5 R! c' k( `5 m8 r7 ^( u0 p  \1 P6 X
    上面的代码运行后结果是这样的:' K0 g; Z' a7 ~0 H5 |9 }
    2 a1 o8 I8 s, S
    UP and DOWN calculation:
    % W9 [7 d# l" k& y  #of total, case, and control subjects at t0:  232 88 1447 D- B/ i0 T  m" [2 ~5 C
    3 g  v0 X8 L$ V  x$ ^
      Reclassification Table for all subjects:3 R7 [9 S! h4 |% c
            New
    $ w6 ]' o! s! H$ j$ t1 E3 FStandard < 0.3 < 0.7 >= 0.7
    / k! R5 w3 H- @) a, v  < 0.3    135     4      04 P) q% |. b1 Z9 A
      < 0.7      1    31      4  a6 M& j* M0 [* }
      >= 0.7     0     2     55
    3 r) c- O. [9 L1 C, K2 D$ W% [+ V, G' [
      Reclassification Table for case:+ y& Z2 I8 L7 t
            New$ M) O% m+ w, S" v
    Standard < 0.3 < 0.7 >= 0.70 ?/ K5 r8 z$ |! X7 @
      < 0.3     14     0      0
    # X8 r* g5 |8 n0 B  < 0.7      0    18      3. Z" }- {" ^& h" C
      >= 0.7     0     1     52
    6 \. f6 e" t3 E" U) \+ k0 t2 q& u, u9 {9 D1 Q) D
      Reclassification Table for control:" i0 F1 `$ C7 K+ c
            New* `/ G3 Z3 _9 d; w6 T. V, G' Y: \  R
    Standard < 0.3 < 0.7 >= 0.7/ X) T! {/ Z; g- v
      < 0.3    121     4      0
      }* j7 Q6 s$ Q) s6 R- v4 e! P* c  < 0.7      1    13      1
    8 e* e6 x$ [$ u  >= 0.7     0     1      3" V' M5 a7 \' N( G

    9 |6 v- ]' `$ v/ YNRI estimation:
    ) A8 ]; Q! S  I+ S" f, zPoint estimates:. B8 c8 o% s/ ?; B
                      Estimate
      l4 a; B% K$ _6 ], ZNRI            0.0018939399 _. m  {9 L6 n/ \
    NRI+           0.022727273
    3 h9 \3 V# _7 J% I* d. nNRI-          -0.020833333+ R5 {, z& |$ _; B" U
    Pr(Up|Case)    0.034090909
    ) d2 p  m  F& w- W9 t- DPr(Down|Case)  0.011363636
    : Z+ T5 W/ q5 A0 @% ^/ y% W, |Pr(Down|Ctrl)  0.013888889
    1 ~9 i4 U% T5 T* z7 K3 `  TPr(Up|Ctrl)    0.0347222223 C) i! S$ X+ G$ @% F% I) U6 Q
    6 ?+ O' Y" R, P: \6 J( G$ S+ t
    Now in bootstrap..  f; T, G$ x  L

    5 s+ t! V9 \" N& aPoint & Interval estimates:2 f8 L  b+ s( x$ I  h0 C% Q
                      Estimate   Std.Error        Lower       Upper
    ( C: z( O( V2 u3 k/ F- G& u6 \NRI            0.001893939 0.027816095 -0.053995513 0.055354449, r- m& ^- q! ], n7 y) h" Q
    NRI+           0.022727273 0.021564394 -0.019801980 0.065789474
    0 r) {  p6 Q( r5 nNRI-          -0.020833333 0.017312438 -0.058823529 0.007518797
    , l0 @6 E  X1 k; mPr(Up|Case)    0.034090909 0.019007629  0.000000000 0.072164948
    4 e; k: W4 g6 f3 p+ VPr(Down|Case)  0.011363636 0.010924271  0.000000000 0.039603960
    5 f. a, s" u7 FPr(Down|Ctrl)  0.013888889 0.009334685  0.000000000 0.035211268
    % _& C4 ^7 I, ~% I  mPr(Up|Ctrl)    0.034722222 0.014716046  0.006993007 0.0661764711 ?  t5 Q0 R8 j5 T$ q/ a5 q

    $ S7 X( b, y) ]& }) a$ G5 i1. P$ ?2 l' x5 l6 E
    首先是3个混淆矩阵,第一个是全体的,第2个是case(结局为1)组的,第3个是control(结局为2)组的,有了这3个矩阵,我们可以自己计算净重分类指数。
    ) S/ b9 d5 D) a  E) X  t
    3 P- f8 J( F9 X! ^. }) g! [看case组:+ }. ]* ~9 N, P$ N( T

    9 m' y) l2 f  y) d2 u净重分类指数 = ((0+3)-(0+1)) / 88 ≈ 0.022727273
    : j* \$ k5 W. j$ K5 r3 [  ?2 }2 k5 {6 K4 ]& j5 B* @: S
    再看control组:; q; P1 z% E( Y0 e$ N! ?
    2 ]) t; A9 Z1 [/ u
    净重分类指数 = ((1+1)-(4+1)) / 144 ≈ -0.020833333
    2 I* e, e2 e* u" H) V2 h; F" k/ L( `7 H* H4 i4 B
    相加净重分类指数 = case组净重分类指数 + control组净重分类指数 = 2/88 - 3/144 ≈ 0.000315657
    4 B3 P/ p, M" a( I6 V4 V7 N& F/ @7 n$ n, ^9 h. B
    再往下是不做bootstrap时得到的估计值,其中NRI就是绝对净重分类指数,NRI+是case组的净重分类指数,NRI-是control组的净重分类指数(和我们计算的一样哦),最后是做了500次bootstrap后得到的估计值,并且有标准误和可信区间。4 q2 l2 v; J& q4 j. h# m
    * G+ T7 n" M( w8 X# d- m; T
    最后还会得到一张图:
    ! o: F1 K( O9 t' n1 P: B6 N' w9 r$ V% B' d) F( b3 s% Z5 l
    这张图中的虚线对应的坐标,就是我们在cut中设置的阈值,这张图对应的是上面结果中的第一个混淆矩阵,反应的是总体的情况,case是结果为1的组,也就是发生结局的组,control是结果为0的组,也就是未发生结局的组。
    % M. O' W; b* ?% A( V, P* x# B$ l: Y4 z) k2 z9 J
    P值没有直接给出,但是可以自己计算。
    % e( }% y3 G6 P  S, b# |- y  `5 e
    / k8 O# [0 {  t6 W+ Z# 计算P值
    * M( {* K0 A( v* _' Dz <- abs(0.001893939/0.027816095)
    3 a  d' @2 O, a0 W& rp <- (1 - pnorm(z))*2
    3 s. A* K& Z9 B9 ^5 ]* M, f" M) Kp
    , P. M* {+ E* l5 G8 _' C7 |15 o- x, k3 d8 |
    ## [1] 0.9457157
    6 f% w; n# c  d$ A& w7 K3 R& y. Q1* F, K; F  u' z* n, ?
    PredictABEL包
    % ^5 E" w: W! G( j. G  s5 p#install.packages("PredictABEL") #安装R包
    ( `% r- s% o/ Q9 i0 e8 S6 Llibrary(PredictABEL)  
    7 C) Z0 d3 i' p- J6 z% t* }1 S( Q. u# d* d% |6 v, |! }
    # 取出模型预测概率,这个包只能用预测概率计算5 |7 M* u2 D3 V/ W9 `
    p.std = mstd$fitted.values
    # A9 Q, m/ `/ H9 Q$ E# sp.new = mnew$fitted.values
    & d4 i$ e# \1 l) k% F  h1
      P9 M- _% M; ?! z0 j然后就是计算NRI:2 R  G& n& t3 ]- n, v2 }
    1 i6 m+ D  {9 h8 h; q
    dat$event <- event
    . v% u! k; Q) z: S. H
    ( l% {" ^  l7 l% V+ J9 X9 R+ yreclassification(data = dat,7 u* {- H. K: k9 X' t, X  k
                     cOutcome = 21, # 结果变量在哪一列8 n% {/ c, h1 u. r
                     predrisk1 = p.std,7 o6 f. T1 E# l! G. D. W' k/ o  V( s
                     predrisk2 = p.new,% V: F2 Z, U' S+ ?6 Q7 z; C+ e
                     cutoff = c(0,0.3,0.7,1)
    , C! r6 N1 [( s" B/ Q                 )
    " t8 [/ `6 I2 M1, y1 M1 e+ ]. n# W3 c& `- h! q
    ##  _________________________________________# O* E0 }  q+ o# ^& ]& B1 q8 a+ d
    ##  
    # q. U7 d- ^! `3 u##      Reclassification table    2 M* W6 s; J( M" X1 {6 }
    ##  _________________________________________
    2 N' n# [, L- S: j3 g) W$ |: V## , [) c" x) b9 Z3 d6 s! p
    ##  Outcome: absent $ u  a0 }+ M$ ^+ k: E
    ##   7 l; Q% s  [1 w) G+ y) y8 j
    ##              Updated Model
    3 V* X6 c* o7 M. B% F## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified
    , v7 t2 v0 X0 R##     [0,0.3)       121         4       0               3& E: W! s, [6 B; M2 ~
    ##     [0.3,0.7)       1        13       1              13( m1 c5 X$ b8 n: ^  P8 K3 L
    ##     [0.7,1]         0         1       3              25" y# D( }$ i% t( W4 m) f9 v* L
    ## - L' [3 h9 J2 p7 F/ q" p
    ##  
    ' [9 p: r% f- A$ ]5 G; ^##  Outcome: present . d* [+ ^1 i1 y+ [$ Q, Z
    ##   . b' J( ^9 `; `. \1 x# r
    ##              Updated Model
      X; `' S" _8 q## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified
    $ G! g. _4 A, \##     [0,0.3)        14         0       0               0
    ' [# y0 l/ i/ {# ?' [##     [0.3,0.7)       0        18       3              14  n2 L8 ^3 D" H  g4 K
    ##     [0.7,1]         0         1      52               2$ K% [$ ]$ P, x: |* z. x3 g
    ## ( m/ \8 D, }# D# M" V, H, m0 z
    ##  
    # m9 g4 g3 Q  k5 O1 [##  Combined Data & P9 r2 T1 i6 M6 Y
    ##   ! I2 L( K# I0 \2 w. V* x0 A
    ##              Updated Model+ m, ]7 h  F. W. }5 t; ^
    ## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified2 L" i3 o3 b" V0 h
    ##     [0,0.3)       135         4       0               3: J& n" X3 _- N! O# K% I0 j3 v/ p1 B
    ##     [0.3,0.7)       1        31       4              14$ A# h4 J  U% u4 W! P, P6 `
    ##     [0.7,1]         0         2      55               4
      Y+ W+ V0 a/ K: f+ b  A2 f- ^6 ~##  _________________________________________0 v- l: M# t9 s; ~. R% c' I' i
    ## 4 b  l. N3 v, T" N# F7 D
    ##  NRI(Categorical) [95% CI]: 0.0019 [ -0.0551 - 0.0589 ] ; p-value: 0.94806
    $ @2 V* @2 t8 y1 J1 f+ O8 S##  NRI(Continuous) [95% CI]: 0.0391 [ -0.2238 - 0.3021 ] ; p-value: 0.77048 ' @0 \" \* D# r- l6 @
    ##  IDI [95% CI]: 0.0044 [ -0.0037 - 0.0126 ] ; p-value: 0.28396$ I! c5 `7 f. A& x  q
    4 [. f0 o% m  J. L
    1
    0 A3 S+ N' |/ _结果得到的是相加净重分类指数,还给出了IDI和P值。两个包算是各有优劣吧,大家可以自由选择。
    6 P( N2 W: X! H0 t7 r4 i* G( E8 m1 u% z) ?) _" K* i1 c8 j) ]
    生存分析的NRI- F! d! ?# _( ?' M2 @4 R! J
    还是使用survival包中的pbc数据集用于演示,这次要构建cox回归模型,因此我们要使用time这一列了。. N6 w' S7 _7 h* d# K1 P

    . @2 [  a8 L- o3 w- H5 {nricens包
    / `) k% a4 b/ p" ?library(nricens)
    3 ^0 a/ N" E5 X* C" Q* c6 A6 glibrary(survival)
    + n/ [+ K. I: x  |0 b: B( d
    6 A) ]! D/ I# v: hdat <- pbc[1:312,]
    : T$ Q- p( i0 Y% m: G5 b6 w' Kdat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡
    , A5 y% w! `1 J7 {4 k17 p4 s! t3 S; n! J% O3 J
    然后准备所需参数:7 y# }" Q1 a; \% C! d5 i+ r

    ! Z  b& e* y7 p4 p# 两个只由预测变量组成的矩阵
    # e, x" ]0 n, V1 G: fz.std = as.matrix(subset(dat, select = c(age, bili, albumin)))* n' A: U; x# O% W# R" ]" D
    z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))" W2 U( A! G- U8 N3 o2 o" J
    & p* r' U1 i6 @6 M# ?) v' M
    # 建立2个cox模型
    % X3 |& c& V8 n. D" r9 O* Lmstd <- coxph(Surv(time,status) ~ age + bili + albumin, data = dat, x=TRUE)
    3 }' X1 a. K7 M5 Dmnew <- coxph(Surv(time,status) ~ age + bili + albumin + protime, data = dat, x=TRUE)1 n1 N* T: n" _5 [; _. z

    1 o4 u  F$ U, u/ d# 计算在2000天的模型预测概率,这一步不要也行,看你使用哪些参数) I3 }2 _. e" m- m. Q
    p.std <- get.risk.coxph(mstd, t0=2000)% ~) D2 f1 [# S
    p.new <- get.risk.coxph(mnew, t0=2000)
    % Y, @6 I) }0 W! v1
    ' Z. m) I( X1 F( j& m! S4 ~, j计算NRI:
      v; M5 U9 W4 z% J/ o! D# _( e5 g. Q7 g3 r" {
    nricens(mdl.std= mstd, mdl.new = mnew, + x8 [+ u" D9 Q* I, [7 M( u2 B
            t0 = 2000, " i3 F7 I! V9 W; [
            cut = c(0.3, 0.7),
    ( \" V# L1 e1 }% }        niter = 1000, ! @) {$ m4 u: ~. F7 i
            updown = 'category')
    0 \4 z& W: o$ O5 d+ m9 n) c9 M  O0 m- A, C
    UP and DOWN calculation:
    ' V$ x5 Z+ [! k) N- E. ^+ P  #of total, case, and control subjects at t0:  312 88 144$ ?6 }6 P( d/ n

    # P% n% A! T( R( C8 o. t- q0 ]  Reclassification Table for all subjects:5 U* Z! s) {6 i6 H. Q5 E% I3 x
            New! ]. ^) E6 Q/ }+ e& l
    Standard < 0.3 < 0.7 >= 0.75 F# `# ?* l0 T4 F/ T1 [0 V+ Q7 e0 u
      < 0.3    202     7      0
    2 l$ A: F$ w& ^2 L+ {  < 0.7     13    53      6
    6 }' ?! k7 k0 X: d" z' [  >= 0.7     0     0     312 f$ t+ L1 d, Y% W

    + R( ^1 i5 M4 p5 w) E: G  Reclassification Table for case:
    , K. `. \4 B$ I& t; M# f" n        New& J( Z- x( v9 D* b" Q' n6 u( ]
    Standard < 0.3 < 0.7 >= 0.7" M0 m5 y# ]/ M
      < 0.3     19     3      0
    7 Q- K1 {1 J/ ^' r: s5 T  < 0.7      3    32      42 m( [- V; V4 L
      >= 0.7     0     0     274 Q' v* Q: ?  z7 q# x7 p

    " p/ |2 m0 w, |, L3 R4 F0 p* M8 J  Reclassification Table for control:! ^  L/ g5 k) r1 {/ x9 g' o# c3 ]& D
            New3 l6 B5 [* b9 Q& J) y) H
    Standard < 0.3 < 0.7 >= 0.7
    3 [8 J/ g, ^5 E+ @7 Y  < 0.3    126     3      0
    / k; F0 ?& y" x# v1 J% ]  < 0.7      5     7      25 f9 a; A% n2 v# C1 d
      >= 0.7     0     0      1
    8 X7 D/ p' F. v3 x. A0 L
    . e  G* M/ M- k& nNRI estimation by KM estimator:" Y! u& k' Q, ?1 K

    0 k/ c0 y) D6 JPoint estimates:9 i  o% ^" e/ b! [0 `
                    Estimate
    ' L5 g8 x1 d: jNRI           0.05377635/ i$ \0 H3 ~8 G8 c
    NRI+          0.03748660
    8 B5 ~6 m. o" {& ~NRI-          0.01628974
    * C+ c# F  r3 s0 qPr(Up|Case)   0.07708938
    + D2 x6 B  t" D; {% }* K3 M0 @" xPr(Down|Case) 0.03960278
    8 `$ [) p7 {& N2 iPr(Down|Ctrl) 0.042563528 P# p4 {# o4 U. S4 t- U8 Y
    Pr(Up|Ctrl)   0.02627378! r" Y* j! D- y. Q8 v

    2 {' S+ g: f# d- h3 a0 nNow in bootstrap..
    , }- b4 N5 r2 B& n, N" b5 R+ s$ R: a4 s+ {# @! F1 [4 Z! U
    Point & Interval estimates:$ A% l* z6 r& O: P, d: l! ]
                    Estimate        Lower      Upper% T  m! n$ `' u! M+ b
    NRI           0.05377635 -0.082230381 0.16058172
    7 n  R3 z$ w+ s4 aNRI+          0.03748660 -0.084245197 0.13231776
    : q8 Y) x; }5 e- g1 R+ XNRI-          0.01628974 -0.030861213 0.067536162 @* p# V3 `! \
    Pr(Up|Case)   0.07708938  0.000000000 0.19102291
    / l  o' @' q/ R7 f5 L: [/ ePr(Down|Case) 0.03960278  0.000000000 0.15236016- d  h( w. p; L% G
    Pr(Down|Ctrl) 0.04256352  0.004671535 0.09863170
    & U/ l" M0 U0 @6 U. VPr(Up|Ctrl)   0.02627378  0.006400463 0.05998424& V4 i9 E/ d! T+ N) U+ V2 U
    % Y, p( _) l! |- O
    1" ~; u& F) s, ?! {2 V* a1 w& X

    1 _8 W  G% K# `, JSnipaste_2022-05-20_21-49-38; H: T" L, L# @8 A
    结果的解读和logistic的一模一样。1 F' p) k: L) r6 K
    3 A) d0 W) `1 F7 @
    survNRI包% Q& V9 K& L# V5 i! L6 q, c- l
    # 安装R包( W; g7 l- f/ U9 ^5 n
    devtools::install_github("mdbrown/survNRI"); A  d& [2 B6 ], R3 ]
    1/ q9 U$ J0 p% I, u+ L4 Q! N3 h, u
    加载R包并使用,还是用上面的pbc数据集。+ H$ J. Y! p3 W( L
    9 ~8 p" @5 ?; }3 b% \: k8 v4 `4 z
    library(survNRI)5 K+ G* n$ @& ]: m
    1* `+ c- \* c/ |7 W
    ## Loading required package: MASS+ V8 J8 j9 M1 U! h! x4 ^1 h
    1, `  ^4 Y0 U6 h, ^
    library(survival); O# t% \8 e1 Q$ s! l
    " Z$ K6 i/ F: M2 N3 K8 A  b
    # 使用部分数据
    ! }2 z, T' G  Ndat <- pbc[1:312,]8 Y5 H* l* x  H- x: O
    dat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡4 j, W3 @2 F7 A! Q8 ^- N
      D5 P& m' S2 H' _/ g' C; W; N
    res <- survNRI(time  = "time", event = "status",
    & q% o: [% H' ?" p' m- W5 Z        model1 = c("age", "bili", "albumin"), # 模型1的自变量& I5 H  X/ A) P5 U  _
            model2 = c("age", "bili", "albumin", "protime"), # 模型2的自变量" s& H5 w+ ]. a; t: x1 L
            data = dat,
    3 k( h$ j& h: x        predict.time = 2000, # 预测的时间点
    . K, @  t6 @* L! @2 e7 y        method = "all",
    2 |0 v3 M( t/ [8 L8 X- ?        bootMethod = "normal",  
    * o+ P; e1 _3 @1 R$ u        bootstraps = 500,
    6 m  c+ p- W+ b  T/ N        alpha = .05)
    - |- `/ T: o( L' C% z- t
    / O7 O1 t7 c+ j7 ^8 Q8 K$ _  d1% q  T5 I6 Z! n) K
    查看结果,$estimates给出了不同组的NRI以及总的NRI,包括了使用不同方法(KM/IPW/SmoothIPW/SEM/Combined)得到的结果;$CI给出了可信区间。/ W, J5 I+ K- p; @9 ?  ]
    : G. x; u: G, a7 ]# g
    res; j, S0 M1 p3 B8 W5 Q% R4 ?- `1 `
    1
    / D/ J( c$ \" [' S## $estimates
    . b1 R  x1 _) C8 @% S" A! g) m##            NRI.event NRI.nonevent       NRI9 }% S( g. A5 z9 }5 u
    ## KM        0.20445422    0.3187408 0.5231951
    $ \* j0 W- ^1 j0 l3 f7 _## IPW       0.22424434    0.3273544 0.5515987
    $ L) m2 t0 d4 I4 y! x% t" \+ A## SmoothIPW 0.19645006    0.3144263 0.5108763
    ( W. v5 ~/ q. G9 J) {  S4 I## SEM       0.07478611    0.2632127 0.3379988
    4 d$ M# S* l2 ?) B## Combined  0.19633867    0.3143794 0.5107181
    4 l/ K, Q& a$ d+ d( O9 Z##
    - y+ v( Z  e, m$ _## $CI" m, @; V/ t# W; p
    ## $CI$NRI.event/ e! E- h8 H8 @# n
    ##                     KM         IPW   SmoothIPW        SEM   Combined8 l/ _3 i% |; r- x- W6 G- X3 e2 S" @
    ## lowerbound -0.03915924 -0.02185068 -0.04724202 -0.1162587 -0.0473723
    " R- O- \) Y2 J5 c' z/ w! ^0 _& P1 l## upperbound  0.44806768  0.47033936  0.44014214  0.2658309  0.4400496
    7 H! K$ H7 w' P# A* m& O##
    * O6 ]+ f- G8 ], j+ [# o## $CI$NRI.nonevent
    4 |8 s: W2 P8 v4 t6 s& X/ w##                   KM       IPW SmoothIPW        SEM  Combined
    2 L# M  n+ b8 D. r; L1 c## lowerbound 0.1317108 0.1396315 0.1286685 0.08638933 0.1286426
    ! f8 `2 j3 \% D4 V2 K/ C* f- I2 L## upperbound 0.7102251 0.7393216 0.6966341 0.51482212 0.6964549* d4 {0 H" M* ?- `3 z/ @
    ##
    2 R; g0 b- r1 \5 l0 X& \, d## $CI$NRI/ d0 a: }/ N8 Q& O
    ##                     KM         IPW   SmoothIPW         SEM    Combined
    ( A9 k- y8 y1 B, X- t0 y## lowerbound -0.05112533 -0.04569046 -0.05439863 -0.04132364 -0.05443409
    ' |0 n1 b4 ?- ?. F## upperbound  0.89306122  0.92464359  0.87970125  0.64253510  0.87953153
    $ J8 R) d' |* u) P( V% V3 O$ h##
    $ T5 J' W2 ?5 t/ i1 N0 G, l# @##
      q  X7 ~1 g, u8 d  v## $bootMethod' Q9 Y2 ?+ U$ Y! [3 L# B
    ## [1] "normal"
    ( M& q/ m$ p* F. r4 I5 B3 S0 U/ h- V) L. F##
    4 w* }) ^0 v7 a. x2 n! N## $predict.time
    4 j) K+ u" x' @# a! w9 \( O4 s3 ~## [1] 2000
    % y2 u! _- l% H& R( |## ( O. |4 E2 N: d" {
    ## $alpha
    9 ?5 W0 ~1 c7 Q, g* g: p## [1] 0.051 }% c/ a8 i. [& x
    ##
    ! F9 y8 f3 p1 K( z7 l## attr(,"class")
    6 O+ ?, c( J, ]+ }, J## [1] "survNRI"0 _% [6 v- s* m8 q( i! S3 n
    2 e/ l7 N& y/ C: Z$ }, `
    1
    ! p% p9 M; U7 sOK,这就是NRI的计算,除此之外,随机森林、决策树、lasso回归、SVM等,这些模型,都是可以计算的NRI的,后面会继续介绍。大家如果有问题欢迎在评论区留言。4 A& E% j; a' \: T, e  a+ r; i$ C

    ( D, h- r2 D1 {4 x) c4 d# U本文首发于公众号:医学和生信笔记
    8 t' ^. ~# a" v8 _1 A
    3 i8 }8 P/ P! w9 c' U6 o" Q“ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。
    : B* s1 ]& u/ ^0 ^本文由 mdnice 多平台发布5 X! y6 c) B& k7 V0 E3 ^& m- E
    ————————————————  a0 v" S( f8 O. @! X
    版权声明:本文为CSDN博主「阿越就是我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 H* J# C% Z- v# c原文链接:https://blog.csdn.net/Ayue0616/article/details/126768006; E0 a7 i3 i- [" u

    8 e  Y% g& U; o+ m$ ?  X& ~. E4 C, n& |" }1 f
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-9-17 11:53 , Processed in 0.370065 second(s), 50 queries .

    回顶部