QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3172|回复: 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
    * S# [! L8 P( I" R% S. D  u2 d
    净重新分类指数NRI的计算" `. a" r2 C5 L2 |1 ~
    “ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。
    0 j+ Q1 h: g! K* v$ r! RNRI,net reclassification index,净重新分类指数,是用来比较模型准确度的,这个概念有点难理解,但是非常重要,在临床研究中非常常见,是评价模型的一大利器!$ ]: i- @) N- j! u, r$ q

    2 `) j& [8 K: Q7 @. V  E在R语言中有很多包可以计算NRI,但是能同时计算logistic回归和cox回归的只有nricens包,PredictABEL可以计算logistic模型的净重分类指数,survNRI可以计算cox模型的净重分类指数。! i2 d/ A9 T4 E2 C; H/ s

    5 [  D. W  @' glogistic的NRI8 o( S8 V) R9 U' u4 M: _
    nricens包2 o: Z) N3 w( I( t1 W6 |5 H8 @
    PredictABEL包5 l" L% q2 A4 k, s, T; D% L6 {
    生存分析的NRI
      \' I# C& h$ p! e8 K+ xnricens包+ j/ e2 G8 d" R4 r9 d
    survNRI包
    * [* ~0 B- S6 o/ [0 `/ slogistic的NRI* e% W' ~  \! l7 ]0 a
    nricens包
    ' q. R+ g  H, q9 N4 D! X# d#install.packages("nricens") # 安装R包
    % L8 I- T; f) W, |library(nricens)
    8 c4 x  U5 O! m2 T* [4 R2 v19 F4 w, m" F! Q" S5 r0 U
    ## Loading required package: survival9 B1 I9 C) @4 i
    1
    ! l- s/ I/ g2 e  |2 s) x7 Q使用survival包中的pbc数据集用于演示,这是一份关于原发性硬化性胆管炎的数据,其实是一份用于生存分析的数据,是有时间变量的,但是这里我们用于演示logistic回归,只要不使用time这一列就可以了。) z0 V& ]' z5 I% X
    6 V1 R5 B" P# v7 z6 V2 A( ]
    library(survival)3 v) R0 M3 \* u" |* |7 b/ v1 w

    : b% L) U% ]  `8 {; G! c. ~0 Q0 Q# 只使用部分数据- f; B$ H/ ?$ Q- M9 _; u, q
    dat = pbc[1:312,] * Z( g( @* Z0 G1 A
    dat = dat[ dat$time > 2000 | (dat$time < 2000 & dat$status == 2), ]3 u  d5 [# j8 C, A. J
    1 o' L6 h! b  c$ B1 @1 y* Y
    str(dat) # 数据长这样
    ; Z4 p- r: C  j1 M( A' Y! p" j% P1
      P! x, M9 O& U0 ]3 u* ~## 'data.frame': 232 obs. of  20 variables:
    # w- I6 o! }8 ?0 z# B. p% {##  $ id      : int  1 2 3 4 6 8 9 10 11 12 ...
    2 E3 W* H! v5 @& T$ m" c##  $ time    : int  400 4500 1012 1925 2503 2466 2400 51 3762 304 ...( s- A" W. [# U) s; D3 w' N
    ##  $ status  : int  2 0 2 2 2 2 2 2 2 2 ...
    4 U/ s3 R2 v6 W1 F; X##  $ trt     : int  1 1 1 1 2 2 1 2 2 2 ...% D7 t0 n  J4 }2 {% w9 A" }
    ##  $ age     : num  58.8 56.4 70.1 54.7 66.3 ...
    $ e- l& `' ^6 `4 H& v* [( @##  $ sex     : Factor w/ 2 levels "m","f": 2 2 1 2 2 2 2 2 2 2 ...
    ( v) h7 H/ g$ H# o- x6 t##  $ ascites : int  1 0 0 0 0 0 0 1 0 0 ...
    + n2 H  }0 \/ z) H: }1 C5 L##  $ hepato  : int  1 1 0 1 1 0 0 0 1 0 ...
    ; V% {, d" g% l* N0 j4 `, n##  $ spiders : int  1 1 0 1 0 0 1 1 1 1 ...; e& Z7 [5 @6 u; C  C
    ##  $ edema   : num  1 0 0.5 0.5 0 0 0 1 0 0 ...+ U# V/ m/ R$ H  {  U& U
    ##  $ bili    : num  14.5 1.1 1.4 1.8 0.8 0.3 3.2 12.6 1.4 3.6 ...
    0 r8 x' b" y- }; \##  $ chol    : int  261 302 176 244 248 280 562 200 259 236 ...
    + B7 q2 a+ z% S/ O; M2 s##  $ albumin : num  2.6 4.14 3.48 2.54 3.98 4 3.08 2.74 4.16 3.52 ...
    & o% K5 G$ n+ }##  $ copper  : int  156 54 210 64 50 52 79 140 46 94 ...3 `: R1 b& K! E. H) v+ L
    ##  $ alk.phos: num  1718 7395 516 6122 944 ...# W3 e" p$ I+ L# g; `
    ##  $ ast     : num  137.9 113.5 96.1 60.6 93 ...# i) J( r4 X! P/ i* S0 |
    ##  $ trig    : int  172 88 55 92 63 189 88 143 79 95 ...
    4 G. {' `: S$ X5 `9 M##  $ platelet: int  190 221 151 183 NA 373 251 302 258 71 ...
    0 f1 Q* r" a. c3 s$ g! V7 }##  $ protime : num  12.2 10.6 12 10.3 11 11 11 11.5 12 13.6 ...
    7 m; J; z  E4 B# w% M##  $ stage   : int  4 3 4 4 3 3 2 4 4 4 ...6 ?. g0 B" f5 T8 A8 b$ ^

    & b; r  Q! t4 U8 W! q  ?  O1
    ( w, S. p7 a& V% [dim(dat) # 232 20* ]6 d, `. i4 z; [5 W2 \8 U4 D3 ]
    1
    2 c( B9 X7 u. a## [1] 232  20
    $ F0 d. ]  [* L16 Q2 L1 b; m' @
    然后就是准备计算NRI所需要的各个参数。
    ( J8 Y& j( s4 `# _( h  f: V; @
    # 定义结局事件,0是存活,1是死亡
    : m) w$ b" w2 D: ~event = ifelse(dat$time < 2000 & dat$status == 2, 1, 0)8 {; t' o; P/ U2 E: b, I9 v, x: z

    3 B1 R/ l  X( n. j# }7 @+ l# 两个只由预测变量组成的矩阵% |: X. a2 K' l8 b0 O/ I
    z.std = as.matrix(subset(dat, select = c(age, bili, albumin)))& k" G. p, w) [# D
    z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))8 q8 s4 y- u8 ?

    5 X0 T7 e! u' x2 ?6 }# 建立2个模型6 W! ~: ]* q# v& d
    mstd = glm(event ~ age + bili + albumin, family = binomial(), data = dat, x=TRUE)
    # b4 _; W  O) b2 \mnew = glm(event ~ age + bili + albumin + protime, family = binomial(), data = dat, x=TRUE)
    8 v9 s1 `* }$ ~5 q! Z" T$ k5 I8 g6 j5 W: t; M! C
    # 取出模型预测概率0 s! {+ \3 N2 Y' w: P: O3 M: N5 ~4 U
    p.std = mstd$fitted.values
    7 `+ ]% p* g4 ]' `: ^2 q2 V7 J( |p.new = mnew$fitted.values. P5 {! c0 l5 y! ^9 y) R

    " y) |2 B9 _+ f7 [: \7 ?1' s- E. ~# ]. b* _. L: h7 h
    然后就是计算NRI,对于二分类变量,使用nribin()函数,这个函数提供了3种参数使用组合,任选一种都可以计算出来(结果一样),以下3组参数任选1组即可。 mdl.std, mdl.new 或者 event, z.std, z.new 或者 event, p.std, p.new。8 U# _3 e  j1 e/ f
    2 t, G8 M  Z( |) f
    # 这3种方法算出来都是一样的结果
    * g; N: B6 ]# H) @  v, s) S. V$ U. W% o
    # 两个模型8 q; Z& O: J9 B# Z+ l) Y
    nribin(mdl.std = mstd, mdl.new = mnew,
    6 g, \1 l( K% M) E- G# J- V: I       cut = c(0.3,0.7), $ l/ h* i" p6 |1 C
           niter = 500,
    " t2 C9 D9 }' {& f$ T( t       updown = 'category')
    4 t- o% i0 F  e. v& T' a; y* r$ }) L2 L' M1 O& ^
    # 结果变量 + 两个只有预测变量的矩阵
    2 ?" q- q) B& U$ M* u5 _nribin(event = event, z.std = z.std, z.new = z.new,   Q* D+ a' f6 O, E
           cut = c(0.3,0.7), " U1 P2 }+ o1 ]# V8 S: N5 C
           niter = 500,
    3 Y% J. ^) U! X" U       updown = 'category')
    # n5 O' E. h! l" P# f+ z' o1 G  r9 r% D% b# {6 B# J8 t
    ## 结果变量 + 两个模型得到的预测概率
    & c) U, R6 m8 b! R9 y4 M" l. rnribin(event = event, p.std = p.std, p.new = p.new,
    : Z9 j3 q0 f( q2 m9 ~/ x5 j       cut = c(0.3,0.7), 2 x. ^, |* j0 K: I; J
           niter = 500,   z4 i& O! N% O( K  m' ]$ Y
           updown = 'category')9 x. |' ~3 ]( j
    . Y/ l7 S' z4 W: d
    1
    + k; J9 o! @7 d4 \其中,cut是判断风险高低的阈值,我们使用了0.3,0.7,代表0-0.3是低风险,0.3-0.7是中风险,0.7-1是高风险,这个阈值是自己设置的,大家根据经验或者文献设置即可。
    ' p) g$ p4 Z& N( M! m/ e
    / w) x/ M; ?' Y; P- `niter是使用bootstrap法进行重抽样的次数,默认是1000,大家可以自己设置。9 U+ O0 z3 b% ]' R
    ; W( P* _  d. c8 O$ \+ ?1 s1 J, n
    updown参数,当设置为category时,表示低、中、高风险这种方式;当设置为diff时,此时cut的取值只能设置1个,比如设置0.2,即表示当新模型预测的风险和旧模型相差20%时,认为是重新分类。" f3 _  h) Q9 A# Y, `; m
    4 b7 k5 p0 X' Y( \+ i' U$ g/ U
    上面的代码运行后结果是这样的:
    4 o- H/ o: w: y- B' N7 U1 m" s9 ~$ E$ r& t1 q8 @* X
    UP and DOWN calculation:
    9 F1 {- R; @$ f2 i# ^  #of total, case, and control subjects at t0:  232 88 144
    3 Q- m& G) N  b" P: s9 r3 P3 o9 P' o. m' [* V" w1 \. I
      Reclassification Table for all subjects:& }0 |# {2 x' r) J9 H
            New
      B9 H8 t! B+ V1 b; v; vStandard < 0.3 < 0.7 >= 0.7
    * u- v$ {, U7 N' u0 o& ]7 ~5 m3 N7 O  < 0.3    135     4      0/ |' D1 U6 w4 ~1 ^  C
      < 0.7      1    31      4
    0 L- s& V) ]% ]  >= 0.7     0     2     55
    9 ^+ L! U& c9 ~$ J7 B0 _
    7 R( T/ g$ H# I3 \) ?/ Q- s1 u  Reclassification Table for case:
    + H# C. X- @; t4 y        New* [/ j# K+ j* Y* B6 k
    Standard < 0.3 < 0.7 >= 0.7
    ; s5 Y0 h7 b) [' y: h& _! n  < 0.3     14     0      0! h2 o& P# H$ V
      < 0.7      0    18      3
    3 [1 V2 _: y0 ?$ C  >= 0.7     0     1     52
    % F+ {5 z* H6 `  G6 q2 I: F4 k' M- g4 W* h; d' t
      Reclassification Table for control:9 }8 D. ?! c0 T: d
            New
    1 C6 s9 S2 G: lStandard < 0.3 < 0.7 >= 0.7
    . _9 r' ?1 W' X1 ^% V  < 0.3    121     4      07 m& K& W$ u+ b6 b3 j# ]) Q
      < 0.7      1    13      1: o- Y2 T! W+ ?: V
      >= 0.7     0     1      33 n: A1 D5 n1 K3 f# d" Q
      g# @  W; _! w& ], x3 |
    NRI estimation:0 n# e  T0 r2 X% t, L' T2 b2 H
    Point estimates:, u2 \' r4 |# ^. \, b1 h7 |' x
                      Estimate
    # l* p) R9 v7 R- ^* Z4 kNRI            0.001893939  C5 C% k( L% z- E% S0 l$ z
    NRI+           0.022727273
    8 v) f7 L, Z( BNRI-          -0.020833333
    ; Y- K6 _; t  ^0 bPr(Up|Case)    0.034090909/ _0 a% |  @8 M% ]; ~3 C- [
    Pr(Down|Case)  0.0113636368 N1 `* k4 _: j9 T% M- B# |9 X0 B
    Pr(Down|Ctrl)  0.013888889
    7 |' G  C5 |) ?4 {" i) L% B" UPr(Up|Ctrl)    0.034722222% L  _: G# B, b1 C8 k& B

    # d1 J7 [9 D1 e+ zNow in bootstrap..
    # A9 X8 d- P2 u+ G0 q1 q5 O, u3 }) K/ d' _
    Point & Interval estimates:
    0 O, Z/ ?. T/ {                  Estimate   Std.Error        Lower       Upper: f* d) G  I: k1 M0 I$ u
    NRI            0.001893939 0.027816095 -0.053995513 0.055354449% y2 Q6 w" B% |* O
    NRI+           0.022727273 0.021564394 -0.019801980 0.065789474) t2 F) z) M$ p; H- B0 x
    NRI-          -0.020833333 0.017312438 -0.058823529 0.007518797- k- j5 m" A; {& T/ H% q
    Pr(Up|Case)    0.034090909 0.019007629  0.000000000 0.072164948$ l" c3 K( b$ t* y, I* G
    Pr(Down|Case)  0.011363636 0.010924271  0.000000000 0.039603960) _& L3 [5 N. T' i5 H3 E
    Pr(Down|Ctrl)  0.013888889 0.009334685  0.000000000 0.0352112686 a( C2 D5 p2 ^: G, m; S
    Pr(Up|Ctrl)    0.034722222 0.014716046  0.006993007 0.066176471
      t. B, r+ }" K
    . T+ U6 L' m8 c1 `$ `( H1
    / q! a) Q! [) Z5 V! X首先是3个混淆矩阵,第一个是全体的,第2个是case(结局为1)组的,第3个是control(结局为2)组的,有了这3个矩阵,我们可以自己计算净重分类指数。1 w  k+ J9 f9 w- a3 j( d" E6 j  c: R2 c
    1 G1 M6 L8 w! B: S; }/ |$ o2 c- h/ Q& F
    看case组:
    : s# j, C  O9 r7 O& O& D+ L
    $ {2 c) v) E+ n0 O" m  D5 |( z& v净重分类指数 = ((0+3)-(0+1)) / 88 ≈ 0.0227272733 _2 b: B/ s/ p' [9 j
    9 E. W" m! J9 j0 x2 e
    再看control组:; e4 B) E0 d+ w

    0 T* `+ w& N5 f$ T) c5 z净重分类指数 = ((1+1)-(4+1)) / 144 ≈ -0.020833333
    # ]. b/ b! r/ Z+ ]. T  h
    5 f& \9 z9 _+ j/ V/ C8 g! v相加净重分类指数 = case组净重分类指数 + control组净重分类指数 = 2/88 - 3/144 ≈ 0.000315657
    ; o; p. a: n6 W# a, L- o: x/ ~
    再往下是不做bootstrap时得到的估计值,其中NRI就是绝对净重分类指数,NRI+是case组的净重分类指数,NRI-是control组的净重分类指数(和我们计算的一样哦),最后是做了500次bootstrap后得到的估计值,并且有标准误和可信区间。
    . L8 s' W2 {! ]  M+ z" q# O' n2 `
    最后还会得到一张图:
    & H' R/ J: V& y5 O% m* d; A4 ], S1 [! ^! E  v
    这张图中的虚线对应的坐标,就是我们在cut中设置的阈值,这张图对应的是上面结果中的第一个混淆矩阵,反应的是总体的情况,case是结果为1的组,也就是发生结局的组,control是结果为0的组,也就是未发生结局的组。+ }0 \7 N7 u, `: i# C0 `

    7 Q% o* b, n* q3 o1 F3 dP值没有直接给出,但是可以自己计算。- S# s7 L0 g2 c5 r& }' Y% f
    7 S, I" x1 U! C4 i* y6 A" B/ `
    # 计算P值) J6 Z% ^7 x" M0 k1 H
    z <- abs(0.001893939/0.027816095)- M3 ]& u% T/ W$ i! Q# R
    p <- (1 - pnorm(z))*2
      K- K# w. p+ E/ {+ Pp2 r9 D/ K0 a# m% V8 Z
    1, P2 a( i, V+ q& Z6 S: D
    ## [1] 0.94571576 A8 ]8 V" ]4 T% P0 D) A' n: L% V
    16 a; j' u- B, Q1 m7 _. c* T2 _
    PredictABEL包5 s1 N% E3 F- Z3 `$ J2 ~3 [
    #install.packages("PredictABEL") #安装R包3 J7 A' [4 M- b, o
    library(PredictABEL)  $ V$ h6 q+ h3 g5 O
    2 [/ ?& g1 I  V4 n
    # 取出模型预测概率,这个包只能用预测概率计算2 S# f5 z) S" l* ~+ _* Y
    p.std = mstd$fitted.values
    1 H; S0 ~( l. a( i% v0 fp.new = mnew$fitted.values
    4 }) f7 n  s# k( O% O+ x1
    . H7 Z1 d% [, O6 d1 C然后就是计算NRI:4 k9 a/ Z5 [( Z) Q

    6 W# s  z# T2 D  D/ }$ K! t- rdat$event <- event/ m: L8 G4 ]6 n3 g% H9 r& ~
    4 E3 ~% w& f4 w
    reclassification(data = dat,
    ( g  r- y9 ?' W- @* E( d+ k; D. P                 cOutcome = 21, # 结果变量在哪一列
    : X, R7 k+ f7 n- h2 @                 predrisk1 = p.std,9 V+ i: f5 H. K- N- |% @
                     predrisk2 = p.new,
    8 R0 a  M+ i4 ?7 B                 cutoff = c(0,0.3,0.7,1)2 I. E1 H& U0 R
                     )
    0 x$ B% T5 t+ @! s: B15 P, ]( u! M( z3 c
    ##  _________________________________________
    : t% ?# |5 b1 J% e7 `4 q##  8 l3 h. M# a- b- u0 e
    ##      Reclassification table   
    ; n# w6 a) O8 G& E$ ~* b##  _________________________________________, ~# \! r( T" g, F" T
    ## 8 U; O! E& u& y8 i
    ##  Outcome: absent 8 d, u! D9 ^8 P9 X4 R) A
    ##   
    7 }& T) c: R- v/ _+ Q##              Updated Model* i; m8 n4 I6 j
    ## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified2 V1 o4 A% S& [
    ##     [0,0.3)       121         4       0               3
    * S. v. M# I+ e: u/ E7 s* [: {& l##     [0.3,0.7)       1        13       1              13
    * f- @1 _$ Y0 I3 g9 k( ~##     [0.7,1]         0         1       3              25
    8 A! |9 H; z9 ]& E9 ]* [2 l## 8 M: m" V" {9 E
    ##  
    7 K8 Y4 l' h7 R- e+ v5 \) r4 S##  Outcome: present   V5 u4 s4 F+ Z+ @
    ##   
      b* V! ^1 `' t' s1 ?##              Updated Model
    ) A# y& i9 V" Y; A## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified2 }! C# D& P% U
    ##     [0,0.3)        14         0       0               0
    8 Z# f! C$ M, X9 F##     [0.3,0.7)       0        18       3              145 O2 J$ E/ e, R8 i
    ##     [0.7,1]         0         1      52               2
    * ^  j. N( v# A9 j1 |( [## , t% u$ n( t+ n- q3 x( y/ F* t
    ##  ) G2 ]& D5 |, s* s+ g. [1 F
    ##  Combined Data
    1 J3 F, ?- W0 o9 R  x##   3 S0 y4 R+ U: P% w/ i8 S) j
    ##              Updated Model- T0 z7 g9 d% N/ ~* B6 p: y
    ## Initial Model [0,0.3) [0.3,0.7) [0.7,1]  % reclassified
    ; s+ l$ F/ F& {& Q$ b##     [0,0.3)       135         4       0               32 V6 ~) G; b9 [
    ##     [0.3,0.7)       1        31       4              14: S5 W7 a9 {, d4 j8 F
    ##     [0.7,1]         0         2      55               4
    5 Q) ~3 p1 N/ `+ ?! N0 D5 A##  _________________________________________: [9 J2 u$ v! U/ V# i9 X
    ##
    * O0 ?6 q) C6 y##  NRI(Categorical) [95% CI]: 0.0019 [ -0.0551 - 0.0589 ] ; p-value: 0.94806
    ( `# p3 w% |$ K& f6 A. k# y##  NRI(Continuous) [95% CI]: 0.0391 [ -0.2238 - 0.3021 ] ; p-value: 0.77048
    ' r# V5 ?3 N- F; n' C##  IDI [95% CI]: 0.0044 [ -0.0037 - 0.0126 ] ; p-value: 0.28396
    5 d. h( M5 `- [' G5 w6 o! K# ^5 {0 z- S( c! G
    1
    - a7 \% w: l/ O7 J  O! [结果得到的是相加净重分类指数,还给出了IDI和P值。两个包算是各有优劣吧,大家可以自由选择。% r, |0 p  N' T6 |+ j) M0 z

    % P; z4 T7 f6 B$ Y0 K9 |( ]' Y生存分析的NRI  {% c, J9 d1 }9 d
    还是使用survival包中的pbc数据集用于演示,这次要构建cox回归模型,因此我们要使用time这一列了。8 _: [) U$ S  `
    - N" w. g: x- B9 F* ?9 j
    nricens包
    8 r( I* C1 C+ d9 M) Tlibrary(nricens)/ R/ u2 [3 n, o  h6 X4 h
    library(survival)( x7 o. @( d/ r0 ?: [: C8 T! V
    6 g8 d  j+ i! H% Q8 o
    dat <- pbc[1:312,]
    2 g# e% H! `/ ]  u0 ?dat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡
    ) }7 j2 v, T$ i1
    0 `" a6 E9 L! r然后准备所需参数:) {/ R/ e6 [. C4 m; H4 Z
    . T3 b+ y& Q8 ?  p. @% v7 Z
    # 两个只由预测变量组成的矩阵( O; \3 c6 ~( K' b! ]3 h
    z.std = as.matrix(subset(dat, select = c(age, bili, albumin)))
    " G" N8 b" e+ T. wz.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))) b7 _7 U: J# V$ e) w5 H2 \: n
    8 D2 ?* U2 M: r, u: [7 u
    # 建立2个cox模型$ m# X3 W' W6 r5 ~' H; |
    mstd <- coxph(Surv(time,status) ~ age + bili + albumin, data = dat, x=TRUE)
    % }' E2 x/ S0 b" s7 tmnew <- coxph(Surv(time,status) ~ age + bili + albumin + protime, data = dat, x=TRUE)1 r( R8 i1 V' Y! t# q+ ~& _/ Z

    1 A% Y/ l. Z$ P3 R' B  F# 计算在2000天的模型预测概率,这一步不要也行,看你使用哪些参数
    ( E" s8 J3 M5 ?( |- p' _: ]5 }/ Bp.std <- get.risk.coxph(mstd, t0=2000)
    7 a- s1 ?% ]  C! R0 i4 ~p.new <- get.risk.coxph(mnew, t0=2000)
    8 L  g; A1 X5 |: \- W- q* B1
    1 Y( ^! x5 \: M2 F* H计算NRI:
    0 Y6 K6 I5 ?2 J! w0 N! P+ v8 ]0 l3 N6 I1 V* N' @3 r) O
    nricens(mdl.std= mstd, mdl.new = mnew, 5 A/ ~4 C* ~' `; `( A* M
            t0 = 2000,
    : M* I5 f' O2 y5 M% w        cut = c(0.3, 0.7),
    ( G0 h6 e- l5 G9 Q% x        niter = 1000,
    / m; ~. `  q; S3 S$ k4 i, k7 V. l        updown = 'category')
    % W2 ^) t4 U/ Z! C9 k+ r# X- C: W- E9 y1 l% {+ K5 |
    UP and DOWN calculation:# i7 t5 g' Z; ?: P* \. h
      #of total, case, and control subjects at t0:  312 88 144
    ) C! s  M  U  q, I1 M& O- V( w7 {5 ]/ W
      Reclassification Table for all subjects:, R/ R  z  D$ A7 X+ |# T9 V7 q5 C
            New( C! J+ V2 W- n+ t6 G. E  O
    Standard < 0.3 < 0.7 >= 0.7
    - [4 r' F! ]+ C: u, [  < 0.3    202     7      09 ~9 M& j* p! q6 E( w
      < 0.7     13    53      6
    / ?% }2 R0 G; o1 o4 i- f7 _0 P2 F  >= 0.7     0     0     31
    8 s3 f1 r  h' d# j) T* N
    ; G, M( P- n; E9 E9 U/ K3 f3 Y  Reclassification Table for case:" u+ ^+ I. N( t$ c) o* O" F6 ^
            New
    6 g. D4 Y7 I2 a, XStandard < 0.3 < 0.7 >= 0.7
    6 C( d) X  V# f4 X. E  < 0.3     19     3      04 e% I/ h3 C4 r. j( s
      < 0.7      3    32      4( w; G5 F7 }; S6 A0 _6 n
      >= 0.7     0     0     27( M, d* {6 E7 J

    5 z5 \1 s! T7 n! X7 i6 |" R2 d  Reclassification Table for control:6 j& M! w6 z9 [5 _) B. t, \9 C
            New
    4 F7 a* J2 h! ?' E" cStandard < 0.3 < 0.7 >= 0.72 h. H% R& E, W# O* G, u
      < 0.3    126     3      0& ]; c, c9 [+ U% E  m# X
      < 0.7      5     7      26 q& G" `3 B# D$ P
      >= 0.7     0     0      1$ I  J0 ^( y/ F8 s" u
    9 k% G6 }% P/ ?" s& C6 Z+ y) l$ N
    NRI estimation by KM estimator:
    0 R3 J) P, h& \0 y0 x' J8 p6 H8 z6 k( }7 W- `; W$ w
    Point estimates:
      y+ S* }1 Y2 v: P& R& C8 K                Estimate
    " R  v& o$ {& L$ `/ R6 ONRI           0.05377635
    $ q. t) A3 c5 q9 V1 I& v% F! U/ a7 d3 dNRI+          0.03748660: d* O* R/ i6 h* a7 {
    NRI-          0.016289745 S8 d; U- c# ]4 ^$ p
    Pr(Up|Case)   0.07708938
    0 Y7 }: M8 l, ^5 e& e1 k5 j! R0 U, EPr(Down|Case) 0.03960278
    . F: X8 H9 S. YPr(Down|Ctrl) 0.04256352( N7 u- \1 o5 W8 X: c
    Pr(Up|Ctrl)   0.026273782 M+ D) {& X7 b2 B/ }

    # k- `1 M  W  U# BNow in bootstrap..
    ; @& b8 X0 z3 a' Z! \
    # \" Z/ j$ p! e$ U: z9 IPoint & Interval estimates:0 n, S5 D: N0 O2 ~/ P5 I) s
                    Estimate        Lower      Upper
    6 {2 {" r8 S" |* bNRI           0.05377635 -0.082230381 0.16058172  {& n( K) H# x8 U0 @( e
    NRI+          0.03748660 -0.084245197 0.13231776. e  M& [9 y# ]2 L- K
    NRI-          0.01628974 -0.030861213 0.06753616% I8 ^! a6 }& A$ b
    Pr(Up|Case)   0.07708938  0.000000000 0.191022918 r) Q1 m: v" Z# W8 R2 A1 |
    Pr(Down|Case) 0.03960278  0.000000000 0.15236016
    0 V. A" @- r+ U: m& IPr(Down|Ctrl) 0.04256352  0.004671535 0.09863170" Y- f* e, X7 E  ^9 c
    Pr(Up|Ctrl)   0.02627378  0.006400463 0.05998424
    ' I& R) N- C" R# i9 c# y2 C8 ?& m6 p* o
    1- s1 G4 D" C5 u1 v4 w2 q& E
    9 o# x! P9 U8 f
    Snipaste_2022-05-20_21-49-38& `9 L- w. N  R. D2 w# I0 x
    结果的解读和logistic的一模一样。+ K- Q% I' K( Y3 y: V" H
    : A( K& H5 @/ ?# [, K) z5 o
    survNRI包5 `1 L. x5 G& w
    # 安装R包3 y/ L( u0 L. s
    devtools::install_github("mdbrown/survNRI")5 t4 ?# w7 a  ?3 P% H
    1  B  j& }5 g- C; l3 X' X" S8 s. ~2 H
    加载R包并使用,还是用上面的pbc数据集。1 E0 Z& a' k+ X4 c4 |
    7 @: o3 Z0 H$ y8 p' T
    library(survNRI)& l, e, {  N, \! w% {
    1
    : s. _# q0 O3 Z+ t% T5 k( T* v6 F## Loading required package: MASS- n) e5 B( s6 h/ r
    1
    - z# z' d, h" Z, U$ z& Elibrary(survival)$ ~& I4 m8 U3 d
    ' l2 d# h2 @7 ]' l/ \+ [
    # 使用部分数据
    % ?1 M) m( W- R0 S# Gdat <- pbc[1:312,]
    2 ^8 E0 s  \* U( Edat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡: f3 f  `) O+ z, @. ^
    1 ]4 A& W) W1 Y5 d2 V/ ~
    res <- survNRI(time  = "time", event = "status", ; [7 F/ j0 x% m$ z& f1 d" F. [
            model1 = c("age", "bili", "albumin"), # 模型1的自变量
    9 }$ Z& l) m6 u6 l        model2 = c("age", "bili", "albumin", "protime"), # 模型2的自变量3 u  g* z+ O: m4 C' [. w' X( @5 x1 I
            data = dat,
    $ u( h$ {( ~1 z+ y# v& q! W, f        predict.time = 2000, # 预测的时间点: u9 J$ L' r0 q  o
            method = "all",
    : M4 t" e1 K% c6 y% h        bootMethod = "normal",  
    + e, c; G$ _( t3 y        bootstraps = 500, 7 |" e/ b. b* U# Y: P) E
            alpha = .05)
      h* v3 ~, y: w
    % i' J0 Q3 m" E! c$ J6 z4 E13 `; Z1 m: `% n
    查看结果,$estimates给出了不同组的NRI以及总的NRI,包括了使用不同方法(KM/IPW/SmoothIPW/SEM/Combined)得到的结果;$CI给出了可信区间。
    ) L4 F9 @# Z5 J0 m) b& K  D, Q% l" w9 G3 K4 ]
    res
    2 L$ J8 @" L8 E1 A2 c8 S0 ^1 K19 A) d, u. U! r6 w% a- K9 U
    ## $estimates
    7 t' P# b4 [8 `8 ~; ]  K##            NRI.event NRI.nonevent       NRI. ?+ q; f" b1 b4 ?
    ## KM        0.20445422    0.3187408 0.5231951
    4 M  q  h! D7 y6 P## IPW       0.22424434    0.3273544 0.5515987
    0 c$ z5 S! s- c5 Q1 ^" i## SmoothIPW 0.19645006    0.3144263 0.5108763
    ) o! @+ u# d# S% r' E## SEM       0.07478611    0.2632127 0.3379988
    ) w2 p( d# _4 Z& K1 W( p" c# w1 }## Combined  0.19633867    0.3143794 0.5107181
    4 k1 Y3 q4 j; n: S' s* ~5 X; r, j## 8 J/ f& @' V& ]4 y
    ## $CI- G- ]$ j2 `2 G
    ## $CI$NRI.event& |  S. K9 c1 p& O5 G5 b' K
    ##                     KM         IPW   SmoothIPW        SEM   Combined/ I0 z1 |7 b+ o1 ?  q9 ~
    ## lowerbound -0.03915924 -0.02185068 -0.04724202 -0.1162587 -0.04737232 B; p$ J( b. p3 z  c" v" D0 Q
    ## upperbound  0.44806768  0.47033936  0.44014214  0.2658309  0.4400496
    6 c) o: c. y0 U: G* a1 k" U% i##
    - R2 n6 @4 y* R8 x% g' |2 g: U## $CI$NRI.nonevent
    3 p: }  i$ g0 F0 b- x8 j! r##                   KM       IPW SmoothIPW        SEM  Combined
    5 u+ G, ~: B; u; n+ s& K( p## lowerbound 0.1317108 0.1396315 0.1286685 0.08638933 0.1286426% L' j! ^, t  i& [; Z; ^# o. u
    ## upperbound 0.7102251 0.7393216 0.6966341 0.51482212 0.6964549
    # L+ \3 `- G; b/ o# }6 |## 3 y. {, q. w1 C/ r3 g
    ## $CI$NRI
    . H8 H. z$ C( g' u##                     KM         IPW   SmoothIPW         SEM    Combined: T3 J6 N- B, N. S5 Z7 Y' D
    ## lowerbound -0.05112533 -0.04569046 -0.05439863 -0.04132364 -0.05443409( e2 T3 D* [4 [* j, t9 q2 r4 t
    ## upperbound  0.89306122  0.92464359  0.87970125  0.64253510  0.87953153) `) I5 N; d& h0 U5 U" f( P( i1 j1 w
    ##
    : @6 R$ M2 P& L6 H$ b$ u% q## ' r! ]3 k' y" Q" C1 Z, }  O! U
    ## $bootMethod
    ! {' k  _6 W' ]( h## [1] "normal"
    : O9 k8 M5 {. c  T) o( X/ ]- J##
    7 U3 o5 y/ S+ n  l2 h* {0 t## $predict.time6 t8 o" g# d  W2 d
    ## [1] 2000
    ) K( _" J; ?8 b5 W) R3 I# c## , u; f4 U% K. T' v
    ## $alpha3 h4 o5 e1 v2 R  i$ K
    ## [1] 0.05
    ) a) s5 X% K/ h0 X: n9 w$ |## : I; V# }$ C" M. `, ]
    ## attr(,"class")
    9 u! ?7 [* j. ]& r7 V## [1] "survNRI"
    2 |9 P+ R3 B, H9 B
    ' C3 {7 I; N/ S' Y" H$ O* B1* \; d/ X( }4 t, C7 V
    OK,这就是NRI的计算,除此之外,随机森林、决策树、lasso回归、SVM等,这些模型,都是可以计算的NRI的,后面会继续介绍。大家如果有问题欢迎在评论区留言。3 m7 X, J5 _( S5 x* Q

    ( K! M# i2 @3 D本文首发于公众号:医学和生信笔记3 X5 C$ W. |6 V# z  \

    - G3 H; g+ h1 R1 t“ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。5 I( W; ?& K3 @5 a9 Y' F
    本文由 mdnice 多平台发布
    ! E# m0 i( Z) d. I1 {% V! Q————————————————
    ! U* q1 x  C9 L4 m9 ?4 K) `版权声明:本文为CSDN博主「阿越就是我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 F' {4 r  K( f+ e; b  b2 `4 F$ v原文链接:https://blog.csdn.net/Ayue0616/article/details/1267680063 I3 Y( [- a. ^. K. E4 z
    3 S  B8 s" ^% b& {

    ! |. b7 m( f5 r7 Y, V  s/ o' h
    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-10-8 08:17 , Processed in 0.278359 second(s), 51 queries .

    回顶部