+ Z' p; V m8 G/ v* D" Y1. h0 W9 x; a; I1 a2 Z0 b+ D
结果得到的是相加净重分类指数,还给出了IDI和P值。两个包算是各有优劣吧,大家可以自由选择。% E/ x+ T5 Z. I& }. A
% F2 @3 e7 b D9 s7 H
生存分析的NRI ' z) M% n [- T. C还是使用survival包中的pbc数据集用于演示,这次要构建cox回归模型,因此我们要使用time这一列了。 , W3 _2 b4 j% E |( O8 D3 R3 b5 K 0 l& I+ q, q$ G, L9 M; Knricens包 ( E- A- V" f9 Y' w( @2 t/ `library(nricens)8 e7 J9 e& c+ d0 R z- N
library(survival) : u& w) y! f5 s) c) D. \5 y5 B: @5 U ( J6 M7 X0 q. k% W" h. Zdat <- pbc[1:312,] % m+ c q. \& mdat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡0 I7 \# L3 V5 {; E+ f Y7 W' q3 s" w6 I
1 1 ^8 |/ B3 p' R1 x然后准备所需参数: X8 ^4 k) n, Y r! T8 O9 p5 W/ W6 g+ |, g: p5 h0 B: E
# 两个只由预测变量组成的矩阵" @/ g( I8 `5 J& g- P
z.std = as.matrix(subset(dat, select = c(age, bili, albumin))) " Q9 r3 m* L1 w3 n9 @- t4 n% ^z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime))) 2 X2 c) i. j1 F & q) G( |% C( t* a; S- q# 建立2个cox模型 ) O8 f( R& P/ G/ _. u- u+ N) a5 S- ?mstd <- coxph(Surv(time,status) ~ age + bili + albumin, data = dat, x=TRUE) # k( \; I5 C) ?% Qmnew <- coxph(Surv(time,status) ~ age + bili + albumin + protime, data = dat, x=TRUE) , J+ v# n3 k( p1 R+ B8 `+ U0 q% _2 s0 f2 y6 d. e
# 计算在2000天的模型预测概率,这一步不要也行,看你使用哪些参数 : W( {: r0 k" @p.std <- get.risk.coxph(mstd, t0=2000) ) Z, T; d4 @; d: ^p.new <- get.risk.coxph(mnew, t0=2000); d3 @, }4 P5 S
1! l5 c( X& d7 }7 L" m. w
计算NRI:3 J7 ]' z3 j- v
6 q5 C) `+ J1 v5 w
nricens(mdl.std= mstd, mdl.new = mnew, ' I* H& e5 c3 n/ p) i
t0 = 2000, 3 w& |/ j7 C8 m2 d! O- A: h6 Y; W cut = c(0.3, 0.7),. E% w5 }% k5 ]7 h) t! Y2 c
niter = 1000, ( |' X6 V5 ~1 A' @4 P. M
updown = 'category')# T% p1 J0 b) e) M; l0 h" s0 ^9 j
7 G7 T' Y7 W3 E/ }% n1 Q2 p) YUP and DOWN calculation:9 w8 C' x0 O, C5 q: y8 T
#of total, case, and control subjects at t0: 312 88 144& E+ q" R) a; n- z
1 ]# W8 l) |" D# o Reclassification Table for all subjects: i0 s* d" g5 p- I; B- Y New& O: I8 ^, d1 ~, o& U1 n
Standard < 0.3 < 0.7 >= 0.7( e5 m* L) M; p; f: U
< 0.3 202 7 0 0 V! ]9 k+ x1 R- Q5 W! g < 0.7 13 53 6 . m! `) t/ k+ N3 g" o >= 0.7 0 0 31+ z" K S. R5 G& m
" m+ z+ R; d( K Reclassification Table for case: 6 Y& ]$ B; S( q2 k) @$ I- H New0 Q$ J7 y- [+ X' d
Standard < 0.3 < 0.7 >= 0.7 " h! P3 m7 ~4 I) ?0 s) { < 0.3 19 3 0! z f" l1 C( J
< 0.7 3 32 4 9 t6 \( W# [( b( c >= 0.7 0 0 271 X0 g! ~( l2 i" B. c$ s
$ j/ j0 I% P1 S' d( Q* @1 V
Reclassification Table for control: ) P5 g9 P, J( e# @. d+ }$ [ New / T% c0 J) k9 k4 yStandard < 0.3 < 0.7 >= 0.77 t9 }: C0 [6 t
< 0.3 126 3 0: {# H3 m. l6 U+ f
< 0.7 5 7 2- E4 d; X8 M/ ?* w: o6 c8 D
>= 0.7 0 0 1 4 @$ X5 f: e' |4 D* R 0 G# O$ ^- Y4 ]: f8 @) ^NRI estimation by KM estimator: 6 { N; v8 P5 v1 j4 @7 K: R/ j* G8 J1 J4 p) W7 c3 A* V
Point estimates: : g5 p- x9 g9 V7 r' e6 c Estimate6 \! p. k8 f2 C9 Y' Z: M! [" C R
NRI 0.05377635 j2 |! [- q! N2 e
NRI+ 0.03748660 5 J8 [! ^) x) m* `& a* x0 b, G/ FNRI- 0.01628974) M, o; }6 N( {5 N
Pr(Up|Case) 0.07708938 4 |& h- f$ S- u$ ^6 ?Pr(Down|Case) 0.03960278# K. X3 n2 c& O1 q2 s t1 c
Pr(Down|Ctrl) 0.04256352 2 Z& L Q" J# p0 HPr(Up|Ctrl) 0.026273786 `0 U4 g5 L8 \' U* m: |8 M* V+ G
7 g4 ?/ ~: @$ @- _1 p5 ]Now in bootstrap.. : Q' M" ]* }5 J- K9 r2 }. B6 w8 _1 V) r7 V/ f/ O
Point & Interval estimates:' F' g# O7 G6 G8 ]$ I& B
Estimate Lower Upper5 o4 N% ^6 [; G
NRI 0.05377635 -0.082230381 0.16058172 , K5 V/ W& u" ?( J' m- wNRI+ 0.03748660 -0.084245197 0.13231776. p5 S4 @5 {6 A
NRI- 0.01628974 -0.030861213 0.067536169 R9 N7 Z! Z& z1 g
Pr(Up|Case) 0.07708938 0.000000000 0.19102291 ) e x0 A6 `* N) T( Z# y, _Pr(Down|Case) 0.03960278 0.000000000 0.15236016$ X2 N9 g4 y5 X1 T
Pr(Down|Ctrl) 0.04256352 0.004671535 0.09863170; j3 e& i6 G5 I1 \2 `
Pr(Up|Ctrl) 0.02627378 0.006400463 0.05998424) v% H8 p; J& X1 @
$ B( r, g; v% S6 o) ]0 Q0 a: ?
1 8 Y7 z* U, w8 ]# k8 H- W4 L# N8 \1 |" L: Y' Z% t3 F9 g: M, H$ q
Snipaste_2022-05-20_21-49-38/ O; K$ A, f: N" r1 `
结果的解读和logistic的一模一样。' |& P" h5 m; ^- N3 H/ i
4 ?: q7 [ J% Q8 Z3 _% o a
survNRI包3 q I( }. } h3 O. q( W# |) [; h8 ` E
# 安装R包2 ?$ j& \( J3 N( N
devtools::install_github("mdbrown/survNRI")/ A1 j) o" ]' i+ W# G; [6 H: h- f
1 " K* K% z `6 C2 d/ a2 N加载R包并使用,还是用上面的pbc数据集。6 b- o& m& s9 c+ B$ d- q
! }$ j7 y, |; M: [, r* }
library(survNRI) 0 @ m6 S/ N: ~6 |7 I) W( Y1& X/ B5 I, ?/ Y& Z( m+ Z
## Loading required package: MASS 0 N: z/ H7 n) u" F3 i/ V1$ a2 i7 v2 K0 K+ W- @3 _3 k. ~% F4 D
library(survival)" I+ V& }1 ?9 A( |2 ^+ z
/ R+ Z+ U' F$ ]" b* d) `( O$ d5 E& ^
# 使用部分数据 9 _2 }" |3 N% }* U1 M0 mdat <- pbc[1:312,]2 C/ L: E' d8 V" O* K
dat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡 0 v3 p7 {* D, I% V) r& q; t' V# V' P5 I9 V2 @$ ~
res <- survNRI(time = "time", event = "status", ! E: o, D$ s6 t9 M. t9 n. p; | [$ L
model1 = c("age", "bili", "albumin"), # 模型1的自变量% l" I& V; K$ _ Z
model2 = c("age", "bili", "albumin", "protime"), # 模型2的自变量 5 _. E/ F9 a$ }, ?; O data = dat, 5 j. C& T6 p) t4 h predict.time = 2000, # 预测的时间点 * p( a1 X+ H. v+ l; l method = "all", ! ]# ?6 y4 U( \) u4 s v5 E0 `2 A bootMethod = "normal", 4 f! b6 K1 p; Y. E7 W. H$ L3 ~ bootstraps = 500, 8 ]- F8 n' z& [3 i$ Z
alpha = .05)# ]+ [7 U$ k8 Y' i
+ W' r7 o* [" x* ]& ]* Z% f1 ' J' L1 r" S! }" k" [: a% N查看结果,$estimates给出了不同组的NRI以及总的NRI,包括了使用不同方法(KM/IPW/SmoothIPW/SEM/Combined)得到的结果;$CI给出了可信区间。 / \! ]. \2 K. L8 M- N 8 l& p, p; l6 {5 F+ f8 ires& d0 A6 X3 e2 ?( n+ ?. E( a! @( R
1 % Z# e8 ~9 D; A9 F( c! H## $estimates8 f1 M: d) V) R- k; V2 d
## NRI.event NRI.nonevent NRI- r& O, K1 [* t% T
## KM 0.20445422 0.3187408 0.5231951 % E/ Z' j8 l3 W## IPW 0.22424434 0.3273544 0.55159871 E. _6 b8 T8 ^/ s$ W. K) h- e* \
## SmoothIPW 0.19645006 0.3144263 0.51087633 J% }: a& ^& r3 V* U0 M! H7 P
## SEM 0.07478611 0.2632127 0.3379988 - i% G7 E* k& i; i5 e## Combined 0.19633867 0.3143794 0.5107181( h* r2 }* O4 K5 ?) U# J
## 1 X! I# ?$ u M% ], l& M
## $CI" O4 g. a5 m; I/ m" g2 r' C
## $CI$NRI.event & P1 T* K2 [3 I## KM IPW SmoothIPW SEM Combined * Z% W3 E- n( f' Y9 b9 Q4 a## lowerbound -0.03915924 -0.02185068 -0.04724202 -0.1162587 -0.0473723 7 _' H+ `( y: V1 R# l## upperbound 0.44806768 0.47033936 0.44014214 0.2658309 0.4400496 6 J$ K2 U- K1 K( O. `& V1 {## $ I A! M. l8 O V0 {7 {& `## $CI$NRI.nonevent) i4 C* L0 f+ ?# o! V
## KM IPW SmoothIPW SEM Combined4 G: _4 P- m# h" q4 Z, d
## lowerbound 0.1317108 0.1396315 0.1286685 0.08638933 0.1286426) c" E. X) n9 n' K2 ?! b8 s
## upperbound 0.7102251 0.7393216 0.6966341 0.51482212 0.6964549: W2 q/ d% [% j4 e+ G3 Q+ k+ g9 C
## & j$ \3 J H+ |6 X. n. O/ F
## $CI$NRI5 j& u4 W" X4 o/ j* [# Y3 W6 S
## KM IPW SmoothIPW SEM Combined) C. N( R! I5 b& ?& M' G
## lowerbound -0.05112533 -0.04569046 -0.05439863 -0.04132364 -0.054434099 E& Q6 ?% y, m! T
## upperbound 0.89306122 0.92464359 0.87970125 0.64253510 0.87953153% `) X7 l6 ?1 b+ M, H, p
## % D4 S- P7 k& S9 N9 F( Y/ I## 5 B" S: x9 l" b( L1 M5 U2 A; s## $bootMethod! M1 F" R- h, j8 w
## [1] "normal"( T. z, m0 T+ x R! O& k
## / ~. P( Y# J* u/ }" M2 F! M5 w
## $predict.time 5 F: ?" M0 l. C## [1] 2000" ]( ^7 R$ J4 C3 K/ G8 V
## 4 @: U5 r q7 E4 u* o/ h3 j, Q6 ^6 L
## $alpha* e1 n1 {( i1 x7 O- e
## [1] 0.05 ; O- K" F- b/ z$ Q4 m- j## $ Q, @; [) Q" f! a
## attr(,"class") . r0 L' v3 j- w$ [, m8 K( S## [1] "survNRI"# e. t/ F& w0 Z2 ~