QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3067|回复: 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

    * l- S8 o1 ]0 {9 ?( l1 b0 t) e净重新分类指数NRI的计算
    2 g* L; F+ G! Q0 T( }! X/ A“ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。
    ' h3 \. U: \$ Z5 `- QNRI,net reclassification index,净重新分类指数,是用来比较模型准确度的,这个概念有点难理解,但是非常重要,在临床研究中非常常见,是评价模型的一大利器!) G* I+ M9 r+ z
    ; r# P0 I* F+ G  o! g# o, R
    在R语言中有很多包可以计算NRI,但是能同时计算logistic回归和cox回归的只有nricens包,PredictABEL可以计算logistic模型的净重分类指数,survNRI可以计算cox模型的净重分类指数。8 H' c( q3 x: g8 P  S( @1 k

    0 @  G$ Y5 P' v7 [$ Klogistic的NRI5 Z6 D7 p0 ]0 i- K
    nricens包
    ' V! \. x" k! q7 K* w/ ePredictABEL包9 n( [; ~5 ?! J, z
    生存分析的NRI# d& Q* t+ _$ m2 @% ^; T
    nricens包
      l! Q) L# ~" u& w) hsurvNRI包
    3 Z' P" D3 ~) C" Jlogistic的NRI9 |  b8 W% }. i' L7 p6 P% _# ]
    nricens包
    ( i" P/ R/ w2 C; N, Y#install.packages("nricens") # 安装R包
    0 u, N2 C1 S+ Y' Y. w0 [7 C2 Xlibrary(nricens)! _6 B- E- D4 u) G6 f1 g( P- e9 x7 `$ d7 K
    1
    3 A. Y2 s; D( y# A## Loading required package: survival
    7 M2 l  D5 w0 N1
    1 Z% X- g0 [$ q9 p使用survival包中的pbc数据集用于演示,这是一份关于原发性硬化性胆管炎的数据,其实是一份用于生存分析的数据,是有时间变量的,但是这里我们用于演示logistic回归,只要不使用time这一列就可以了。
    ) O" `; R$ P: j% s) D: @% Q- D. I9 J1 c* P! F2 N
    library(survival)
    ( u5 t  g4 g9 N# W3 }' P
    . o/ o: X; |8 Q2 B- w& ^0 L6 o# 只使用部分数据
    3 `2 q. o, ^% e; e5 h1 Zdat = pbc[1:312,] * j; V+ }  s3 v  _
    dat = dat[ dat$time > 2000 | (dat$time < 2000 & dat$status == 2), ]
    ! x' M! G; `3 e; y. x0 U+ ]. b  ?8 B0 |7 x1 x' ~+ P7 z2 N
    str(dat) # 数据长这样. C- Z1 g! Y6 o3 I4 f. H
    1; ]9 \1 B+ V2 c! V. S$ D
    ## 'data.frame': 232 obs. of  20 variables:
    ) V% _+ T  c; {1 D- ~2 g##  $ id      : int  1 2 3 4 6 8 9 10 11 12 ...
      \# L8 g7 m- }3 r##  $ time    : int  400 4500 1012 1925 2503 2466 2400 51 3762 304 ...
    & ~, B8 l- |/ Y##  $ status  : int  2 0 2 2 2 2 2 2 2 2 .... k+ X3 `) b1 Y
    ##  $ trt     : int  1 1 1 1 2 2 1 2 2 2 .... K8 A/ L, J/ o0 ~% t5 y+ l- _
    ##  $ age     : num  58.8 56.4 70.1 54.7 66.3 ...
    / u; Y" I7 e: |##  $ sex     : Factor w/ 2 levels "m","f": 2 2 1 2 2 2 2 2 2 2 ...
    ( q5 M4 G' D! P1 J8 \1 Y( ]  B##  $ ascites : int  1 0 0 0 0 0 0 1 0 0 ...; }% Y) M  d3 \7 _2 Y* \3 h
    ##  $ hepato  : int  1 1 0 1 1 0 0 0 1 0 ...
    ' H1 X. G9 U, @/ ^##  $ spiders : int  1 1 0 1 0 0 1 1 1 1 ...& A7 S! ^) q1 W( E  O2 `8 `
    ##  $ edema   : num  1 0 0.5 0.5 0 0 0 1 0 0 .../ J: j- d5 R/ ?: P0 A$ t
    ##  $ bili    : num  14.5 1.1 1.4 1.8 0.8 0.3 3.2 12.6 1.4 3.6 .../ D9 ]- |* K7 a0 x
    ##  $ chol    : int  261 302 176 244 248 280 562 200 259 236 ...
    , }: \+ z6 |# m1 y& N0 J##  $ albumin : num  2.6 4.14 3.48 2.54 3.98 4 3.08 2.74 4.16 3.52 ...
    , p$ u9 p$ |9 D+ R##  $ copper  : int  156 54 210 64 50 52 79 140 46 94 ...5 ]4 \7 i) v( v5 u/ ?! m2 X
    ##  $ alk.phos: num  1718 7395 516 6122 944 ...3 f9 s/ ^1 `' e
    ##  $ ast     : num  137.9 113.5 96.1 60.6 93 ...
    ! t! U: ^6 Q0 B3 Z##  $ trig    : int  172 88 55 92 63 189 88 143 79 95 ...
    % d1 w! F: y1 z* V- k##  $ platelet: int  190 221 151 183 NA 373 251 302 258 71 ...
    ' W+ j3 H9 V' A##  $ protime : num  12.2 10.6 12 10.3 11 11 11 11.5 12 13.6 ...9 G0 \- J, i9 `. P. c. p
    ##  $ stage   : int  4 3 4 4 3 3 2 4 4 4 ...
    8 G! f, M$ _; ^* J5 a4 h$ A4 s/ \" {. x0 Y
    1
    3 h5 r4 H% L# p6 b4 ?9 Pdim(dat) # 232 20& l6 T: R! |2 L8 d
    18 N, i, G9 ]/ g( F2 e+ O# J1 W; B
    ## [1] 232  208 ~4 ]% q- j4 n
    1
    * r* ^. k  O4 B' Y  Y3 N) V然后就是准备计算NRI所需要的各个参数。
    ) h8 ]$ u% R) e! _% @; n- A' C/ f4 l5 }% K! j! ]- j
    # 定义结局事件,0是存活,1是死亡& u! V8 g% X. p
    event = ifelse(dat$time < 2000 & dat$status == 2, 1, 0)5 i% T( W2 B5 x+ b& d9 e( C* d

    ; D% V* e3 w2 @+ H+ I/ ?, y2 M# 两个只由预测变量组成的矩阵
    - z! ~/ {) x) c( g3 C, zz.std = as.matrix(subset(dat, select = c(age, bili, albumin)))
    6 D) S4 _- Z; x0 a# ~z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))2 t5 C8 Z6 f6 _2 N4 j

    + C& j* a8 v. e2 X) V5 B# 建立2个模型  d; L* _! b5 r# j1 a1 V" G) z2 L
    mstd = glm(event ~ age + bili + albumin, family = binomial(), data = dat, x=TRUE). Z1 w6 Z; p0 N$ p" o5 E; {5 q
    mnew = glm(event ~ age + bili + albumin + protime, family = binomial(), data = dat, x=TRUE)
    ; G7 F3 L  S2 b4 N7 ~
    ) L3 [0 z9 W/ @/ r! P; i# 取出模型预测概率% g' {9 |' S0 d
    p.std = mstd$fitted.values- z% r# X! w$ d7 a/ n4 `6 x
    p.new = mnew$fitted.values( Z/ q3 @& b+ t  K% A; Z

    % {4 q. h5 h6 N( }9 K2 m/ ], e1
    & i6 |2 f. J0 m3 m然后就是计算NRI,对于二分类变量,使用nribin()函数,这个函数提供了3种参数使用组合,任选一种都可以计算出来(结果一样),以下3组参数任选1组即可。 mdl.std, mdl.new 或者 event, z.std, z.new 或者 event, p.std, p.new。
    ! B/ X$ F" z6 H1 e; i4 C+ e' M; S; h: j7 f" s  L5 i" d+ @
    # 这3种方法算出来都是一样的结果
    + P# I( X2 k# ~9 n' n. V- m) c6 [" n, U& {
    # 两个模型! ]( a0 `. ^& ^2 n
    nribin(mdl.std = mstd, mdl.new = mnew, . v" x6 n8 z- ^" o( \' e
           cut = c(0.3,0.7),
    8 D( w) C4 h" L( ~: T8 u7 E       niter = 500,
    7 R( [, F0 w; n# j; c       updown = 'category')
    . @8 |5 u3 g( V: @1 q, r; \& U4 e
    " V9 z4 c3 F& G, g: e# 结果变量 + 两个只有预测变量的矩阵; E  R& l. J4 g# }$ H  H( _9 B
    nribin(event = event, z.std = z.std, z.new = z.new,
    $ d4 I+ O4 J0 Q1 e: p" e       cut = c(0.3,0.7), 6 o% }, n. u. E& J
           niter = 500,
    - q8 U9 B4 ^& y! t8 O. j       updown = 'category')! i' V3 K: x4 s1 o+ I
    ; }1 |5 y5 ?' g3 t/ L& [8 a; E
    ## 结果变量 + 两个模型得到的预测概率! E% x! R4 o( v2 p6 A, U
    nribin(event = event, p.std = p.std, p.new = p.new,
    / n  E, {4 g1 Z; C: y       cut = c(0.3,0.7), / Y3 ~' e$ k- A! }! e
           niter = 500,
    8 M* M8 e( U% e% k       updown = 'category')
    ! w& m" m( @% @2 r% A; Z! X  s/ e+ S" Y
    1
    4 T; P+ w7 l+ [  \其中,cut是判断风险高低的阈值,我们使用了0.3,0.7,代表0-0.3是低风险,0.3-0.7是中风险,0.7-1是高风险,这个阈值是自己设置的,大家根据经验或者文献设置即可。
    3 Z# o* I4 e" j0 v7 t' R5 D* ^: Y- L5 M- [4 U4 I6 E; _/ J
    niter是使用bootstrap法进行重抽样的次数,默认是1000,大家可以自己设置。- A7 ?# n' m. K
    # X% H/ z- Y' n1 R
    updown参数,当设置为category时,表示低、中、高风险这种方式;当设置为diff时,此时cut的取值只能设置1个,比如设置0.2,即表示当新模型预测的风险和旧模型相差20%时,认为是重新分类。& I" y# P% X# ~: {1 u

    + V: G" Z; B4 E3 q" W0 n% \0 _% w上面的代码运行后结果是这样的:
    * j* S- T7 C: E5 m& n
    * y& q" \, n/ o/ U0 @! c4 pUP and DOWN calculation:
    ! P$ w" {. q* U- Q8 b  n  #of total, case, and control subjects at t0:  232 88 144
    , Z$ P: ]' N  j: [4 b
    5 c1 `( e; t  g! k  Reclassification Table for all subjects:
    ' n' i+ y( |) A# A        New
    $ o3 X; L7 O& {5 \Standard < 0.3 < 0.7 >= 0.77 S/ x- a' ]" C+ i; k
      < 0.3    135     4      0
    % y: h" W. O9 F! {  < 0.7      1    31      4
    3 C& c! a  e# H8 v# ?( U9 X, f  >= 0.7     0     2     55
    4 M: @2 u' s% e$ b' p. ]4 g7 w! m  k& ]/ H
      Reclassification Table for case:
    3 J& C1 ?, w6 f        New
    7 S  M3 r& W+ g: I2 R6 |Standard < 0.3 < 0.7 >= 0.7
    " ^! _& L2 \1 L* |2 P4 V  < 0.3     14     0      07 ]% d% j, d2 h% e" Y& O1 U' q
      < 0.7      0    18      3
    ( M9 X" M3 F' p5 l3 b4 `2 a5 n  >= 0.7     0     1     52! G1 G% z9 j% W, S- F& d
    % z3 S9 n2 p. r6 @3 N+ ]
      Reclassification Table for control:+ X* p. f  L! D: _" l1 M- l3 a
            New
    ) d7 |" E1 s) aStandard < 0.3 < 0.7 >= 0.7
    2 u: j4 C5 ~+ ^. }% N  < 0.3    121     4      0- q. Y: k) F. j) `1 U+ i. t2 q
      < 0.7      1    13      1
    ! x" F3 ~% @( R4 y% E( Q  >= 0.7     0     1      3
    - L6 E9 ~& K) |4 J8 L$ @
    " W; j. {% a( N' bNRI estimation:, ^2 \' @, I4 D) s/ S/ |
    Point estimates:
      t; P' P0 K9 o' J! s! l1 j$ u$ C                  Estimate
    4 c* J: J& }# p7 XNRI            0.001893939
    ) y+ E/ \% h& [NRI+           0.022727273$ N1 ~6 r% o# h2 X# d. F. x& y3 L
    NRI-          -0.0208333336 l8 H9 o' ^' Z: }5 c' E
    Pr(Up|Case)    0.034090909
    , z* P& Q' e6 l* m1 e/ Q, APr(Down|Case)  0.011363636% ]* `# R& K4 y3 n5 }
    Pr(Down|Ctrl)  0.013888889
      @2 k3 ]! R3 z1 o' M. \Pr(Up|Ctrl)    0.034722222. o" H  C0 ~; T! e8 T( }9 E, `0 c: c

    2 G1 |# x2 U* q8 @! o  f! }5 A' V& fNow in bootstrap..
    ; \4 Q& y4 e$ m" \
    # [3 N" I$ k! J- O! o9 j0 VPoint & Interval estimates:
    ( J" M; b/ X0 n$ I: I) O! Y7 D                  Estimate   Std.Error        Lower       Upper( g: B  l0 N2 g: B9 F4 e- P8 D
    NRI            0.001893939 0.027816095 -0.053995513 0.055354449  k& J6 h3 g5 X5 L* i
    NRI+           0.022727273 0.021564394 -0.019801980 0.065789474- c# T6 g! l( I; ?
    NRI-          -0.020833333 0.017312438 -0.058823529 0.007518797
      F* }+ N4 }" y6 pPr(Up|Case)    0.034090909 0.019007629  0.000000000 0.0721649484 S' w: U% m. M8 L3 T5 C1 T
    Pr(Down|Case)  0.011363636 0.010924271  0.000000000 0.039603960
    % r* a" u" p: j6 H! gPr(Down|Ctrl)  0.013888889 0.009334685  0.000000000 0.035211268
    % `9 ]! \0 H7 `7 lPr(Up|Ctrl)    0.034722222 0.014716046  0.006993007 0.066176471
    % w$ r3 v; O1 Q% h# n( e
    2 O1 `6 d0 v- M1/ y, ^* W/ v( B! i- R& l
    首先是3个混淆矩阵,第一个是全体的,第2个是case(结局为1)组的,第3个是control(结局为2)组的,有了这3个矩阵,我们可以自己计算净重分类指数。  z9 P* L; r- C$ o

      r6 u" u8 z# y2 R% E: ~6 b看case组:
    ' M% _& E, O0 ~' o1 Q1 ^
    * S- P' r; H9 ]净重分类指数 = ((0+3)-(0+1)) / 88 ≈ 0.0227272730 y! t5 b8 c8 u( ]

    : h. h$ w$ \2 j  `% b再看control组:- U4 n3 \, ~3 h  _1 |
    8 Q4 V  [1 ?8 i" i. Z
    净重分类指数 = ((1+1)-(4+1)) / 144 ≈ -0.020833333
      o6 X' e" @. w, i+ f  Z$ j2 [5 ^& `
    相加净重分类指数 = case组净重分类指数 + control组净重分类指数 = 2/88 - 3/144 ≈ 0.000315657' ?/ M/ F6 A6 m; w0 e) y2 B- M

    * }3 X/ a& X) o再往下是不做bootstrap时得到的估计值,其中NRI就是绝对净重分类指数,NRI+是case组的净重分类指数,NRI-是control组的净重分类指数(和我们计算的一样哦),最后是做了500次bootstrap后得到的估计值,并且有标准误和可信区间。- \; _- U9 Y) t6 I6 J3 U3 f

    * e7 l* \; c8 V3 f( ]3 D& w4 L最后还会得到一张图:) X- I0 _. ?4 e; m; \
    / K/ ~# L1 n( ~1 r
    这张图中的虚线对应的坐标,就是我们在cut中设置的阈值,这张图对应的是上面结果中的第一个混淆矩阵,反应的是总体的情况,case是结果为1的组,也就是发生结局的组,control是结果为0的组,也就是未发生结局的组。9 F" C6 R& B" R) R
    1 `- e- @$ v# h+ C' p
    P值没有直接给出,但是可以自己计算。( O3 v2 v( ?" A" U

    ( t8 W! |' R0 K0 ^. O# 计算P值
    $ M! D0 e0 G, J4 ^4 S5 _, @z <- abs(0.001893939/0.027816095)
    ! D# t4 `9 z: ~; Np <- (1 - pnorm(z))*22 s3 i- {9 m; l& ]& e1 @
    p
    " O, n9 J" P- u1 N1
    : o: h2 t7 u: ~# g1 c## [1] 0.9457157
    ' x1 y; e$ G6 D7 m# n1
    % ?8 c: ?& f% ]( r; ~+ hPredictABEL包+ X" h7 y/ R2 \! V8 |- w; a. k  j9 y
    #install.packages("PredictABEL") #安装R包# @' l" p0 V8 I
    library(PredictABEL)  # K" [* e$ ]. F; u1 L

    7 G) H( g% q+ Y( m# 取出模型预测概率,这个包只能用预测概率计算
    $ n1 {9 ]9 Z: w! ]7 c* p% Vp.std = mstd$fitted.values( T" w- t/ n4 N  m( A0 B
    p.new = mnew$fitted.values 0 k- c: q  M9 M1 g' Y; |0 r
    1/ v- v/ [# O, {$ K, |' q4 |
    然后就是计算NRI:/ V* }6 S" h/ s
    / x+ I, b0 C- |8 U) C
    dat$event <- event: P: F' ^0 V8 o2 w" g0 y, B/ C
    & ~: h8 v# S& A. L  `
    reclassification(data = dat,4 K: p2 w" k, M: _6 i7 m0 z7 A
                     cOutcome = 21, # 结果变量在哪一列4 m# G% e% A6 a2 {( \
                     predrisk1 = p.std,
    , `; Z  L/ }+ P* a* R: O& }                 predrisk2 = p.new,
    ) T* I" b2 w- {' J                 cutoff = c(0,0.3,0.7,1)* j8 J4 j9 Z" i4 b/ N
                     )( @( q7 L5 B" s9 C& q& l$ K
    1. l; z, ^+ a' K9 C6 {
    ##  _________________________________________% _4 ~2 Y' [* ?. Z  s( U
    ##  / _. W* H  p! a! S
    ##      Reclassification table   
    . f: k! [4 B' z7 e. L##  _________________________________________, L; U4 k& T+ k0 f. K
    ## # X" I# q. {; W2 b
    ##  Outcome: absent 3 L6 o5 T9 L! H/ ]
    ##   
    ) G6 T0 Y* N* d##              Updated Model
    , \- q+ }# Y8 X: j8 R## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified. h( T, ?$ F' S% J2 J8 T
    ##     [0,0.3)       121         4       0               3
    / W3 d. ?5 a2 k8 s. T2 \##     [0.3,0.7)       1        13       1              13
    ! j5 _: }' M1 C' U( Z) G* f##     [0.7,1]         0         1       3              25
    6 c8 n, {" J- w) L" \: k1 S##
    ' u3 _/ q; b* `1 U##  
    $ t) r7 @5 _* @6 D" Y" W$ h& i' S##  Outcome: present
    % m- t- w5 {! m##   + o3 T0 W8 e: r0 Q" W
    ##              Updated Model: V7 b' p- r% K9 X) x! o
    ## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified
    & i4 d" S" |( N# L, B3 W##     [0,0.3)        14         0       0               0
    # E7 W6 \2 H; B: m9 a##     [0.3,0.7)       0        18       3              14
    1 q8 x* X) Y; J7 J7 \5 D##     [0.7,1]         0         1      52               2$ g9 ^/ m9 ?' e$ f; j# p
    ## + m, u3 A/ s' E3 {
    ##  
    6 n5 b8 b% N: ~0 P##  Combined Data
    ; c7 Q, ^0 Y5 d: L/ K( ~. w) ]##   - h9 J  h8 D- {. W3 p2 Z
    ##              Updated Model7 e' E1 N$ F8 ?9 p6 A2 L6 U
    ## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified; e7 J) j9 B! c! b8 @/ x0 ?
    ##     [0,0.3)       135         4       0               3
    4 s( P0 v, M# _3 W/ I  L+ b. C* r##     [0.3,0.7)       1        31       4              14
    8 r  \# z/ ~' o# x9 d1 C% E! _8 V( {##     [0.7,1]         0         2      55               4
    ( _7 i0 Y& D7 b##  _________________________________________3 o7 E" E* T0 g
    ## 4 C5 _) _$ E0 s( H
    ##  NRI(Categorical) [95% CI]: 0.0019 [ -0.0551 - 0.0589 ] ; p-value: 0.94806
    8 n# z3 U, D$ H9 O3 ?# P3 E##  NRI(Continuous) [95% CI]: 0.0391 [ -0.2238 - 0.3021 ] ; p-value: 0.77048
      N# x8 G6 r* i% c##  IDI [95% CI]: 0.0044 [ -0.0037 - 0.0126 ] ; p-value: 0.28396/ S+ i  K# b9 k  J; @- k9 r4 t9 Q
    0 o/ X, W0 m4 |0 [9 r
    1
    : D$ I' B  l% t4 X结果得到的是相加净重分类指数,还给出了IDI和P值。两个包算是各有优劣吧,大家可以自由选择。# D+ n  K( U: b6 x) V$ J" L9 x

    - {; [$ X& W: G, J生存分析的NRI
    1 |" S# @3 X  o% G1 r2 b. P/ \还是使用survival包中的pbc数据集用于演示,这次要构建cox回归模型,因此我们要使用time这一列了。8 j" J0 y" }% h* c3 e7 X
    1 D% y/ S# f( }$ x) I  X4 }- o
    nricens包9 k- A/ n; E& L9 ~! J, @. T& y
    library(nricens)
    9 X% @6 y; u0 @- q  alibrary(survival)1 Q- F( U" g1 x# @; C' _: z
    9 ?% f4 B$ u# M: ]- w
    dat <- pbc[1:312,]
    , \. z1 U6 V: c+ D) q, w6 s$ wdat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡
    & l% Y: _. s% w8 c/ G0 c+ S1, _% T2 l5 \. H! Q' E, [, I5 p
    然后准备所需参数:4 @, v' }; W) m9 r; R2 ^

    ; |0 q0 s! l/ P: ~# 两个只由预测变量组成的矩阵* H1 }+ h, @& p$ ~% [
    z.std = as.matrix(subset(dat, select = c(age, bili, albumin)))1 z; ]8 S( ]/ j2 ]6 y
    z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))9 M1 G& N- |& d' `3 g

    / S: }+ K) D1 V( r( I# 建立2个cox模型& k2 R7 D$ t& \% l
    mstd <- coxph(Surv(time,status) ~ age + bili + albumin, data = dat, x=TRUE)
    * |& l- n% q9 K# _mnew <- coxph(Surv(time,status) ~ age + bili + albumin + protime, data = dat, x=TRUE)
    , a; H& f) i" g, K% ^( z+ o% S7 J& b
    # 计算在2000天的模型预测概率,这一步不要也行,看你使用哪些参数: [. w9 [4 v/ e% E4 C5 E
    p.std <- get.risk.coxph(mstd, t0=2000)
    ( `+ |. k# ?$ A  n( O; Qp.new <- get.risk.coxph(mnew, t0=2000)
    : S/ G1 `' q% p2 }1- z8 |8 C: k/ t5 f# Z6 v8 Y
    计算NRI:
    ( d  W- Y+ j' T. t: K9 h
    % u% T  S7 F5 X; |' j+ [# m6 a; q& ^nricens(mdl.std= mstd, mdl.new = mnew,
    + L5 z- V; N9 L4 ~        t0 = 2000,
      ~# u4 y% c/ u# {) Y        cut = c(0.3, 0.7),! k, U) o( q3 r3 ~/ ]5 M
            niter = 1000, 5 X' d" H/ x& ~/ [8 @
            updown = 'category')* x' X: i7 V" a% Q* T
    7 b) p5 I8 n- S
    UP and DOWN calculation:  K, ?5 s$ ?# {. d
      #of total, case, and control subjects at t0:  312 88 144
    6 t" [; Y( H. ~( r% T4 O$ l& \2 R( O* Q/ J3 Z* ~
      Reclassification Table for all subjects:
    " {5 N) M% o: a8 h6 A. W8 N, r        New
    + D0 P8 e( i/ H( S* c7 g& kStandard < 0.3 < 0.7 >= 0.7; i5 |7 K$ _5 X% h/ \$ v
      < 0.3    202     7      0
    * K( g- N) B0 \7 b  o  < 0.7     13    53      62 C/ s/ W: k& C7 D6 ^) p- B; W
      >= 0.7     0     0     31! Q! X, ]8 D- W% E/ q% C; f. h2 ^

    1 y# X/ N& L! O$ n. D1 s# b3 Q  Reclassification Table for case:3 a' l0 f# B! F" H8 U. d
            New
    ; E' r2 x- z) a8 YStandard < 0.3 < 0.7 >= 0.7
    5 K8 ~0 u  r$ R3 {0 _1 t  < 0.3     19     3      0  H$ o. C! L  F
      < 0.7      3    32      40 j1 ?; W! t# H) `7 V
      >= 0.7     0     0     27! I4 t- b# y# ]

    . a4 A/ V- v/ h" N2 w9 ^  Reclassification Table for control:/ E3 l& ?+ Y5 v, U$ T# m' n) a
            New! s5 P; ~9 x" j! e
    Standard < 0.3 < 0.7 >= 0.7
    5 `+ ]  V' G4 \  y! l/ ]% }  < 0.3    126     3      0: E' ^3 Y: ~9 B3 _$ ~% O5 W. y! `
      < 0.7      5     7      2+ W( h8 k8 l1 S- f' P$ z# n1 I
      >= 0.7     0     0      1
    $ x. `* e7 [) H9 z% G
    + l( g1 `5 Q( X8 A% A: GNRI estimation by KM estimator:  [8 ]: f+ j: W; ?
    " U, p9 s& H3 {, S
    Point estimates:
    ) |  T" r: g. q3 U& p% W                Estimate
    5 \+ c) r% G  nNRI           0.05377635
    2 K1 x# S7 y# R- PNRI+          0.03748660
    3 P0 Y) ]0 k; W/ w6 l2 I0 \NRI-          0.01628974/ C* e: E- L7 i& ?. W
    Pr(Up|Case)   0.077089384 f1 L. [8 H3 Y! |# ]( i* |
    Pr(Down|Case) 0.03960278
    : }! G' V4 w6 ?( k! U, ?Pr(Down|Ctrl) 0.04256352
    5 x  U" O( d$ B: ePr(Up|Ctrl)   0.02627378* i  ?: {) i/ q# O' |* B& C  d+ Z! u

    # X/ P" ]8 o7 V% V& ~Now in bootstrap..% |& S/ u; s; P

    " i$ ?" J# ]8 Q' c9 kPoint & Interval estimates:
    ( `  w# c6 }7 c4 k                Estimate        Lower      Upper
    9 o% ]1 U& f& j* {' w& U0 CNRI           0.05377635 -0.082230381 0.16058172
    ; A; e# K9 s$ ^. q2 d& A) C5 FNRI+          0.03748660 -0.084245197 0.13231776# V$ J* g  p! h7 e. d+ C& u
    NRI-          0.01628974 -0.030861213 0.06753616& Q9 o6 l* C4 J. Y# F" z5 v) a' ^
    Pr(Up|Case)   0.07708938  0.000000000 0.19102291
    9 K6 H- x. U/ `- [Pr(Down|Case) 0.03960278  0.000000000 0.15236016
    $ |% J; |! f, d9 N* @) SPr(Down|Ctrl) 0.04256352  0.004671535 0.09863170$ n1 _! k; x5 N
    Pr(Up|Ctrl)   0.02627378  0.006400463 0.05998424
    5 ^4 v: \0 S9 E9 l2 h( @+ ?& ^0 W( a8 r, _' D" H) z
    1! N3 \+ W9 J) Q) z- u

    3 @' M5 {$ w7 t: L* eSnipaste_2022-05-20_21-49-38
    5 G+ E2 i/ o' y% i9 u结果的解读和logistic的一模一样。& S. Q0 J0 x( M' X! Z& {

    ; g8 i9 s& T. n* h0 }survNRI包
    ; D  B6 x4 g2 e1 K7 @# N" g( Y# 安装R包: ]: }6 W4 B. z" b6 T' T  r% \5 Z, c
    devtools::install_github("mdbrown/survNRI")  h$ S+ D( ^1 N8 z/ j' y
    1' E1 t! Q, G2 j. h9 {1 ]
    加载R包并使用,还是用上面的pbc数据集。% x: X1 t0 W# X5 m3 M! e

    6 n; u4 g* ^: \) ~library(survNRI)
    : H/ I- p7 Z) ]; r. R7 V0 Q5 t1. W6 Q) k+ A: m) ^. F! x
    ## Loading required package: MASS( y; l9 M! {7 `
    1  b* U3 p6 O) F% y$ G! X; B+ m
    library(survival)' W( C* J& Z; y6 V

    * m' J1 Q/ Q; ]8 U# 使用部分数据
    4 K5 ^+ c7 X* w" J- R9 T  ~! u) Q$ Udat <- pbc[1:312,]6 y# L3 \# a" ?# m) K
    dat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡; [" l9 u# R# X5 S  H) S+ O; y5 m
    2 U' Y& c0 U& ]+ v/ e; R  l
    res <- survNRI(time  = "time", event = "status",
    / ?9 w9 ^. y; S" n- p9 o) _& [        model1 = c("age", "bili", "albumin"), # 模型1的自变量7 ~* j# ^( v4 M1 C# Y7 x
            model2 = c("age", "bili", "albumin", "protime"), # 模型2的自变量, X) o. b$ q$ \7 K" b) b( U& o
            data = dat,
    , t2 X( U" [7 F( C        predict.time = 2000, # 预测的时间点4 `: ?, D) `; g) q, N+ ^
            method = "all",
    5 @8 b6 w$ M6 M# T3 e7 X* T6 h        bootMethod = "normal",  8 w. b! Q! ?+ l# K
            bootstraps = 500,
    ; ]5 ?! n1 T/ g% F        alpha = .05)
      |' V. H7 {, J
    ' B: Q8 N4 u" k4 h" ~3 ^+ z1
    8 _& s4 I4 i! Z# k8 i0 P5 ~查看结果,$estimates给出了不同组的NRI以及总的NRI,包括了使用不同方法(KM/IPW/SmoothIPW/SEM/Combined)得到的结果;$CI给出了可信区间。
    0 [+ P, Y/ b. c* r2 f6 C9 N% J- z' w& o
    res
    6 l$ E( a' ?5 w6 x5 u0 z" s, s1 P$ L' L14 k( J# L: n; b- _0 q4 R
    ## $estimates5 }  W1 C2 O( {0 X
    ##            NRI.event NRI.nonevent       NRI
    & X* {3 l1 P  A# F## KM        0.20445422    0.3187408 0.5231951/ H0 R3 Y" T% z, o2 W
    ## IPW       0.22424434    0.3273544 0.5515987( }6 w7 o7 a8 t1 x' t4 e% B. [
    ## SmoothIPW 0.19645006    0.3144263 0.5108763
    8 S& R$ a7 E0 k## SEM       0.07478611    0.2632127 0.3379988
    5 a% @3 g+ ~- }0 W2 N. \- l## Combined  0.19633867    0.3143794 0.51071815 U, K6 S* J' }
    ## ! Q1 r. n* ~- p6 E( {$ F
    ## $CI
    ; ~+ ^/ B  o; Y9 \. u1 J% o3 \## $CI$NRI.event' U$ N% F" z% E3 y1 `
    ##                     KM         IPW   SmoothIPW        SEM   Combined
    7 A7 U. p. x8 A% m3 L## lowerbound -0.03915924 -0.02185068 -0.04724202 -0.1162587 -0.04737235 [8 F0 N# }6 c+ X1 J  a
    ## upperbound  0.44806768  0.47033936  0.44014214  0.2658309  0.4400496
    , \3 l4 `3 ]! y, i( {##
    4 ^5 ~1 q8 U& v- o## $CI$NRI.nonevent
    2 X/ F9 _1 I" V& v( ^##                   KM       IPW SmoothIPW        SEM  Combined3 J7 t% N/ V: n
    ## lowerbound 0.1317108 0.1396315 0.1286685 0.08638933 0.1286426
    / }) H- s9 u4 x0 w( J( S## upperbound 0.7102251 0.7393216 0.6966341 0.51482212 0.6964549
    7 W. X6 [$ j. A7 O$ }/ r$ j& d( D; D##
    : \' C& m$ `1 q. c## $CI$NRI
    / L+ Z2 }, X" D8 E, N' s##                     KM         IPW   SmoothIPW         SEM    Combined
    2 k$ l( U5 v: x  d7 J## lowerbound -0.05112533 -0.04569046 -0.05439863 -0.04132364 -0.05443409
    - m8 u* Q, c/ d( k" @## upperbound  0.89306122  0.92464359  0.87970125  0.64253510  0.879531533 L% S" _+ o# {- [
    ## ; B- |5 a! k& _
    ##
    # r1 l5 ?/ e% Y& S6 G## $bootMethod
    - B8 _7 J* Z: S$ ~1 q% b  `) m" c## [1] "normal"
    1 }7 o- I6 e' i( B+ M' P## ; M6 ?2 ~) m+ I* X0 z' y, N
    ## $predict.time
    , n& `7 q4 h7 |3 h* a$ W1 R## [1] 2000
    - x% H7 v: a( B) K) O$ Z##
    5 Q# Y* h+ U" o3 q3 h( z% a: [## $alpha
    + L$ l. o8 _& q## [1] 0.05
    , j% h) L5 M: w$ T## $ V9 ~9 J4 G( g5 T
    ## attr(,"class")
    * u/ \! y4 K, D/ R: t## [1] "survNRI"
    7 l6 Q0 U7 i% g1 w1 E
    ; t- R. Y* K; _( c14 |" P: ~/ E0 e+ a
    OK,这就是NRI的计算,除此之外,随机森林、决策树、lasso回归、SVM等,这些模型,都是可以计算的NRI的,后面会继续介绍。大家如果有问题欢迎在评论区留言。
    6 P$ m$ a; k1 W$ n9 o' q4 b/ _% h1 \; o' G: O- F
    本文首发于公众号:医学和生信笔记: m$ c0 [$ p0 H, }( U
    0 }1 x# E$ r6 h: z- T
    “ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。
    0 }- Y. w! U) Y, A: C/ Q' \. _* p本文由 mdnice 多平台发布
    ' k* ]! Y5 b* P; }2 J- @$ I0 @! t————————————————/ h9 x/ E1 M+ e, k5 R
    版权声明:本文为CSDN博主「阿越就是我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 y7 k2 @! T. c6 w) s原文链接:https://blog.csdn.net/Ayue0616/article/details/126768006
    & Y8 I- p5 k$ W5 G3 _) l* @7 k& H: q: C- A/ L! `3 z3 w

    ( n! W$ A6 d- [
    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, 2026-7-9 20:13 , Processed in 0.441376 second(s), 50 queries .

    回顶部