- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565164 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174772
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
* 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
|