- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 559565 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173242
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
" B' N& D2 O3 x `. p& h净重新分类指数NRI的计算5 Y2 @7 F$ W* [2 g, ~6 m4 k
“ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。
- D2 Z* ^; N7 K5 z- V* v& _ c+ W+ cNRI,net reclassification index,净重新分类指数,是用来比较模型准确度的,这个概念有点难理解,但是非常重要,在临床研究中非常常见,是评价模型的一大利器!
m$ z* h* O0 x6 d; i1 W
) |3 Z0 V7 N' W1 n0 M在R语言中有很多包可以计算NRI,但是能同时计算logistic回归和cox回归的只有nricens包,PredictABEL可以计算logistic模型的净重分类指数,survNRI可以计算cox模型的净重分类指数。
, g' q- v5 { w5 G7 X, P/ c- E
$ {+ X: x; c/ a2 N- L" vlogistic的NRI: s8 l8 H- f x5 ~/ d; R) T6 L0 h+ E0 C
nricens包3 p9 ?6 C1 @ e" m" `* P
PredictABEL包1 Z; A8 d. h* c% `
生存分析的NRI
8 s. W$ M& h2 p# y* h& z: dnricens包
( c% [$ a- x2 Z4 }/ MsurvNRI包! ?% J& L, [! L. f
logistic的NRI; h6 [2 W3 p7 C
nricens包
9 I/ ~. m4 N1 ]$ L$ H5 U#install.packages("nricens") # 安装R包: o+ W$ w' I- i5 l) Q
library(nricens)
& ?7 Q7 M. e N `1* f2 |$ n+ `. \
## Loading required package: survival3 V# y' t; j$ `' R1 p" a0 M
11 x2 G. H% Q: Q9 ~. |5 `
使用survival包中的pbc数据集用于演示,这是一份关于原发性硬化性胆管炎的数据,其实是一份用于生存分析的数据,是有时间变量的,但是这里我们用于演示logistic回归,只要不使用time这一列就可以了。2 S5 L0 k% q& m: A) z
5 P+ a% p* ]! d" T- j% L; k/ Mlibrary(survival) a" f. Z+ E" \7 Z1 }3 q- D) e
. B. P) A+ G- z2 c# 只使用部分数据5 C$ \4 s! d. q
dat = pbc[1:312,] 3 ^& [4 P- F7 V/ ^* k
dat = dat[ dat$time > 2000 | (dat$time < 2000 & dat$status == 2), ]+ @( O1 v6 v! \: F7 l( ^9 a
4 S0 R7 _5 r3 } w. g7 Ostr(dat) # 数据长这样" e7 q( [' x% q5 \7 R7 j
16 B& J2 W! u# R! v2 F, h) b
## 'data.frame': 232 obs. of 20 variables:# w0 Z# _& E7 u- s
## $ id : int 1 2 3 4 6 8 9 10 11 12 ...* H7 A3 [; ?- N% {. @5 b
## $ time : int 400 4500 1012 1925 2503 2466 2400 51 3762 304 ...( U `$ t8 n% h4 ?3 V: l3 v1 S
## $ status : int 2 0 2 2 2 2 2 2 2 2 ...
1 F+ J# f, ~" L9 D8 y## $ trt : int 1 1 1 1 2 2 1 2 2 2 ...
: |4 ?. }; d/ U- ?$ M## $ age : num 58.8 56.4 70.1 54.7 66.3 ...+ N7 d8 C4 ~8 ]" J
## $ sex : Factor w/ 2 levels "m","f": 2 2 1 2 2 2 2 2 2 2 ...
- h! ]! n! X- p. R3 c% E## $ ascites : int 1 0 0 0 0 0 0 1 0 0 ...$ W! e7 }6 T5 h# Y" L
## $ hepato : int 1 1 0 1 1 0 0 0 1 0 ..., k2 M0 X8 v+ O: P% ~7 @( G
## $ spiders : int 1 1 0 1 0 0 1 1 1 1 ...+ z/ r6 c) }2 V! I4 }) U; K" v
## $ edema : num 1 0 0.5 0.5 0 0 0 1 0 0 ...! @* c: c; t2 c
## $ bili : num 14.5 1.1 1.4 1.8 0.8 0.3 3.2 12.6 1.4 3.6 ...4 l) z! Z" G1 E2 \: X( _
## $ chol : int 261 302 176 244 248 280 562 200 259 236 ...5 k4 X; X1 J$ o3 e& r b
## $ albumin : num 2.6 4.14 3.48 2.54 3.98 4 3.08 2.74 4.16 3.52 ...9 }! W e: `+ J5 C
## $ copper : int 156 54 210 64 50 52 79 140 46 94 ...
( ^, a/ B3 x! p: i## $ alk.phos: num 1718 7395 516 6122 944 ...
" p5 G9 H$ ^1 O## $ ast : num 137.9 113.5 96.1 60.6 93 ...
5 N$ n6 q. q" y1 B## $ trig : int 172 88 55 92 63 189 88 143 79 95 ...: H8 o, j5 t" Q- a, A7 y2 {' J2 c
## $ platelet: int 190 221 151 183 NA 373 251 302 258 71 ...
% T i. g0 W3 ?! Y## $ protime : num 12.2 10.6 12 10.3 11 11 11 11.5 12 13.6 ...
! I J' I% _3 D Q+ v/ @## $ stage : int 4 3 4 4 3 3 2 4 4 4 ...
! X- l( w9 i7 d8 U9 l _& V0 \! D! @* o/ ^6 v
17 u. x( {9 c4 I
dim(dat) # 232 20
, P4 P! w. e y1
1 Q9 D) a9 f; Z## [1] 232 203 ~" y6 t* O- T0 ^8 I; z4 ]- c
13 T& Y/ B$ m6 u" S7 \
然后就是准备计算NRI所需要的各个参数。5 q3 |" t4 V) ~! b
6 y7 F" P( s4 e a" X# 定义结局事件,0是存活,1是死亡
0 ]1 ^3 v9 m: l+ s v$ l: Devent = ifelse(dat$time < 2000 & dat$status == 2, 1, 0)
# @' q& G4 }$ G. r$ k" p/ a: i# P2 F: U: Z$ Q4 Z y; W2 N
# 两个只由预测变量组成的矩阵
% o& f1 e' v, Y6 c7 C2 Oz.std = as.matrix(subset(dat, select = c(age, bili, albumin)))" L4 ?) M# |' j, @: }! y3 V4 U
z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))
1 I/ S! g& Y1 U
$ Q0 K3 i( f0 ?2 D" k9 V- t: U# 建立2个模型2 A0 U0 f: ^: a$ k$ ?+ Y6 Q: s
mstd = glm(event ~ age + bili + albumin, family = binomial(), data = dat, x=TRUE)& k: g! U# z# Q# [& C, s+ m3 t
mnew = glm(event ~ age + bili + albumin + protime, family = binomial(), data = dat, x=TRUE)
2 C# e3 F4 v) r& }% }9 u8 g. G" {
# 取出模型预测概率
* U# e, W+ P1 Y8 y+ q' P: \1 Dp.std = mstd$fitted.values
6 X8 w6 A y" v* Lp.new = mnew$fitted.values
9 W; G1 j! v9 A+ K: L
) i9 u% d5 G: ?3 w1
, r% S' R# ]. @- K/ j' M! T: m( v然后就是计算NRI,对于二分类变量,使用nribin()函数,这个函数提供了3种参数使用组合,任选一种都可以计算出来(结果一样),以下3组参数任选1组即可。 mdl.std, mdl.new 或者 event, z.std, z.new 或者 event, p.std, p.new。" Q) m+ X5 U( T7 m
B4 F- {4 A- `2 k; P8 ~ K& w; l
# 这3种方法算出来都是一样的结果
9 Z% r' J# D9 Z2 Q% m3 z2 R g: F" j# [( z9 v
# 两个模型
8 t: v. r- k$ o# Ynribin(mdl.std = mstd, mdl.new = mnew,
( C' B' u2 f: `* [7 g8 B cut = c(0.3,0.7), % a* B! f8 R2 m# L
niter = 500, E, l0 n. ~* F d
updown = 'category')9 S( k7 O* N) o+ M5 |+ X) S
; D, I. m% P: s# 结果变量 + 两个只有预测变量的矩阵
$ _( l+ W2 B7 G3 u* z& S& Cnribin(event = event, z.std = z.std, z.new = z.new,
% F' v; x% Y- g$ p7 E" ]5 T cut = c(0.3,0.7),
' e; t( l. Q1 L# t ]2 s! B+ b niter = 500, + E$ A5 Q; [8 L" b4 z) r7 f
updown = 'category')
. o) J5 [+ d. }4 \% x0 T! d( W/ G. [1 H
## 结果变量 + 两个模型得到的预测概率
' C! V, C$ H" _. u' mnribin(event = event, p.std = p.std, p.new = p.new,
2 i8 V. D. t# g$ i( m cut = c(0.3,0.7), 8 f, _! x4 t8 g& L: \+ K" L
niter = 500,
- n C2 f5 P \+ B5 W updown = 'category')
; }' a3 D# c$ Z4 a
) Q2 y1 z/ u% L4 V7 s1 z1; \2 H4 y# `" \) D4 |
其中,cut是判断风险高低的阈值,我们使用了0.3,0.7,代表0-0.3是低风险,0.3-0.7是中风险,0.7-1是高风险,这个阈值是自己设置的,大家根据经验或者文献设置即可。$ k4 \4 w$ T% I+ ^7 d
) y! M& P2 G# Y; s6 `
niter是使用bootstrap法进行重抽样的次数,默认是1000,大家可以自己设置。
; R" x; V" m( I( a9 M' t$ ~6 F; W4 z' X# r. E7 L7 e! J- i6 u( B7 }$ M( f
updown参数,当设置为category时,表示低、中、高风险这种方式;当设置为diff时,此时cut的取值只能设置1个,比如设置0.2,即表示当新模型预测的风险和旧模型相差20%时,认为是重新分类。
5 R! c' k( `5 m8 r7 ^( u0 p \1 P6 X
上面的代码运行后结果是这样的:' K0 g; Z' a7 ~0 H5 |9 }
2 a1 o8 I8 s, S
UP and DOWN calculation:
% W9 [7 d# l" k& y #of total, case, and control subjects at t0: 232 88 1447 D- B/ i0 T m" [2 ~5 C
3 g v0 X8 L$ V x$ ^
Reclassification Table for all subjects:3 R7 [9 S! h4 |% c
New
$ w6 ]' o! s! H$ j$ t1 E3 FStandard < 0.3 < 0.7 >= 0.7
/ k! R5 w3 H- @) a, v < 0.3 135 4 04 P) q% |. b1 Z9 A
< 0.7 1 31 4 a6 M& j* M0 [* }
>= 0.7 0 2 55
3 r) c- O. [9 L1 C, K2 D$ W% [+ V, G' [
Reclassification Table for case:+ y& Z2 I8 L7 t
New$ M) O% m+ w, S" v
Standard < 0.3 < 0.7 >= 0.70 ?/ K5 r8 z$ |! X7 @
< 0.3 14 0 0
# X8 r* g5 |8 n0 B < 0.7 0 18 3. Z" }- {" ^& h" C
>= 0.7 0 1 52
6 \. f6 e" t3 E" U) \+ k0 t2 q& u, u9 {9 D1 Q) D
Reclassification Table for control:" i0 F1 `$ C7 K+ c
New* `/ G3 Z3 _9 d; w6 T. V, G' Y: \ R
Standard < 0.3 < 0.7 >= 0.7/ X) T! {/ Z; g- v
< 0.3 121 4 0
}* j7 Q6 s$ Q) s6 R- v4 e! P* c < 0.7 1 13 1
8 e* e6 x$ [$ u >= 0.7 0 1 3" V' M5 a7 \' N( G
9 |6 v- ]' `$ v/ YNRI estimation:
) A8 ]; Q! S I+ S" f, zPoint estimates:. B8 c8 o% s/ ?; B
Estimate
l4 a; B% K$ _6 ], ZNRI 0.0018939399 _. m {9 L6 n/ \
NRI+ 0.022727273
3 h9 \3 V# _7 J% I* d. nNRI- -0.020833333+ R5 {, z& |$ _; B" U
Pr(Up|Case) 0.034090909
) d2 p m F& w- W9 t- DPr(Down|Case) 0.011363636
: Z+ T5 W/ q5 A0 @% ^/ y% W, |Pr(Down|Ctrl) 0.013888889
1 ~9 i4 U% T5 T* z7 K3 ` TPr(Up|Ctrl) 0.0347222223 C) i! S$ X+ G$ @% F% I) U6 Q
6 ?+ O' Y" R, P: \6 J( G$ S+ t
Now in bootstrap.. f; T, G$ x L
5 s+ t! V9 \" N& aPoint & Interval estimates:2 f8 L b+ s( x$ I h0 C% Q
Estimate Std.Error Lower Upper
( C: z( O( V2 u3 k/ F- G& u6 \NRI 0.001893939 0.027816095 -0.053995513 0.055354449, r- m& ^- q! ], n7 y) h" Q
NRI+ 0.022727273 0.021564394 -0.019801980 0.065789474
0 r) { p6 Q( r5 nNRI- -0.020833333 0.017312438 -0.058823529 0.007518797
, l0 @6 E X1 k; mPr(Up|Case) 0.034090909 0.019007629 0.000000000 0.072164948
4 e; k: W4 g6 f3 p+ VPr(Down|Case) 0.011363636 0.010924271 0.000000000 0.039603960
5 f. a, s" u7 FPr(Down|Ctrl) 0.013888889 0.009334685 0.000000000 0.035211268
% _& C4 ^7 I, ~% I mPr(Up|Ctrl) 0.034722222 0.014716046 0.006993007 0.0661764711 ? t5 Q0 R8 j5 T$ q/ a5 q
$ S7 X( b, y) ]& }) a$ G5 i1. P$ ?2 l' x5 l6 E
首先是3个混淆矩阵,第一个是全体的,第2个是case(结局为1)组的,第3个是control(结局为2)组的,有了这3个矩阵,我们可以自己计算净重分类指数。
) S/ b9 d5 D) a E) X t
3 P- f8 J( F9 X! ^. }) g! [看case组:+ }. ]* ~9 N, P$ N( T
9 m' y) l2 f y) d2 u净重分类指数 = ((0+3)-(0+1)) / 88 ≈ 0.022727273
: j* \$ k5 W. j$ K5 r3 [ ?2 }2 k5 {6 K4 ]& j5 B* @: S
再看control组:; q; P1 z% E( Y0 e$ N! ?
2 ]) t; A9 Z1 [/ u
净重分类指数 = ((1+1)-(4+1)) / 144 ≈ -0.020833333
2 I* e, e2 e* u" H) V2 h; F" k/ L( `7 H* H4 i4 B
相加净重分类指数 = case组净重分类指数 + control组净重分类指数 = 2/88 - 3/144 ≈ 0.000315657
4 B3 P/ p, M" a( I6 V4 V7 N& F/ @7 n$ n, ^9 h. B
再往下是不做bootstrap时得到的估计值,其中NRI就是绝对净重分类指数,NRI+是case组的净重分类指数,NRI-是control组的净重分类指数(和我们计算的一样哦),最后是做了500次bootstrap后得到的估计值,并且有标准误和可信区间。4 q2 l2 v; J& q4 j. h# m
* G+ T7 n" M( w8 X# d- m; T
最后还会得到一张图:
! o: F1 K( O9 t' n1 P: B6 N' w9 r$ V% B' d) F( b3 s% Z5 l
这张图中的虚线对应的坐标,就是我们在cut中设置的阈值,这张图对应的是上面结果中的第一个混淆矩阵,反应的是总体的情况,case是结果为1的组,也就是发生结局的组,control是结果为0的组,也就是未发生结局的组。
% M. O' W; b* ?% A( V, P* x# B$ l: Y4 z) k2 z9 J
P值没有直接给出,但是可以自己计算。
% e( }% y3 G6 P S, b# |- y `5 e
/ k8 O# [0 { t6 W+ Z# 计算P值
* M( {* K0 A( v* _' Dz <- abs(0.001893939/0.027816095)
3 a d' @2 O, a0 W& rp <- (1 - pnorm(z))*2
3 s. A* K& Z9 B9 ^5 ]* M, f" M) Kp
, P. M* {+ E* l5 G8 _' C7 |15 o- x, k3 d8 |
## [1] 0.9457157
6 f% w; n# c d$ A& w7 K3 R& y. Q1* F, K; F u' z* n, ?
PredictABEL包
% ^5 E" w: W! G( j. G s5 p#install.packages("PredictABEL") #安装R包
( `% r- s% o/ Q9 i0 e8 S6 Llibrary(PredictABEL)
7 C) Z0 d3 i' p- J6 z% t* }1 S( Q. u# d* d% |6 v, |! }
# 取出模型预测概率,这个包只能用预测概率计算5 |7 M* u2 D3 V/ W9 `
p.std = mstd$fitted.values
# A9 Q, m/ `/ H9 Q$ E# sp.new = mnew$fitted.values
& d4 i$ e# \1 l) k% F h1
P9 M- _% M; ?! z0 j然后就是计算NRI:2 R G& n& t3 ]- n, v2 }
1 i6 m+ D {9 h8 h; q
dat$event <- event
. v% u! k; Q) z: S. H
( l% {" ^ l7 l% V+ J9 X9 R+ yreclassification(data = dat,7 u* {- H. K: k9 X' t, X k
cOutcome = 21, # 结果变量在哪一列8 n% {/ c, h1 u. r
predrisk1 = p.std,7 o6 f. T1 E# l! G. D. W' k/ o V( s
predrisk2 = p.new,% V: F2 Z, U' S+ ?6 Q7 z; C+ e
cutoff = c(0,0.3,0.7,1)
, C! r6 N1 [( s" B/ Q )
" t8 [/ `6 I2 M1, y1 M1 e+ ]. n# W3 c& `- h! q
## _________________________________________# O* E0 } q+ o# ^& ]& B1 q8 a+ d
##
# q. U7 d- ^! `3 u## Reclassification table 2 M* W6 s; J( M" X1 {6 }
## _________________________________________
2 N' n# [, L- S: j3 g) W$ |: V## , [) c" x) b9 Z3 d6 s! p
## Outcome: absent $ u a0 }+ M$ ^+ k: E
## 7 l; Q% s [1 w) G+ y) y8 j
## Updated Model
3 V* X6 c* o7 M. B% F## Initial Model [0,0.3) [0.3,0.7) [0.7,1] % reclassified
, v7 t2 v0 X0 R## [0,0.3) 121 4 0 3& E: W! s, [6 B; M2 ~
## [0.3,0.7) 1 13 1 13( m1 c5 X$ b8 n: ^ P8 K3 L
## [0.7,1] 0 1 3 25" y# D( }$ i% t( W4 m) f9 v* L
## - L' [3 h9 J2 p7 F/ q" p
##
' [9 p: r% f- A$ ]5 G; ^## Outcome: present . d* [+ ^1 i1 y+ [$ Q, Z
## . b' J( ^9 `; `. \1 x# r
## Updated Model
X; `' S" _8 q## Initial Model [0,0.3) [0.3,0.7) [0.7,1] % reclassified
$ G! g. _4 A, \## [0,0.3) 14 0 0 0
' [# y0 l/ i/ {# ?' [## [0.3,0.7) 0 18 3 14 n2 L8 ^3 D" H g4 K
## [0.7,1] 0 1 52 2$ K% [$ ]$ P, x: |* z. x3 g
## ( m/ \8 D, }# D# M" V, H, m0 z
##
# m9 g4 g3 Q k5 O1 [## Combined Data & P9 r2 T1 i6 M6 Y
## ! I2 L( K# I0 \2 w. V* x0 A
## Updated Model+ m, ]7 h F. W. }5 t; ^
## Initial Model [0,0.3) [0.3,0.7) [0.7,1] % reclassified2 L" i3 o3 b" V0 h
## [0,0.3) 135 4 0 3: J& n" X3 _- N! O# K% I0 j3 v/ p1 B
## [0.3,0.7) 1 31 4 14$ A# h4 J U% u4 W! P, P6 `
## [0.7,1] 0 2 55 4
Y+ W+ V0 a/ K: f+ b A2 f- ^6 ~## _________________________________________0 v- l: M# t9 s; ~. R% c' I' i
## 4 b l. N3 v, T" N# F7 D
## NRI(Categorical) [95% CI]: 0.0019 [ -0.0551 - 0.0589 ] ; p-value: 0.94806
$ @2 V* @2 t8 y1 J1 f+ O8 S## NRI(Continuous) [95% CI]: 0.0391 [ -0.2238 - 0.3021 ] ; p-value: 0.77048 ' @0 \" \* D# r- l6 @
## IDI [95% CI]: 0.0044 [ -0.0037 - 0.0126 ] ; p-value: 0.28396$ I! c5 `7 f. A& x q
4 [. f0 o% m J. L
1
0 A3 S+ N' |/ _结果得到的是相加净重分类指数,还给出了IDI和P值。两个包算是各有优劣吧,大家可以自由选择。
6 P( N2 W: X! H0 t7 r4 i* G( E8 m1 u% z) ?) _" K* i1 c8 j) ]
生存分析的NRI- F! d! ?# _( ?' M2 @4 R! J
还是使用survival包中的pbc数据集用于演示,这次要构建cox回归模型,因此我们要使用time这一列了。. N6 w' S7 _7 h* d# K1 P
. @2 [ a8 L- o3 w- H5 {nricens包
/ `) k% a4 b/ p" ?library(nricens)
3 ^0 a/ N" E5 X* C" Q* c6 A6 glibrary(survival)
+ n/ [+ K. I: x |0 b: B( d
6 A) ]! D/ I# v: hdat <- pbc[1:312,]
: T$ Q- p( i0 Y% m: G5 b6 w' Kdat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡
, A5 y% w! `1 J7 {4 k17 p4 s! t3 S; n! J% O3 J
然后准备所需参数:7 y# }" Q1 a; \% C! d5 i+ r
! Z b& e* y7 p4 p# 两个只由预测变量组成的矩阵
# e, x" ]0 n, V1 G: fz.std = as.matrix(subset(dat, select = c(age, bili, albumin)))* n' A: U; x# O% W# R" ]" D
z.new = as.matrix(subset(dat, select = c(age, bili, albumin, protime)))" W2 U( A! G- U8 N3 o2 o" J
& p* r' U1 i6 @6 M# ?) v' M
# 建立2个cox模型
% X3 |& c& V8 n. D" r9 O* Lmstd <- coxph(Surv(time,status) ~ age + bili + albumin, data = dat, x=TRUE)
3 }' X1 a. K7 M5 Dmnew <- coxph(Surv(time,status) ~ age + bili + albumin + protime, data = dat, x=TRUE)1 n1 N* T: n" _5 [; _. z
1 o4 u F$ U, u/ d# 计算在2000天的模型预测概率,这一步不要也行,看你使用哪些参数) I3 }2 _. e" m- m. Q
p.std <- get.risk.coxph(mstd, t0=2000)% ~) D2 f1 [# S
p.new <- get.risk.coxph(mnew, t0=2000)
% Y, @6 I) }0 W! v1
' Z. m) I( X1 F( j& m! S4 ~, j计算NRI:
v; M5 U9 W4 z% J/ o! D# _( e5 g. Q7 g3 r" {
nricens(mdl.std= mstd, mdl.new = mnew, + x8 [+ u" D9 Q* I, [7 M( u2 B
t0 = 2000, " i3 F7 I! V9 W; [
cut = c(0.3, 0.7),
( \" V# L1 e1 }% } niter = 1000, ! @) {$ m4 u: ~. F7 i
updown = 'category')
0 \4 z& W: o$ O5 d+ m9 n) c9 M O0 m- A, C
UP and DOWN calculation:
' V$ x5 Z+ [! k) N- E. ^+ P #of total, case, and control subjects at t0: 312 88 144$ ?6 }6 P( d/ n
# P% n% A! T( R( C8 o. t- q0 ] Reclassification Table for all subjects:5 U* Z! s) {6 i6 H. Q5 E% I3 x
New! ]. ^) E6 Q/ }+ e& l
Standard < 0.3 < 0.7 >= 0.75 F# `# ?* l0 T4 F/ T1 [0 V+ Q7 e0 u
< 0.3 202 7 0
2 l$ A: F$ w& ^2 L+ { < 0.7 13 53 6
6 }' ?! k7 k0 X: d" z' [ >= 0.7 0 0 312 f$ t+ L1 d, Y% W
+ R( ^1 i5 M4 p5 w) E: G Reclassification Table for case:
, K. `. \4 B$ I& t; M# f" n New& J( Z- x( v9 D* b" Q' n6 u( ]
Standard < 0.3 < 0.7 >= 0.7" M0 m5 y# ]/ M
< 0.3 19 3 0
7 Q- K1 {1 J/ ^' r: s5 T < 0.7 3 32 42 m( [- V; V4 L
>= 0.7 0 0 274 Q' v* Q: ? z7 q# x7 p
" p/ |2 m0 w, |, L3 R4 F0 p* M8 J Reclassification Table for control:! ^ L/ g5 k) r1 {/ x9 g' o# c3 ]& D
New3 l6 B5 [* b9 Q& J) y) H
Standard < 0.3 < 0.7 >= 0.7
3 [8 J/ g, ^5 E+ @7 Y < 0.3 126 3 0
/ k; F0 ?& y" x# v1 J% ] < 0.7 5 7 25 f9 a; A% n2 v# C1 d
>= 0.7 0 0 1
8 X7 D/ p' F. v3 x. A0 L
. e G* M/ M- k& nNRI estimation by KM estimator:" Y! u& k' Q, ?1 K
0 k/ c0 y) D6 JPoint estimates:9 i o% ^" e/ b! [0 `
Estimate
' L5 g8 x1 d: jNRI 0.05377635/ i$ \0 H3 ~8 G8 c
NRI+ 0.03748660
8 B5 ~6 m. o" {& ~NRI- 0.01628974
* C+ c# F r3 s0 qPr(Up|Case) 0.07708938
+ D2 x6 B t" D; {% }* K3 M0 @" xPr(Down|Case) 0.03960278
8 `$ [) p7 {& N2 iPr(Down|Ctrl) 0.042563528 P# p4 {# o4 U. S4 t- U8 Y
Pr(Up|Ctrl) 0.02627378! r" Y* j! D- y. Q8 v
2 {' S+ g: f# d- h3 a0 nNow in bootstrap..
, }- b4 N5 r2 B& n, N" b5 R+ s$ R: a4 s+ {# @! F1 [4 Z! U
Point & Interval estimates:$ A% l* z6 r& O: P, d: l! ]
Estimate Lower Upper% T m! n$ `' u! M+ b
NRI 0.05377635 -0.082230381 0.16058172
7 n R3 z$ w+ s4 aNRI+ 0.03748660 -0.084245197 0.13231776
: q8 Y) x; }5 e- g1 R+ XNRI- 0.01628974 -0.030861213 0.067536162 @* p# V3 `! \
Pr(Up|Case) 0.07708938 0.000000000 0.19102291
/ l o' @' q/ R7 f5 L: [/ ePr(Down|Case) 0.03960278 0.000000000 0.15236016- d h( w. p; L% G
Pr(Down|Ctrl) 0.04256352 0.004671535 0.09863170
& U/ l" M0 U0 @6 U. VPr(Up|Ctrl) 0.02627378 0.006400463 0.05998424& V4 i9 E/ d! T+ N) U+ V2 U
% Y, p( _) l! |- O
1" ~; u& F) s, ?! {2 V* a1 w& X
1 _8 W G% K# `, JSnipaste_2022-05-20_21-49-38; H: T" L, L# @8 A
结果的解读和logistic的一模一样。1 F' p) k: L) r6 K
3 A) d0 W) `1 F7 @
survNRI包% Q& V9 K& L# V5 i! L6 q, c- l
# 安装R包( W; g7 l- f/ U9 ^5 n
devtools::install_github("mdbrown/survNRI"); A d& [2 B6 ], R3 ]
1/ q9 U$ J0 p% I, u+ L4 Q! N3 h, u
加载R包并使用,还是用上面的pbc数据集。+ H$ J. Y! p3 W( L
9 ~8 p" @5 ?; }3 b% \: k8 v4 `4 z
library(survNRI)5 K+ G* n$ @& ]: m
1* `+ c- \* c/ |7 W
## Loading required package: MASS+ V8 J8 j9 M1 U! h! x4 ^1 h
1, ` ^4 Y0 U6 h, ^
library(survival); O# t% \8 e1 Q$ s! l
" Z$ K6 i/ F: M2 N3 K8 A b
# 使用部分数据
! }2 z, T' G Ndat <- pbc[1:312,]8 Y5 H* l* x H- x: O
dat$status <- ifelse(dat$status==2, 1, 0) # 0表示活着,1表示死亡4 j, W3 @2 F7 A! Q8 ^- N
D5 P& m' S2 H' _/ g' C; W; N
res <- survNRI(time = "time", event = "status",
& q% o: [% H' ?" p' m- W5 Z model1 = c("age", "bili", "albumin"), # 模型1的自变量& I5 H X/ A) P5 U _
model2 = c("age", "bili", "albumin", "protime"), # 模型2的自变量" s& H5 w+ ]. a; t: x1 L
data = dat,
3 k( h$ j& h: x predict.time = 2000, # 预测的时间点
. K, @ t6 @* L! @2 e7 y method = "all",
2 |0 v3 M( t/ [8 L8 X- ? bootMethod = "normal",
* o+ P; e1 _3 @1 R$ u bootstraps = 500,
6 m c+ p- W+ b T/ N alpha = .05)
- |- `/ T: o( L' C% z- t
/ O7 O1 t7 c+ j7 ^8 Q8 K$ _ d1% q T5 I6 Z! n) K
查看结果,$estimates给出了不同组的NRI以及总的NRI,包括了使用不同方法(KM/IPW/SmoothIPW/SEM/Combined)得到的结果;$CI给出了可信区间。/ W, J5 I+ K- p; @9 ? ]
: G. x; u: G, a7 ]# g
res; j, S0 M1 p3 B8 W5 Q% R4 ?- `1 `
1
/ D/ J( c$ \" [' S## $estimates
. b1 R x1 _) C8 @% S" A! g) m## NRI.event NRI.nonevent NRI9 }% S( g. A5 z9 }5 u
## KM 0.20445422 0.3187408 0.5231951
$ \* j0 W- ^1 j0 l3 f7 _## IPW 0.22424434 0.3273544 0.5515987
$ L) m2 t0 d4 I4 y! x% t" \+ A## SmoothIPW 0.19645006 0.3144263 0.5108763
( W. v5 ~/ q. G9 J) { S4 I## SEM 0.07478611 0.2632127 0.3379988
4 d$ M# S* l2 ?) B## Combined 0.19633867 0.3143794 0.5107181
4 l/ K, Q& a$ d+ d( O9 Z##
- y+ v( Z e, m$ _## $CI" m, @; V/ t# W; p
## $CI$NRI.event/ e! E- h8 H8 @# n
## KM IPW SmoothIPW SEM Combined8 l/ _3 i% |; r- x- W6 G- X3 e2 S" @
## lowerbound -0.03915924 -0.02185068 -0.04724202 -0.1162587 -0.0473723
" R- O- \) Y2 J5 c' z/ w! ^0 _& P1 l## upperbound 0.44806768 0.47033936 0.44014214 0.2658309 0.4400496
7 H! K$ H7 w' P# A* m& O##
* O6 ]+ f- G8 ], j+ [# o## $CI$NRI.nonevent
4 |8 s: W2 P8 v4 t6 s& X/ w## KM IPW SmoothIPW SEM Combined
2 L# M n+ b8 D. r; L1 c## lowerbound 0.1317108 0.1396315 0.1286685 0.08638933 0.1286426
! f8 `2 j3 \% D4 V2 K/ C* f- I2 L## upperbound 0.7102251 0.7393216 0.6966341 0.51482212 0.6964549* d4 {0 H" M* ?- `3 z/ @
##
2 R; g0 b- r1 \5 l0 X& \, d## $CI$NRI/ d0 a: }/ N8 Q& O
## KM IPW SmoothIPW SEM Combined
( A9 k- y8 y1 B, X- t0 y## lowerbound -0.05112533 -0.04569046 -0.05439863 -0.04132364 -0.05443409
' |0 n1 b4 ?- ?. F## upperbound 0.89306122 0.92464359 0.87970125 0.64253510 0.87953153
$ J8 R) d' |* u) P( V% V3 O$ h##
$ T5 J' W2 ?5 t/ i1 N0 G, l# @##
q X7 ~1 g, u8 d v## $bootMethod' Q9 Y2 ?+ U$ Y! [3 L# B
## [1] "normal"
( M& q/ m$ p* F. r4 I5 B3 S0 U/ h- V) L. F##
4 w* }) ^0 v7 a. x2 n! N## $predict.time
4 j) K+ u" x' @# a! w9 \( O4 s3 ~## [1] 2000
% y2 u! _- l% H& R( |## ( O. |4 E2 N: d" {
## $alpha
9 ?5 W0 ~1 c7 Q, g* g: p## [1] 0.051 }% c/ a8 i. [& x
##
! F9 y8 f3 p1 K( z7 l## attr(,"class")
6 O+ ?, c( J, ]+ }, J## [1] "survNRI"0 _% [6 v- s* m8 q( i! S3 n
2 e/ l7 N& y/ C: Z$ }, `
1
! p% p9 M; U7 sOK,这就是NRI的计算,除此之外,随机森林、决策树、lasso回归、SVM等,这些模型,都是可以计算的NRI的,后面会继续介绍。大家如果有问题欢迎在评论区留言。4 A& E% j; a' \: T, e a+ r; i$ C
( D, h- r2 D1 {4 x) c4 d# U本文首发于公众号:医学和生信笔记
8 t' ^. ~# a" v8 _1 A
3 i8 }8 P/ P! w9 c' U6 o" Q“ 医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。
: B* s1 ]& u/ ^0 ^本文由 mdnice 多平台发布5 X! y6 c) B& k7 V0 E3 ^& m- E
———————————————— a0 v" S( f8 O. @! X
版权声明:本文为CSDN博主「阿越就是我」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 H* J# C% Z- v# c原文链接:https://blog.csdn.net/Ayue0616/article/details/126768006; E0 a7 i3 i- [" u
8 e Y% g& U; o+ m$ ? X& ~. E4 C, n& |" }1 f
|
zan
|