- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569615 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176107
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
5 [7 s8 F9 w2 ? a5 P
净重新分类指数NRI的计算
' }4 z& i; a9 l- a) A% r5 N, I$ @“ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。. ~% ?1 s; G* F# v2 y% _
NRI,net reclassification index,净重新分类指数,是用来比较模型准确度的,这个概念有点难理解,但是非常重要,在临床研究中非常常见,是评价模型的一大利器!* T6 m6 R" {( A: k$ a P! H; J
' L( ^, u6 W( L# b q
在R语言中有很多包可以计算NRI,但是能同时计算logistic回归和cox回归的只有nricens包,PredictABEL可以计算logistic模型的净重分类指数,survNRI可以计算cox模型的净重分类指数。
$ \$ }2 M4 ~8 L. h" N
% `; i/ L2 Y% r$ C2 ulogistic的NRI
5 \. d d- I A- k4 W4 Q2 f: I" ?, m+ `nricens包
5 u4 u' b2 f. F2 |PredictABEL包: Z! h, [( |6 F) n9 n# N& d* ?
生存分析的NRI
( m, a! V9 D* C& y0 B8 H) w& Bnricens包$ p' C8 [8 ?" t! S1 T: V3 Y9 E
survNRI包4 K( S7 Z9 a* E! M1 b
logistic的NRI
" J% q7 S1 h3 ^- b8 F8 U# f/ {nricens包5 S- t& O- X) \- K$ Z$ x3 w' r
#install.packages("nricens") # 安装R包
- u$ x0 j6 y: mlibrary(nricens)
' z, S8 m! G; o, s' n13 z. j3 |, q, Z, N
## Loading required package: survival. ~- S' s# {6 d0 J9 x+ ^8 j
1* O6 i4 ~4 R. z
使用survival包中的pbc数据集用于演示,这是一份关于原发性硬化性胆管炎的数据,其实是一份用于生存分析的数据,是有时间变量的,但是这里我们用于演示logistic回归,只要不使用time这一列就可以了。; m% w% C0 r9 [3 p* b
9 D& j9 s; n9 |: i! W8 p" r: I; [library(survival)2 X$ t4 R# ~/ R& ~- d
; Y' |% A1 A' p1 V
# 只使用部分数据' t: A; ~3 V* k0 E! s# a N' ~
dat = pbc[1:312,]
! v* y( ?/ ^2 k3 C8 v& G* Z( ~, |dat = dat[ dat$time > 2000 | (dat$time < 2000 & dat$status == 2), ]( u1 S# q: \8 }! T4 t7 s) z
9 |+ @3 o* R, E' E+ q- l
str(dat) # 数据长这样
% l3 p6 b; U, u" a0 t9 @16 ~" G v! O) l. x0 ]$ I8 l
## 'data.frame': 232 obs. of 20 variables:: i% J3 A* p( e' _
## $ id : int 1 2 3 4 6 8 9 10 11 12 ...! J& A* a; a7 A0 Y& n
## $ time : int 400 4500 1012 1925 2503 2466 2400 51 3762 304 ...
( g0 P+ S9 S9 m% I## $ status : int 2 0 2 2 2 2 2 2 2 2 ...
$ e) C2 v% D) X( V## $ trt : int 1 1 1 1 2 2 1 2 2 2 ...
# N! [. D) e9 a( U$ T## $ age : num 58.8 56.4 70.1 54.7 66.3 ...3 T, |6 \, U$ w& K( w9 C5 v! |
## $ sex : Factor w/ 2 levels "m","f": 2 2 1 2 2 2 2 2 2 2 ... J0 k4 L" w, g6 W* R$ C5 Z( X
## $ ascites : int 1 0 0 0 0 0 0 1 0 0 ...
8 a2 p' @3 _3 S% r3 @* o8 z& V## $ hepato : int 1 1 0 1 1 0 0 0 1 0 ...- a! j) G2 Y0 G
## $ spiders : int 1 1 0 1 0 0 1 1 1 1 ...
0 l$ @* l" |+ H: S0 r## $ edema : num 1 0 0.5 0.5 0 0 0 1 0 0 ...
7 a! O$ E }# }' e/ c0 w4 v( T## $ bili : num 14.5 1.1 1.4 1.8 0.8 0.3 3.2 12.6 1.4 3.6 ...- ]3 s/ C& e5 o
## $ chol : int 261 302 176 244 248 280 562 200 259 236 ...
( D* V7 M# z0 P4 N8 L: ]## $ albumin : num 2.6 4.14 3.48 2.54 3.98 4 3.08 2.74 4.16 3.52 ...' @6 z9 T B) w' G. [% l5 r8 i
## $ copper : int 156 54 210 64 50 52 79 140 46 94 ...
. @: G. G0 J/ Y p/ J5 [$ ~2 x, d## $ alk.phos: num 1718 7395 516 6122 944 ...
* `: Y* r5 Q0 i2 N/ q+ S0 m## $ ast : num 137.9 113.5 96.1 60.6 93 ...
" x' g) U3 N5 u( v5 D## $ trig : int 172 88 55 92 63 189 88 143 79 95 ...
5 E0 p9 `; {8 u- Y/ h/ s- _6 V## $ platelet: int 190 221 151 183 NA 373 251 302 258 71 ...# n5 M* M+ |1 s( @+ q
## $ protime : num 12.2 10.6 12 10.3 11 11 11 11.5 12 13.6 ...
6 _) r4 J3 z) r" C6 p. S$ n' ^. W## $ stage : int 4 3 4 4 3 3 2 4 4 4 ...
: S( E; o/ A# X7 a- ?* r' w
4 o: D t8 S& G8 X3 ]8 r O8 L: p1
1 I+ J5 o9 u0 d2 }dim(dat) # 232 20& p3 n# J* h( A$ ]( I4 L
1
: m1 u$ i0 T" t& T) S) p e" E, @## [1] 232 20
1 g) a" q! y0 z. b8 n1( j8 B- Y- {' V* ^
然后就是准备计算NRI所需要的各个参数。
- E( o5 J: I- a5 @8 T, h0 G/ m% h+ n& r: T: t" e
# 定义结局事件,0是存活,1是死亡
' Z" \/ [) F; C0 b3 [0 D2 Sevent = ifelse(dat$time < 2000 & dat$status == 2, 1, 0)
! ~( [" }2 N' \
' ^. H& V$ Z" n9 v& f, |# 两个只由预测变量组成的矩阵
5 n8 ^7 v4 I: Q" c, r; `z.std = as.matrix(subset(dat, select = c(age, bili, albumin)))
, @) B0 L9 W: zz.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))7 t2 w- {5 V3 {1 V
) z$ C( o; x6 {" Z
# 建立2个模型
7 \- t. ^. J" O& m; v, u1 zmstd = glm(event ~ age + bili + albumin, family = binomial(), data = dat, x=TRUE)
_+ v, \# b5 E! `mnew = glm(event ~ age + bili + albumin + protime, family = binomial(), data = dat, x=TRUE); ~6 {- k. t: G! W
0 w) t# H y, V4 a# 取出模型预测概率
2 Y9 D, \# w& ap.std = mstd$fitted.values
3 U' ~. W0 K. z) |# @8 {( v9 zp.new = mnew$fitted.values1 a4 i1 A3 O. F3 |9 }' S- Z }
3 Q7 {# B; T5 u# O, V7 J- f1
# X) X" u5 X/ ~, {# p9 s) }然后就是计算NRI,对于二分类变量,使用nribin()函数,这个函数提供了3种参数使用组合,任选一种都可以计算出来(结果一样),以下3组参数任选1组即可。 mdl.std, mdl.new 或者 event, z.std, z.new 或者 event, p.std, p.new。
, s* p* x/ c- D2 ^% j/ u4 g* S7 D
# 这3种方法算出来都是一样的结果4 q, x2 t- w x7 _9 e2 O( O
" s" A4 q$ m0 i( k4 i
# 两个模型
: @ ?- L' K6 U# g" `nribin(mdl.std = mstd, mdl.new = mnew, 0 d- Y0 z9 @* K5 T' |- s" N* d
cut = c(0.3,0.7),
; n# L: i V& p) p niter = 500, " F1 y$ _! z9 b( h% i
updown = 'category')
: I$ i* B, \8 F% w' O. C0 c
\) p1 W' u0 B. }2 Q: i/ @& T8 e# 结果变量 + 两个只有预测变量的矩阵4 R8 a' v) N7 n" D8 {* L& w+ ~
nribin(event = event, z.std = z.std, z.new = z.new, % g" ]% {3 O0 L( L9 T5 K! H' V
cut = c(0.3,0.7), $ N8 ]5 z& `* W& x* c( F5 H5 W
niter = 500, ) s7 Y, p0 ]8 F8 v" N3 D; `
updown = 'category')
- D' g0 [* Q. V0 \" A- Y, {8 g. a8 }5 Y( m* C p0 B/ h( C5 K
## 结果变量 + 两个模型得到的预测概率
% M& Z4 J8 D6 J# a) x7 }nribin(event = event, p.std = p.std, p.new = p.new, ) f6 E- f5 ~$ u o. ]' o7 g- r
cut = c(0.3,0.7), $ E' i# ?. }1 j1 Z+ S. I. l' W
niter = 500,
1 y* r- z. J4 |& e2 h: S$ z updown = 'category')
7 j/ X+ g3 e7 s, K: j: S% b$ _7 ^6 l+ g( {: L0 R$ i% f
1+ F X3 f. L! |4 G( V& x5 G
其中,cut是判断风险高低的阈值,我们使用了0.3,0.7,代表0-0.3是低风险,0.3-0.7是中风险,0.7-1是高风险,这个阈值是自己设置的,大家根据经验或者文献设置即可。
3 r7 n2 G' Y0 d& G7 N. T+ Y( z9 A; h* ]
niter是使用bootstrap法进行重抽样的次数,默认是1000,大家可以自己设置。
6 ^: r: r( y5 B+ u8 P# H
/ e" }) P* u! F* ?7 }" }" Pupdown参数,当设置为category时,表示低、中、高风险这种方式;当设置为diff时,此时cut的取值只能设置1个,比如设置0.2,即表示当新模型预测的风险和旧模型相差20%时,认为是重新分类。% \$ c- V$ s$ H" c: z' S, M1 V
0 O7 V8 T! Y2 t* Z8 \+ h上面的代码运行后结果是这样的:! H- [: T* a. Y. }( e
2 t! | r( `2 e ]1 |. WUP and DOWN calculation:
, S) l1 j ?5 [# p% _ #of total, case, and control subjects at t0: 232 88 1446 W4 b" \% I {# c% T$ L
5 ~( y. T6 ?, U( Y& m# a2 y8 s
Reclassification Table for all subjects:' k) j6 r) }. \$ h
New
) a6 n4 ?" C lStandard < 0.3 < 0.7 >= 0.7
3 e% w q& A9 `; n < 0.3 135 4 00 D) X1 R: a4 L* C$ e6 ]6 n; E. D
< 0.7 1 31 4
7 m0 M n4 i; u! C9 ?$ c# y$ g2 w2 W >= 0.7 0 2 55& b% @0 r1 Z2 E- n- o( l) W, v& g
! ~, | x0 ?7 R
Reclassification Table for case:; o) i; ]/ b: {( P
New" W2 m5 U5 O. z* x+ w
Standard < 0.3 < 0.7 >= 0.7
, r$ [- z8 q9 {4 |3 ]# _! C < 0.3 14 0 0; v3 l' ^* f. `. t7 ~8 |' k
< 0.7 0 18 36 F. r) m+ z8 \) e8 Y: _
>= 0.7 0 1 52
; {0 Z' s' z# X4 Q6 H3 X" s+ ~9 R: l6 N. L" m2 m
Reclassification Table for control:# o% @$ f! D2 s% ~9 L' T! _/ [
New' N; ?0 P5 \3 w
Standard < 0.3 < 0.7 >= 0.7! W* t) s* \7 w3 }# i$ h# `' ]6 |
< 0.3 121 4 0) M7 x A! T5 z6 d3 ?$ T) c
< 0.7 1 13 1
) O( f: D$ Q# c; N' O( r& k >= 0.7 0 1 3# w$ \& F6 D8 Y; ~1 ^' S
! p2 Z" }# L$ W- I1 ?3 b5 Q
NRI estimation:$ }; l1 \* k1 O) S
Point estimates:7 P: r# ~- f4 \3 w% P
Estimate! x( x* v& ?( K: h6 e
NRI 0.001893939
2 {: j8 n6 ~. H$ cNRI+ 0.022727273
3 C A. T, {% lNRI- -0.020833333
; B O5 W& m# C) g0 x0 X; {Pr(Up|Case) 0.034090909
; i/ X- @' P: \+ {* @' KPr(Down|Case) 0.011363636
: n+ K4 C7 y* K1 rPr(Down|Ctrl) 0.013888889- S6 L" T( v8 W, u( J
Pr(Up|Ctrl) 0.034722222
% v% }+ }2 q2 D
. i- N, u5 C3 n- `7 C& V; n+ kNow in bootstrap..
0 E9 T' K6 J8 U" J7 T& ~/ I- D
1 u; b4 k1 D v' a+ JPoint & Interval estimates:3 M3 E3 q: _ Z( k( l) u
Estimate Std.Error Lower Upper7 d0 r, j" L) J: D! a% d7 y
NRI 0.001893939 0.027816095 -0.053995513 0.055354449& T. l6 b; v; z
NRI+ 0.022727273 0.021564394 -0.019801980 0.065789474' K0 P% H5 V$ q% G
NRI- -0.020833333 0.017312438 -0.058823529 0.007518797, ?% u+ f8 U3 C" }# o% ^. |
Pr(Up|Case) 0.034090909 0.019007629 0.000000000 0.072164948
( B9 q" W% m3 Y/ l+ QPr(Down|Case) 0.011363636 0.010924271 0.000000000 0.039603960! S' Q# Q( @, J
Pr(Down|Ctrl) 0.013888889 0.009334685 0.000000000 0.035211268
- s4 {7 h8 z; \6 qPr(Up|Ctrl) 0.034722222 0.014716046 0.006993007 0.066176471% n& x1 X' J9 K& ~4 ], T
: y; w: X4 l" B- t* g7 k7 ?8 p* r {
1
* P1 E# @; D X b& b首先是3个混淆矩阵,第一个是全体的,第2个是case(结局为1)组的,第3个是control(结局为2)组的,有了这3个矩阵,我们可以自己计算净重分类指数。
7 a% j& g7 b" S/ S \& \+ i
( l8 Z0 ~3 ^/ Y1 e% Q看case组:3 w6 v& ~ i) z( X. P
' ?7 ^5 ]5 F4 Z( v, L9 u; C& @净重分类指数 = ((0+3)-(0+1)) / 88 ≈ 0.022727273
& J: T0 a" _, G
, [$ r: w" E" E" Y0 R2 g h再看control组:
4 O: m7 `' \9 g B6 P! P% p5 N, F
( `% V+ @: Y- S# B净重分类指数 = ((1+1)-(4+1)) / 144 ≈ -0.020833333! \' }) R* a/ {& O6 m; `) \
& r2 h$ L8 k' f
相加净重分类指数 = case组净重分类指数 + control组净重分类指数 = 2/88 - 3/144 ≈ 0.000315657
4 J! h* X$ [- x% C4 d* E4 d
3 G; P- B/ I3 U( R0 b/ C+ E# ?再往下是不做bootstrap时得到的估计值,其中NRI就是绝对净重分类指数,NRI+是case组的净重分类指数,NRI-是control组的净重分类指数(和我们计算的一样哦),最后是做了500次bootstrap后得到的估计值,并且有标准误和可信区间。4 _2 s% `: Q- U4 s
% {7 W$ d; y/ F
最后还会得到一张图:: l! u1 O+ b0 T. O# s+ j& |
$ J2 T7 J5 L2 Z7 z h这张图中的虚线对应的坐标,就是我们在cut中设置的阈值,这张图对应的是上面结果中的第一个混淆矩阵,反应的是总体的情况,case是结果为1的组,也就是发生结局的组,control是结果为0的组,也就是未发生结局的组。3 y6 I; l0 C2 D
) @5 S6 ~) {) S( k, W, Q
P值没有直接给出,但是可以自己计算。
' t# H* d* M- ^" \* o" A! }; z
$ e$ f' ]) m2 {# 计算P值) C) X' `+ O1 W X2 n9 a! N
z <- abs(0.001893939/0.027816095)
' Z% C$ B' E' F2 E9 U) i" Np <- (1 - pnorm(z))*2: w/ q3 }0 Y& t( V) n* j
p$ Q6 I% q1 Z j5 F! Z9 m9 @! k
1
0 q1 t7 [* `3 ~+ r9 s0 g# G) H## [1] 0.9457157+ _3 G7 z8 _, V4 d9 w0 W
1; S3 O# h. G7 H( U' g, W' I
PredictABEL包
/ P8 W( {9 S* a8 P, ~8 a+ _& I#install.packages("PredictABEL") #安装R包( V5 l2 u& u9 u! R1 _
library(PredictABEL) 8 e6 l c! t+ G$ O3 j
( ^( d& w1 }. K1 A. a# 取出模型预测概率,这个包只能用预测概率计算
" f6 t, q# ]! J6 }/ @! A2 Ap.std = mstd$fitted.values' N% Q) F( |6 f! I
p.new = mnew$fitted.values
]9 x" L* ]4 [, y5 a0 f1
/ ?" J# ^1 \5 _然后就是计算NRI:$ M, ?2 @+ f/ l" m2 q+ ?
* d- ?0 S- w5 \8 y* Bdat$event <- event: Z, w; L* b H7 q9 @% l
$ d. T- T/ ?0 X/ Y- P5 M' n8 j# Z
reclassification(data = dat,, J7 N5 m: k$ ?' N
cOutcome = 21, # 结果变量在哪一列5 O2 a" V4 ~% C1 r! q# e! T u
predrisk1 = p.std,
3 a1 b/ r$ F9 V# p3 S% n& P. ^ predrisk2 = p.new,
; |6 w/ r) z3 y cutoff = c(0,0.3,0.7,1)
% O6 a, E# x- X0 L, E8 l- `% x )) n7 L3 J8 U0 E* {: S( R* o
1
/ L" K: I/ @- l& P' m## _________________________________________* ^& _! `3 t9 T( L/ _5 ]
## % C3 r$ M& g9 S7 G( p" J+ a$ t
## Reclassification table
7 l) I& h! u' I) |1 c$ E1 {## _________________________________________6 w4 R/ C" n2 N) x) x
##
7 P1 |9 |. D" i( J## Outcome: absent
/ p V9 |& w3 [( R2 ?## 9 d9 W0 F8 y1 l' n: X1 x3 M3 M
## Updated Model; h! q- s6 H3 {! \7 y! D/ O
## Initial Model [0,0.3) [0.3,0.7) [0.7,1] % reclassified0 U+ ]# {: j" t3 `: l: ?) U* j3 C3 r
## [0,0.3) 121 4 0 3( a! T* M5 Z* c1 g7 I& g
## [0.3,0.7) 1 13 1 13" I2 ^7 G3 `/ \" Q2 t3 y) a
## [0.7,1] 0 1 3 25( {- [0 M5 D, A, |3 t. `( h
## , a' x$ ?; m; R% P
##
\6 l1 B+ Y5 d## Outcome: present
; u! n9 L# m) C; c$ M# _4 e v## - q, J/ K1 {* @/ C" m) G' D( v
## Updated Model
3 o. [/ d: p% [9 T' x. o## Initial Model [0,0.3) [0.3,0.7) [0.7,1] % reclassified
3 K& c: L& ~1 U5 Z2 f## [0,0.3) 14 0 0 0
& W2 ~3 L1 ^8 x1 K: b; ?# f' N## [0.3,0.7) 0 18 3 14! N6 Z/ g' {7 x! T
## [0.7,1] 0 1 52 2! L" `3 E4 }: Y+ V7 u' b' {
## ! o* O% D' L: ?% I$ E1 v; J
##
k X$ w; z3 t2 W## Combined Data X* g- }9 O: P! d! s9 B" Z
##
8 d6 m+ k, Y' Z; {## Updated Model& G; R6 o' b; e# S0 H: Y
## Initial Model [0,0.3) [0.3,0.7) [0.7,1] % reclassified
7 I- y! ] M. h## [0,0.3) 135 4 0 3' e. d, O# y4 ^+ G" a
## [0.3,0.7) 1 31 4 14
8 A# F2 a I$ y$ V" v## [0.7,1] 0 2 55 4
. b9 I, V! x4 r6 s5 c## _________________________________________9 e( c! }- Z- u' x
##
2 }8 ]# s8 a; X0 e4 a; q7 ] ?## NRI(Categorical) [95% CI]: 0.0019 [ -0.0551 - 0.0589 ] ; p-value: 0.94806
( H; b; j+ O; I; l# g/ j; n## NRI(Continuous) [95% CI]: 0.0391 [ -0.2238 - 0.3021 ] ; p-value: 0.77048 / N# E0 z; s6 C' i) y
## IDI [95% CI]: 0.0044 [ -0.0037 - 0.0126 ] ; p-value: 0.28396, [) S& P+ v" Q% C3 G. \
; L' M- {, k% |1
5 a: D0 w9 @, @' R" @9 _1 Z结果得到的是相加净重分类指数,还给出了IDI和P值。两个包算是各有优劣吧,大家可以自由选择。
3 T1 M& Q; g5 a Z; X( w2 E. v) g% Z6 Y# F9 \* L7 e E6 I+ H. l% `% ]
生存分析的NRI
; f5 d2 P1 u3 K! R0 J" d$ |! D还是使用survival包中的pbc数据集用于演示,这次要构建cox回归模型,因此我们要使用time这一列了。
& A0 |3 X) c, Y; H1 a. P8 o3 k$ |& w" y2 x0 ]
nricens包0 y0 v' i- R Z* \, Q0 a. v
library(nricens)* N6 {- o) o# j0 ]" U' i. ^
library(survival)
1 K; ] y$ T* F; X ~$ o7 H% c
% w. }# J+ g. D' G9 U% Sdat <- pbc[1:312,]( [, X4 Q3 o8 o* ~2 y2 o
dat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡% E* w* h: }8 m7 Y Q
1
4 y9 Y! w" w1 d! |然后准备所需参数:( x: b0 h# q( V) t: Z5 J
/ Z2 N& i" R# i; ^# 两个只由预测变量组成的矩阵
# n) |1 o4 A/ F4 v- W4 U" J, t9 `* r, Pz.std = as.matrix(subset(dat, select = c(age, bili, albumin)))
( W9 u6 M2 g5 R3 D" k! Fz.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))) l1 `% g6 j( d* d9 l6 V
/ m0 i$ x8 E, d& ~
# 建立2个cox模型. o. t" Y4 S+ b0 j8 O2 a
mstd <- coxph(Surv(time,status) ~ age + bili + albumin, data = dat, x=TRUE)
/ d5 j$ o7 d# f2 K' B5 Smnew <- coxph(Surv(time,status) ~ age + bili + albumin + protime, data = dat, x=TRUE)
7 @) Z, g( e1 ^* i0 k& {5 K( F! t
1 J; @7 m" q7 z: i f s( q# 计算在2000天的模型预测概率,这一步不要也行,看你使用哪些参数
V% G7 Q8 X x- s5 `p.std <- get.risk.coxph(mstd, t0=2000): v9 l! R5 K, c
p.new <- get.risk.coxph(mnew, t0=2000)
+ A! f0 ?1 O- B1
2 B5 {' X% _3 k6 g5 s) b计算NRI:
4 f1 \( ^# J6 Q9 F, ^0 X. I8 y# j) g. R/ [4 F
nricens(mdl.std= mstd, mdl.new = mnew, ) P' R. b0 x& N8 M5 m
t0 = 2000, , r' `6 O9 U' E: C& |
cut = c(0.3, 0.7),- D' l6 x; l1 @6 @
niter = 1000,
$ A3 P' E4 b- y5 \( N6 N updown = 'category')
* Z' d1 F" s- Y% V- J& [
8 q. t+ M. p4 ZUP and DOWN calculation:7 o+ | t) t! W, r, L
#of total, case, and control subjects at t0: 312 88 144, l" e) `: n( v _* y
& y4 S! h- g8 R* w' I
Reclassification Table for all subjects:9 m; m% ]3 J1 o& c7 u! a
New1 z3 `, ^4 T. V; C! T" `7 ?
Standard < 0.3 < 0.7 >= 0.7% k. s$ K; M) ]) V& k5 y
< 0.3 202 7 0
, D) q2 y3 n5 ~ < 0.7 13 53 60 ?) E1 ~" X! ~3 {
>= 0.7 0 0 31
6 S+ Y0 L: R, N+ E
3 q4 X4 T1 J, y4 J Reclassification Table for case:0 q. \3 I1 w8 O8 h4 i, k' H3 h
New
; t% m! |! w. SStandard < 0.3 < 0.7 >= 0.75 r4 k) K& V4 a0 N! \; q& \6 ^: @
< 0.3 19 3 0" M4 o- p' D' J) Q& N
< 0.7 3 32 4+ I4 _7 b3 U- J' Y6 q( e5 r
>= 0.7 0 0 27
) s3 l3 u$ J/ V9 v$ Y4 z* o; n! F- i* r
Reclassification Table for control:' g' M6 R2 X! m. S
New1 U: x7 c) A) V
Standard < 0.3 < 0.7 >= 0.7% r: j' t' V) R- b6 A4 |3 v! |
< 0.3 126 3 0
7 k1 E+ L/ o6 |: w- G < 0.7 5 7 2
$ f p9 s7 m0 J7 f, e8 P >= 0.7 0 0 1
- Y" z S0 o" M
! L9 t& f* W w f( m, v6 ZNRI estimation by KM estimator:4 C1 V; L; _0 C8 p) I1 G
7 Y) X( r- n2 E3 }# lPoint estimates:
* R8 h$ p3 B8 } Estimate0 H6 k/ n4 X! n7 F! @0 B. R- A
NRI 0.05377635" A9 n2 z, |5 c: ?9 [6 a' |! ^: @, S
NRI+ 0.037486601 K! ]/ V+ `9 M$ T
NRI- 0.01628974( y k4 |2 i0 x
Pr(Up|Case) 0.07708938
9 N0 f, o3 T3 [* m9 YPr(Down|Case) 0.03960278 _% b( `$ a* C3 d6 B
Pr(Down|Ctrl) 0.04256352+ P4 x9 H7 P* |6 m! J$ _. H
Pr(Up|Ctrl) 0.02627378
9 ^, J8 ]! c6 J A s: k, q' m* k/ b, W H9 @
Now in bootstrap..
3 Z/ F5 g. Y3 B% E/ X5 `
# Q$ c2 M9 q. h& }. R; YPoint & Interval estimates:9 }7 z# w ]/ ]1 r) ?, ~+ z
Estimate Lower Upper5 Z" I5 {+ d5 h, n- w1 D/ m+ K
NRI 0.05377635 -0.082230381 0.16058172
! v4 J8 j/ N6 a% O' G9 c/ u. cNRI+ 0.03748660 -0.084245197 0.132317763 J- Z/ U7 C6 G' G* [- K* N3 }; ~
NRI- 0.01628974 -0.030861213 0.06753616- y, a Z1 V6 p$ l3 I( s; V
Pr(Up|Case) 0.07708938 0.000000000 0.19102291 K6 |; K1 g" @ ]+ [
Pr(Down|Case) 0.03960278 0.000000000 0.15236016# y# s, U0 I6 t) }. o* K; o
Pr(Down|Ctrl) 0.04256352 0.004671535 0.09863170
* t' k) F1 |6 h1 j% P) D: G2 UPr(Up|Ctrl) 0.02627378 0.006400463 0.05998424
$ J# ^7 k V- m, ?9 _! q( Z5 \
( N! a" L7 B" {, t$ a1
. m3 L' f& c J2 J- `
& Z! v* E: F' h2 @/ @Snipaste_2022-05-20_21-49-38* L5 W/ |7 M! ~5 B* q5 B
结果的解读和logistic的一模一样。
4 m9 [: z/ Z. y% ~7 C
8 t5 s' J# x7 tsurvNRI包; O/ x' J/ g% X! q6 f" o7 v$ p U, R
# 安装R包
1 q1 h3 ~' h# v8 i9 d1 h# Sdevtools::install_github("mdbrown/survNRI")% T4 F" C; k1 B: x/ y! z1 V' D' ?6 ~
1& ^' t4 @$ }2 W8 ~# z. z4 y+ j! E
加载R包并使用,还是用上面的pbc数据集。
7 U& E6 A- L# Z" U$ x1 ~' G' }4 P' T
library(survNRI)! I' n( M( z+ {7 x" H
1- y4 e4 S' z2 I6 j8 X. m
## Loading required package: MASS6 P' i# R, Q2 y8 U) I; ^! ?
15 J2 [8 {% o# Y, ^
library(survival)
3 X( L, b ~3 S8 T2 p" c, ] Z1 u& X* L
# 使用部分数据. ~3 Q4 j. H. _/ c
dat <- pbc[1:312,]
* r$ u- F0 _& e- {' O$ `4 gdat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡, a, D/ ^3 g# O* L
6 r) q$ ~" ?8 S% V; p
res <- survNRI(time = "time", event = "status", k! _, y7 s7 D. q% D4 _& c8 p) M
model1 = c("age", "bili", "albumin"), # 模型1的自变量/ |" {8 a A: G9 ^
model2 = c("age", "bili", "albumin", "protime"), # 模型2的自变量
5 B6 Z E) ]. J: O& B data = dat,
- s! x% z- |3 Y7 M& `# G% | predict.time = 2000, # 预测的时间点) k6 q) F- p; H
method = "all",
7 p0 ^5 x4 m! N! K0 n- P bootMethod = "normal",
0 _# a( Z3 o2 |* F- n6 Q bootstraps = 500,
1 x5 v( o9 v5 p |$ w: M alpha = .05)) r( ? x, T- ]( y3 ^
9 ?" m; W8 E( N& A8 \
1
$ L3 ~6 k7 q9 y: z9 `! ~( b查看结果,$estimates给出了不同组的NRI以及总的NRI,包括了使用不同方法(KM/IPW/SmoothIPW/SEM/Combined)得到的结果;$CI给出了可信区间。- X+ v1 I* b3 m: T$ e! d
$ k9 I7 |8 \; e& t
res" `7 _( W( r( ?5 C; P
1
9 L1 A4 N- Q$ W s! `## $estimates* r7 w% `) p$ @% i; ~2 J% \
## NRI.event NRI.nonevent NRI
8 E+ V& p0 c% i' F' J- X% [" @## KM 0.20445422 0.3187408 0.52319516 Y0 j. U; H! l( `
## IPW 0.22424434 0.3273544 0.5515987- P! X- ~! e1 l& ]
## SmoothIPW 0.19645006 0.3144263 0.5108763* Q: t9 z8 Z$ {! u( l
## SEM 0.07478611 0.2632127 0.3379988
' W$ y6 }. Z- p## Combined 0.19633867 0.3143794 0.51071813 K: z" G( Y @: V7 Z( k
## : Y5 `# n' h4 m# O% |& \! B7 V. `
## $CI: G, i B- ]* P! E% E
## $CI$NRI.event- z( k3 f1 M% b7 S- a) R
## KM IPW SmoothIPW SEM Combined
/ W, g: j, r4 B- `7 `## lowerbound -0.03915924 -0.02185068 -0.04724202 -0.1162587 -0.04737236 q5 o/ }% x& U
## upperbound 0.44806768 0.47033936 0.44014214 0.2658309 0.4400496
1 Z; n& w# ^. [##
# U' h1 r g6 M7 {4 \## $CI$NRI.nonevent2 A3 a% K# h( I. d6 C2 }
## KM IPW SmoothIPW SEM Combined6 n6 ^6 y9 C! s, {
## lowerbound 0.1317108 0.1396315 0.1286685 0.08638933 0.12864269 x3 p; \; D' M( Z8 C
## upperbound 0.7102251 0.7393216 0.6966341 0.51482212 0.6964549
7 e3 x) g# t7 H3 I. [: O' c0 I. b## % |1 v8 s; [9 G$ ]& @! w+ E5 {$ t
## $CI$NRI
w1 V: |7 t ]4 G0 B/ d## KM IPW SmoothIPW SEM Combined
4 K% m. H7 i2 ], l n6 H6 N## lowerbound -0.05112533 -0.04569046 -0.05439863 -0.04132364 -0.05443409$ X2 ^9 P: i2 s5 {3 b9 u2 L) o
## upperbound 0.89306122 0.92464359 0.87970125 0.64253510 0.87953153+ d v2 P9 r+ _1 W( @2 e4 z
## # `5 N( z1 e! `! ?% n3 |( D' [" }0 [
## . N7 `" e4 k3 ], b1 f/ Q8 v; w6 f$ J! H3 z
## $bootMethod; t" |0 F) e* T% U( Z
## [1] "normal"* \4 r) m4 |" M! J$ M5 L! K' Y8 Y
##
4 R# \. G5 P: }* H0 J## $predict.time0 }2 U1 Y7 F3 G# J0 D
## [1] 2000: [2 C% P2 f$ E9 X
##
% O2 ^4 { b8 v( c$ ]/ {1 P## $alpha" l5 Q8 U) n' b ]7 |. b
## [1] 0.05
$ s# K! }1 f0 O) y# o! E##
# R9 O1 i7 d v) ] H9 t1 q7 h+ g% D## attr(,"class")0 c, ?6 z5 X+ A# z) A0 S
## [1] "survNRI"
9 y! v+ w8 p0 S+ w
2 P" E) J* z( s, N* V) i. J* C1
% y8 |2 J1 ~$ G+ M: w$ B# TOK,这就是NRI的计算,除此之外,随机森林、决策树、lasso回归、SVM等,这些模型,都是可以计算的NRI的,后面会继续介绍。大家如果有问题欢迎在评论区留言。 L4 L4 j! D; S/ z2 @9 A
4 q3 G: b; z0 @: g B: D# b本文首发于公众号:医学和生信笔记
. G# [6 |# p$ }( {* n# d2 U+ B; K, m: k& H$ l% R' v
“ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。, O8 v7 C- b) b I* t1 J# N$ t' X
本文由 mdnice 多平台发布
( H; L+ \7 L% T9 s8 @9 D8 Y, N1 R————————————————8 _0 i) g: }, U% s4 r2 K
版权声明:本文为CSDN博主「阿越就是我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 X$ {5 h8 X0 ^# a
原文链接:https://blog.csdn.net/Ayue0616/article/details/126768006# ]% ?9 |. q& B8 O- g! `: v1 @6 P
R2 b" k. A" L/ B
7 N) z3 r* Q( A% [) w; L
|
zan
|