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