-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.Rmd
443 lines (336 loc) · 15.9 KB
/
index.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
---
#papersize: A4
#fontsize: 10pt
#documentclass: krantz
#geometry: "margin=4in"
#geometry: "a4paper,left=1.5in,right=1.5in,top=1in,bottom=1in"
#geometry: "a4paper, nohead, nomarginpar, left=1.5in,right=1.5in,top=5in,bottom=3in,foot=1in"
#geometry: "a4paper, nohead, nomarginpar"
#geometry: "total={6.5in,8.75in}, top=1.2in, left=0.9in, includefoot"
#geometry: "a4paper, nohead, nomarginpar, left=1.5in,right=1.5in,top=1in,bottom=1in, includeheadfoot"
title: "R을 통한 비구획분석: 실습"
author: "가톨릭의대 약리학교실 연구강사 한성필"
date: "`r Sys.Date()`"
bibliography: "keynote.bib"
knit: "bookdown::render_book"
documentclass: krantz
#documentclass: svmono
biblio-style: apalike
link-citations: yes
colorlinks: yes
fontsize: 9pt
header-includes:
- \usepackage{kotex}
#mainfont: NanumGothic
output:
bookdown::pdf_book:
keep_tex: yes
pandoc_args: --top-level-division=chapter
toc_depth: 3
toc_unnumbered: no
toc_appendix: yes
template: null
#dev: "cairo_pdf"
#latex_engine: xelatex
latex_engine: pdflatex
#includes:
# in_header: latex/preamble.tex
# before_body: latex/before_body.tex
# after_body: latex/after_body.tex
bookdown::pdf_document2: default
bookdown::tufte_book2: default
bookdown::gitbook:
df_print: kable
css: style.css
split_by: chapter
config:
toolbar:
position: static
toc:
collapse: section
before: |
<li><a href="./index.html">R을 사용한 비구획분석: 실습</a></li>
after: |
<li><a href="http://github.com/asancpt/handout-ncar">handout-ncar Github 저장소</a></li>
download: [pdf]
edit:
link: https://github.com/asancpt/handout-ncar/edit/master/%s
text: "Edit"
editor_options:
chunk_output_type: console
---
```{r setup, include = FALSE}
library(tidyverse)
library(knitr)
# options(knitr.table.format = 'html')
#Sys.setlocale('LC_ALL','C')
opts_chunk$set(
#error = TRUE,
#results = 'hide',
#cache = TRUE,
fig.width = 6,
message = FALSE,
warning = FALSE)
```
\mainmatter
# 서론 {#intro}
약동학 분야에서 가장 간단하고도 객관적이며 널리 쓰이는 방법은 비구획분석 (Non-compartmental analysis, NCA)입니다.
*식약처, FDA (Food and Drug Administration)를 비롯한 대부분의 규제기관에서는 NCA하는 소프트웨어를 규정하고 있지 않아*, 상용 소프트웨어를 사용하지 않고 약동학적 지표를 구하는 것을 허용하고 있습니다.
따라서 무료로 누구나 사용할 수 있는 R 패키지를 사용하여 비구획분석을 통한 약동학적 주요 지표를 구할 수 있습니다.
- NonCompart [@R-NonCompart]
- ncar [@R-ncar]
- pkr [@R-pkr]
## 설치
우선 R을 설치합니다.
R은 아래 링크^[https://cran.r-project.org/]에서 다운로드 받을 수 있습니다.
R을 실행한 후, 콘솔 창에서 비구획분석을 위한 패키지를 설치하는 방법은 다음과 같습니다.
홑따옴표 등의 인용 부호에 주의하세요.
```{r eval = FALSE}
install.packages('NonCompart')
install.packages('ncar')
install.packages('pkr')
```
설치는 한번만 하면 되지만, 비구획분석을 위해서는 매 세션마다 패키지를 *불러오기*해야 합니다.
```{r}
library(NonCompart)
library(ncar)
#library(pkr) # NonCompart::tblNCA() can be overwritten.
```
아래 두 패키지는 비구획분석과는 관계없지만 자료 처리 혹은 그림 등을 그리는데 도움을 줍니다.
```{r}
# install.packages(c('tidyverse', 'knitr'))
# 설치 안되어 있으면 맨앞의 #을 지우고 설치.
library(tidyverse) # For presentation only, dplyr, tidyr, ggplot2
library(knitr) # For reports
```
도움이 필요할때는 맨 앞에 물음표를 붙여서 콘솔창에 입력하거나 `help()` 함수를 사용합니다.
```{r, eval = FALSE}
?NonCompart
help(tblNCA)
```
## R에 대하여
R [@R-base]은 통계 소프트웨어 입니다.
굉장히 유용한 소프트웨어이지만 이에 대해 여기서 자세히 설명하긴 힘듭니다.
R에 대한 많은 책들을 bookdown.org^[https://bookdown.org]에서 무료로 읽을 수 있습니다.
Coursera^[https://coursera.com]에서 무료 온라인 강의를 들을 수 있습니다.
## 자료 탐색
자료의 첫 10개 (Table \@ref(tab:head)) 혹은 마지막 10개 관찰값만 보고 싶으면 다음을 입력합니다.
대상자 번호가 첫 열에 나와있고 시간 순서대로 혈장에서 측정한 테오필린의 농도가 나와있습니다.
```r
head(Theoph, n=10)
tail(Theoph, n=10)
```
```{r head, echo = FALSE}
kable(head(Theoph, n=10), caption = 'Theoph 자료의 첫 10개 관찰값',
row.names = FALSE, booktabs = TRUE)
```
그림을 그려서 대략적인 자료의 모습을 파악합니다. (Figure \@ref(fig:ggtheoph))
```{r ggtheoph, fig.cap = 'Concentration-time curves of oral administration of Theoph (N = 12)', fig.width = 6, fig.height = 3.5}
ggplot(Theoph, aes(Time, conc, group = Subject, color = Subject)) +
geom_point(size = 4) +
geom_line(size = 1) +
theme_bw() +
labs(title = 'Oral Administration of Theoph (320 mg)',
x = 'Time (hour)', y = 'Concentration (ng/mL)')
```
## 자료 불러오기 {#loading}
`read.csv()` 함수를 사용해서 자료를 불러 옵니다.
엑셀 파일을 사용하는 경우 `readxl` 패키지를 설치한 후에 `read_excel()` 함수를 사용해서 불러올 수 있습니다.
다만 이 경우 `tibble` 형태로 자료가 변형되므로 `as.data.frame()`을 사용해서 데이타프레임으로 변형해주어야 합니다.
## 파라메터의 의미 {#parameters}
비구획분석 시 여러 파라메터가 나오며 약어로 표현하는 경우가 많습니다. 또한 소프트웨어마다 약어가 상이하기 때문에 자주 그 의미를 찾아볼 필요가 있습니다. 콘솔창에 다음을 입력합니다.
```{r eval = FALSE}
?ncar::txtNCA()
ncar::RptCfg
```
ncar::RptCfg의 일부를 첨부합니다. (Table \@ref(tab:rptcfg)) `PPTESTCD`는 NonCompart 패키지에서 출력하는 파라메터 이름이며, CDISC SDTM PPTESTCD (Parameter Short Name)^[다음과 같이 CDISC note에 표시되어 있습니다. 'Short name of the pharmacokinetic parameter. It can be used as a column name when converting a dataset from a vertical to a horizontal format. The value in PPTESTCD cannot be longer than 8 characters, nor can it start with a number (e.g., "1TEST"). PPTESTCD cannot contain characters other than letters, numbers, or underscores. Examples: "AUCALL", "TMAX", "CMAX".' https://wiki.cdisc.org/pages/viewpage.action?pageId=42309513]와 같은 값입니다. `WNL` 열은 Certara Phoenix WinNonLin에서 구한 파라메터 이름입니다.
```{r rptcfg, echo = FALSE}
param_table <- ncar::RptCfg %>%
select(PPTESTCD, SYNONYM, WNL) %>%
mutate(`Description (WNL)` = sprintf('%s (%s)', SYNONYM, WNL)) %>%
select(1, 4)
kable(param_table,
caption = 'Description of NonCompart parameters',booktabs=TRUE, longtable = TRUE)
```
# 패키지: NonCompart
## tblNCA(): 전체 대상자 비구획 분석
가장 많이 쓰는 함수 입니다!
NonCompart 패키지의 핵심적인 기능입니다.
아래의 코드를 R의 콘솔창에 넣어보세요.
테오필린 경구 투여시의 비구획 분석입니다.
```{r}
Theoph_tblNCA <- tblNCA(Theoph)
```
결과는 `data.frame` 형태인데 너무 길기 때문에 핵심적인 일부 파라메터 (C~max~, T~max~, AUC~last~)만 표시할 수도 있습니다.
```{r}
Theoph_tblNCA_selected <- Theoph_tblNCA %>%
select(Subject, CMAX, TMAX, AUCLST) %>%
print()
```
인도메타신 정맥 투여시의 비구획 분석입니다.
함수인자 `adm`을 infusion으로 바꾼 것을 볼 수 있고 `dur`가 추가된 것을 볼 수 있습니다.
```{r}
Indometh_tblNCA <- tblNCA(Indometh, key="Subject",
colTime="time", colConc="conc", dose=25,
adm="Infusion", dur=0.5,
concUnit="mg/L", R2ADJ = 0.8)
```
역시 핵심적인 일부 파라메터 (C~max~, T~max~, AUC~last~)만 표시할 수도 있습니다.
```{r}
Indometh_tblNCA_selected <- Indometh_tblNCA %>%
select(Subject, CMAX, TMAX, AUCLST) %>%
print()
```
## sNCA()
한명의 대상자에 대해 비구획 분석을 시행합니다.
```{r}
# For one subject
x = Theoph[Theoph$Subject=="1","Time"]
y = Theoph[Theoph$Subject=="1","conc"]
sNCA(x, y, dose=320, doseUnit="mg", concUnit="mg/L", timeUnit="h")
```
이때의 그림은 다음과 같습니다. (Figure \@ref(fig:ggtheophindi))
```{r ggtheophindi, fig.cap = 'Individual concentration-time curves of oral administration of Theoph (Subject 1)', fig.width = 6, fig.height = 3.5}
ggplot(Theoph %>% dplyr::filter(Subject == 1),
aes(Time, conc, group = Subject, color = Subject)) +
geom_point(size = 4) + geom_line(size = 1) +
theme_minimal() +
labs(title = 'Oral Administration of Theoph (320 mg) (Subject 1)',
x = 'Time (hour)', y = 'Concentration (ng/mL)')
```
## 기술통계 (Descriptive statistics)
R에서는 필요에 따라서 자신만의 함수를 만들 수도 있습니다.
아래를 실행하면 `desc_tblNCA()` 함수를 사용하여 기술통계량을 쉽게 구할 수 있습니다. (Table \@ref(tab:theodesc) and \@ref(tab:indodesc))
```{r}
desc_tblNCA <- function(tblNCA){
psych::describe(tblNCA) %>%
select(n, mean, sd, median, min, max)
}
```
```{r eval = FALSE}
desc_tblNCA(Theoph_tblNCA_selected)
desc_tblNCA(Indometh_tblNCA_selected)
```
```{r theodesc, echo = FALSE}
desc_tblNCA(Theoph_tblNCA_selected) %>%
kable(booktabs = TRUE,
caption = 'Descriptive statistics of selected PK parameters of Theoph oral administration')
```
```{r indodesc, echo = FALSE}
desc_tblNCA(Indometh_tblNCA_selected) %>%
kable(booktabs = TRUE,
caption = 'Descriptive statistics of selected PK parameters of Indometh IV infusion')
```
# 패키지: ncar
보고서를 만드는 패키지입니다. 현재 설정된 working directory에 결과 파일이 생성됩니다.
## txtNCA()
txtNCA()를 통해서 다음 결과를 얻을 수 있습니다.
```{r eval=FALSE}
txtNCA(Theoph[Theoph$Subject=="1","Time"],
Theoph[Theoph$Subject=="1","conc"],
dose=320, doseUnit="mg", concUnit="mg/L", timeUnit="h")
```
파일로 저장하려면 다음을 입력합니다.
```{r}
writeLines(txtNCA(Theoph[Theoph$Subject=="1","Time"],
Theoph[Theoph$Subject=="1","conc"],
dose=320, doseUnit="mg", concUnit="mg/L",
timeUnit="h"),
'Output-ncar/txtNCA-Theoph.txt')
```
## pdfNCA()
pdfNCA()로 pdf로 결과를 볼 수 있습니다. (Figure \@ref(fig:pdfnca-output))
```{r pdfNCA}
ncar::pdfNCA(fileName="Output-ncar/pdfNCA-Theoph.pdf", Theoph, key="Subject",
colTime="Time", colConc="conc", dose=320, doseUnit="mg",
timeUnit="h", concUnit="mg/L")
```
```{r include = FALSE}
system("magick -density 150 Output-ncar/pdfNCA-Theoph.pdf Output-ncar/pdfNCA-Theoph-%02d.png")
system("magick montage Output-ncar/pdfNCA-Theoph-01.png Output-ncar/pdfNCA-Theoph-02.png Output-ncar/montage.png")
```
```{r pdfnca-output, fig.cap = 'pdfNCA() output', fig.width = 6, echo = FALSE}
#knitr::include_graphics('Output-ncar/pdfNCA-Theoph-01.png')
knitr::include_graphics(c('Output-ncar/pdfNCA-Theoph-01.png', 'Output-ncar/pdfNCA-Theoph-02.png'))
#include_graphics('Output-ncar/pdfNCA-Theoph-02.png')
```
## rtfNCA()
마이크로소프트 워드에서 편집가능한 rtf파일을 만듭니다.
```{r eval = FALSE}
ncar::rtfNCA(fileName="rtfNCA-Theoph.rtf", Theoph, key="Subject",
colTime="Time", colConc="conc", dose=320, doseUnit="mg",
timeUnit="h", concUnit="mg/L")
```
# 패키지: pkr
## plotPK()
비구획분석에 대한 다양한 시각화는 여러 유용한 정보를 제공해 줍니다.
이를 가능하게 해 주는 `pkr` 패키지[@R-pkr]에 대해서 자세히 알아보겠습니다.
```{r eval = TRUE}
library(tidyverse)
library(pkr)
pkr::plotPK(Theoph, "Subject", "Time", "conc",
unitTime = "hr", unitConc = "mg/L", dose = 320)
```
## pkr 사용법 {#pkr-manual}
`pkr` 함수의 가장 핵심적인 기능은 `plotPK()` 함수에 있고 이 함수의 인자는 다음과 같습니다.
```{r}
args(plotPK)
```
`Theoph` 자료의 그림을 그리는 명령어를 실행해 보겠습니다.
```{r message = FALSE}
plotPK(Theoph, "Subject", "Time", "conc", unitTime="hr", unitConc="mg/L", dose=320)
```
조금 기다린 후 `Output` 폴더를 확인해 보면 세개의 그림 파일이 생성된 것을 알 수 있습니다.
- `r dir('./Output/', pattern = '\\.tiff$', full.names = TRUE) %>% grep(pattern = ' ', value = TRUE) %>% paste(collapse = '\n- ')`
```{r include = FALSE}
files <- dir('Output', pattern = '\\.png$', full.names = TRUE)
files
```
```{r, echo = FALSE, fig.cap = '평균 약동학 파라메터와 그룹 농도-시간 그림 (선형)', out.width='95%'}
knitr::include_graphics('Output/PK_Profile_Linear_Scale_for_Theoph.png')
```
```{r, echo = FALSE, fig.cap = '평균 약동학 파라메터와 그룹 농도-시간 그림 (로그)', out.width='95%'}
knitr::include_graphics('Output/PK_Profile_Log_10_Scale_for_Theoph.png')
```
```{r, echo = FALSE, fig.cap = '평균 약동학 파라메터와 그룹 평균 농도-시간 그림 (로그)', out.width='95%'}
knitr::include_graphics('Output/PK_Profile_with_CI_for_Theoph.png')
```
또한 개개인 별로 여러개의 그림이 담긴 두개의 PDF 파일이 생성되었습니다.
- `r dir('./Output/', pattern = '\\.pdf$', full.names = TRUE) %>% grep(pattern = ' ', value = TRUE) %>% paste(collapse = '\n- ')`
```{r, echo = FALSE, fig.cap = '약동학 파라메터와 함께 표시되는 농도-시간 그림 (선형)', out.width='95%'}
knitr::include_graphics('Output/Individual_PK_Linear_Scale_for_Theoph.png')
```
```{r, echo = FALSE, fig.cap = '약동학 파라메터와 함께 표시되는 농도-시간 그림 (로그)', out.width='95%'}
knitr::include_graphics('Output/Individual_PK_Log_10_Scale_for_Theoph.png')
```
# 기타 사항 {#etc}
## shiny 앱
웹브라우저를 통해 간단히 비구획분석을 할 수 있는 앱을 개발하였습니다.
- Han, S. (2017) pkrshiny: Noncompartmental Analysis using pkr R package Shiny application. URL: https://asan.shinyapps.io/pkrshiny
그 외 약동학과 관련된 몇가지 shiny 앱도 참고하세요.
- Han, S. (2017) Pharmacokinetic Simulation of one-compartment Models. URL: https://asan.shinyapps.io/pk1c/
- Han, S. (2017) caff: Monte Carlo Simulation of Caffeine Shiny application. URL: https://asan.shinyapps.io/caff
- Han, S. (2016) vtdm: Vancomycin TDM Shiny application. URL: https://asan.shinyapps.io/vtdm
## 지원
패키지와 관련한 모든 의문은 <[email protected]> / 02-2258-7882 으로 연락 주시면 빠르게 도움 드리겠습니다.
혹은 StackOverflow^[https://stackoverflow.com]에 영어로 질문 올려주시고 링크를 보내주시면 더 좋습니다.
아직 미완성이지만 Gitbook (일종의 웹북)^[https://asancpt.github.io/book-ncar]을 통해 전자출판도 진행 중이므로 시간 나실때 틈틈이 확인해 주시면 감사하겠습니다. (Figure \@ref(fig:gitbook))
이 실습자료도 Gitbook^[https://asancpt.github.io/handout]으로 열람 가능합니다.
가톨릭의대 약리학교실, 가톨릭계량약리학연구소 연구강사 한성필
<!--
```{r gitbook, fig.cap = 'Gitbook: Noncompartmental analysis by R (work in progress)', fig.width = 6, echo = FALSE}
include_graphics('assets/gitbook.png')
```
-->
## 고지
본 출판물은 2016-2019년도 정부(미래창조과학부)의 재원으로 한국연구재단 첨단 사이언스·교육 허브 개발 사업의 지원을 받아 수행된 결과입니다 (NRF-2016-936606).
# 참고문헌 {#references}
```{r include = FALSE}
write_bib(c('base', 'NonCompart', 'ncar', 'pkr'), file = 'keynote.bib')
```
<!--
# 세션 정보 {#sessioninfo}
```{r}
devtools::session_info()
```
-->