Skip to content

Commit 7fad953

Browse files
committed
1st upload
First upload of modelviz on github
0 parents  commit 7fad953

21 files changed

+1158
-0
lines changed

.Rbuildignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
^.*\.Rproj$
2+
^\.Rproj\.user$

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.Rproj.user
2+
.Rhistory
3+
.RData

DESCRIPTION

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Package: modelviz
2+
Type: Package
3+
Title: Generation of QMD for NONMEM outputs
4+
Version: 0.1
5+
Date: 2015-06-29
6+
Author: Benjamin Guiastrennec
7+
Maintainer: Benjamin Guiastrennec <[email protected]>
8+
Description: Generation of quantitative model diagrams (QMD) for evaluation of NONMEM outputs
9+
Depends: R (>= 3.0.2)
10+
Imports: DiagrammeR (>= 0.6)
11+
License: GPL-2
12+
LazyData: true
13+
URL: https://github.com/guiastrennec/ModelViz

NAMESPACE

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Generated by roxygen2 (4.1.1): do not edit by hand
2+
3+
export(make_arrows)
4+
export(make_comp)
5+
export(modelviz)
6+
export(prm_format)
7+
export(prm_import)
8+
importFrom(DiagrammeR,x11_hex)

R/make_arrows.R

+158
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
#' Create arrow data
2+
#'
3+
#' @description Creates information on arrows label, witdh, color, scaling, etc.
4+
#'
5+
#' @param prms a numerical vector of parameter values
6+
#' @param rse a numerical vector of parameter uncertainty
7+
#' @param advan the nonmem $SUB ADVAN
8+
#' @param scaling logical if \code{TRUE} arrow width and colors will be scaled
9+
#' @param scale.fun function to be used for arrow width scaling
10+
#' @param clearance logical if \code{TRUE} arrows will be scaled to their available
11+
#' clearance value. If \code{FALSE} arrows will be scaled to their available
12+
#' rate constant value
13+
#' @param font font of arrow labels
14+
#' @param node.fontsize font size of the arrow labels
15+
#' @seealso \code{\link{prm_import}}, \code{\link{modelviz}}
16+
#' @return A \code{data.frame} of arrows
17+
#' @export
18+
make_arrows <- function(prms=NULL, rse=NULL, advan=NULL, scaling=TRUE,
19+
scale.fun ='cubic', font='Avenir', clearance=TRUE,
20+
edge.fontsize=12,...){
21+
22+
if(advan==1){
23+
if(clearance){
24+
edge <- DiagrammeR::create_edges(from = 'A1',
25+
to = 'A2',
26+
label = 'CL',
27+
dir = 'forward')
28+
}else{
29+
edge <- DiagrammeR::create_edges(from = 'A1',
30+
to = 'A2',
31+
label = 'K',
32+
dir = 'forward')
33+
}
34+
}
35+
36+
if(advan==2){
37+
if(clearance){
38+
edge <- DiagrammeR::create_edges(from = c('A1','A2'),
39+
to = c('A2','A3'),
40+
label = c('KA','CL'),
41+
dir = 'forward')
42+
}else{
43+
edge <- DiagrammeR::create_edges(from = c('A1','A2'),
44+
to = c('A2','A3'),
45+
label = c('KA','K'),
46+
dir = 'forward')
47+
}
48+
}
49+
50+
if(advan==3){
51+
if(clearance){
52+
edge <- DiagrammeR::create_edges(from = c('A1','A1'),
53+
to = c('A3','A2'),
54+
label = c('CL','Q'),
55+
dir = c('forward','both'))
56+
}else{
57+
edge <- DiagrammeR::create_edges(from = c('A1','A1','A2'),
58+
to = c('A3','A2','A1'),
59+
label = c('K','K12','K21'),
60+
dir = 'forward')
61+
}
62+
}
63+
64+
if(advan==4){
65+
if(clearance){
66+
edge <- DiagrammeR::create_edges(from = c('A1','A2','A2'),
67+
to = c('A2','A4','A3'),
68+
label = c('KA','CL','Q'),
69+
dir = c('forward','forward','both'))
70+
}else{
71+
edge <- DiagrammeR::create_edges(from = c('A1','A2','A2','A3'),
72+
to = c('A2','A4','A3','A2'),
73+
label = c('KA','K','K23','K32'),
74+
dir = 'forward')
75+
}
76+
}
77+
78+
if(advan==11){
79+
if(clearance){
80+
edge <- DiagrammeR::create_edges(from = c('A1','A1','A1'),
81+
to = c('A2','A3','A4'),
82+
label = c('Q2','Q3','CL'),
83+
dir = c('both','both','forward'))
84+
}else{
85+
edge <- DiagrammeR::create_edges(from = c('A1','A2','A1','A3','A1'),
86+
to = c('A2','A1','A3','A1','A4'),
87+
label = c('K12','K21','K13','K31','K'),
88+
dir = 'forward')
89+
}
90+
}
91+
92+
if(advan==12){
93+
if(clearance){
94+
edge <- DiagrammeR::create_edges(from = c('A1','A2','A2','A2'),
95+
to = c('A2','A3','A4','A5'),
96+
label = c('KA','Q2','Q3','CL'),
97+
dir = c('forward','both','both','forward'))
98+
}else{
99+
edge <- DiagrammeR::create_edges(from = c('A1','A2','A3','A2','A4','A2'),
100+
to = c('A2','A3','A2','A4','A2','A5'),
101+
label = c('KA','K23','K32','K24','K42','K'),
102+
dir = 'forward')
103+
}
104+
}
105+
106+
if(advan==20){
107+
edge <- DiagrammeR::create_edges(from = c('A1','A2','A1','A2','A1','A2'),
108+
to = c('A2','A1','A1','A2','A3','A3'),
109+
label = c('K10','K01','K00','K11','K20','K21'),
110+
dir = 'forward',
111+
headport=c('_','_','nw','ne','_','_'),
112+
tailport=c('_','_','_','_','_','_'))
113+
}
114+
115+
# Additional formatting ---------------------------------------------------
116+
edge$prm <- NA
117+
if(!is.null(prms)){
118+
edge$prm[match(intersect(edge$label,names(prms)),edge$label,nomatch=0)] <- c(prms[intersect(edge$label,names(prms))],recursive=TRUE)
119+
}
120+
121+
edge$rse <- NA
122+
if(!is.null(rse)){
123+
edge$rse[match(intersect(edge$label,names(rse)),edge$label,nomatch=0)] <- c(rse[intersect(edge$label,names(rse))],recursive=TRUE)
124+
}
125+
126+
if(all(is.na(edge$rse)) | scaling==FALSE){
127+
edge$color <- ifelse(!is.na(edge$prm),'grey40','grey70')
128+
}else{
129+
edge$color[is.na(edge$prm) & is.na(edge$rse)] <- 'grey70'
130+
edge$color[!is.na(edge$prm) & is.na(edge$rse)] <- 'grey40'
131+
edge$color[edge$rse<=0.3] <- 'chartreuse3'
132+
edge$color[edge$rse>0.3 & edge$rse<0.5] <- 'orange2'
133+
edge$color[edge$rse>0.5] <- 'red'
134+
}
135+
136+
edge$fontcolor <- edge$color
137+
138+
edge$scale <- NA
139+
if(clearance){
140+
edge$scale[grep('^[CL|Q]',toupper(edge$label))] <- prm_scale(edge$prm[grep('^[CL|Q]',toupper(edge$label))],scale.fun)
141+
}else{
142+
edge$scale[grep('^K',toupper(edge$label))] <- prm_scale(edge$prm[grep('^K',toupper(edge$label))],scale.fun)
143+
}
144+
edge$scale[is.na(edge$scale)] <- 1
145+
146+
if(scaling){
147+
edge$penwidth <- ifelse(!is.na(edge$scale),edge$scale,1)
148+
edge$arrowsize <- ifelse(!is.na(edge$scale),(edge$scale*0.005)^0.23,0.8)
149+
}else{
150+
edge$penwidth <- 1
151+
edge$arrowsize <- 0.8
152+
}
153+
154+
edge$fontsize <- edge.fontsize*edge$penwidth
155+
edge$fontname <- font
156+
157+
return(edge)
158+
}

R/make_comp.R

+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
#' Create compartment data
2+
#'
3+
#' @description Creates information on compartments label, size, color, scaling, etc.
4+
#'
5+
#' @param prms a numerical vector of parameter values
6+
#' @param rse a numerical vector of parameter uncertainty
7+
#' @param advan the nonmem $SUB ADVAN
8+
#' @param scaling logical if \code{TRUE} compartment size and colors will be scaled
9+
#' @param scale.fun function to be used for compartment size scaling
10+
#' @param box.ratio compartment aspect ratio
11+
#' @param filled logical if \code{TRUE} compartment will be filled
12+
#' @param font font of the compartment labels
13+
#' @param node.fontsize font size of the compartment labels
14+
#' @seealso \code{\link{prm_import}}, \code{\link{modelviz}}
15+
#' @return A \code{data.frame} of compartments
16+
#' @export
17+
make_comp <- function(prms=NA, rse=NA, advan=NULL,
18+
scaling = TRUE, scale.fun='cubic',
19+
box.ratio = 3/4, filled = TRUE,
20+
font = 'Avenir', node.fontsize=12,...){
21+
22+
check <- function(x, check, uncert=FALSE,...){
23+
if(length(setdiff(check,names(x)))>0){
24+
message(paste('make_comp: Missing',
25+
paste(setdiff(check,names(x)),collapse=', '),
26+
ifelse(uncert,'RSE','value'),'in ADVAN',advan))
27+
}
28+
x[setdiff(check,names(x))] <- NA
29+
return(x)
30+
}
31+
32+
if(advan==1){
33+
prms <- check(prms,'V',F)
34+
rse <- check(rse,'V',T)
35+
node <- DiagrammeR::create_nodes(nodes = paste0('A',1:2),
36+
label = c('Central','Output'),
37+
rank = c(1,1),
38+
prm = c(prms['V'],NA,recursive=TRUE),
39+
rse = c(rse['V'],NA,recursive=TRUE))
40+
}
41+
42+
43+
if(advan==2){
44+
prms <- check(prms,'V',F)
45+
rse <- check(rse,'V',T)
46+
node <- DiagrammeR::create_nodes(nodes = paste0('A',1:3),
47+
label = c('Depot','Central','Output'),
48+
rank = c(1,2,2),
49+
prm = c(NA,prms['V'],NA,recursive=TRUE),
50+
rse = c(NA,rse['V'],NA,recursive=TRUE))
51+
}
52+
53+
54+
if(advan==3){
55+
prms <- check(prms,c('V1','V2'),F)
56+
rse <- check(rse,c('V1','V2'),T)
57+
node <- DiagrammeR::create_nodes(nodes = paste0('A',1:3),
58+
label = c('Central','Peripheral','Output'),
59+
rank = c(1,2,1),
60+
prm = c(prms['V1'],prms['V2'],NA,recursive=TRUE),
61+
rse = c(rse['V1'],rse['V2'],NA,recursive=TRUE))
62+
}
63+
64+
if(advan==4){
65+
prms <- check(prms,c('V2','V3'),F)
66+
rse <- check(rse,c('V2','V3'),T)
67+
node <- DiagrammeR::create_nodes(nodes = paste0('A',1:4),
68+
label = c('Depot','Central','Peripheral','Output'),
69+
rank = c(1,2,3,2),
70+
prm = c(NA,prms['V2'],prms['V3'],NA,recursive=TRUE),
71+
rse = c(NA,rse['V2'],rse['V3'],NA,recursive=TRUE))
72+
}
73+
74+
if(advan==11){
75+
prms <- check(prms,c('V1','V2','V3'),F)
76+
rse <- check(rse,c('V1','V2','V3'),T)
77+
node <- DiagrammeR::create_nodes(nodes = paste0('A',1:4),
78+
label = c('Central','Peripheral 1','Peripheral 2','Output'),
79+
rank = c(1,2,2,1),
80+
prm = c(prms['V1'],prms['V2'],prms['V3'],NA,recursive=TRUE),
81+
rse = c(rse['V1'],rse['V2'],rse['V3'],NA,recursive=TRUE))
82+
}
83+
84+
if(advan==12){
85+
prms <- check(prms,c('V2','V3','V4'),F)
86+
rse <- check(rse,c('V2','V3','V4'),T)
87+
node <- DiagrammeR::create_nodes(nodes = paste0('A',1:5),
88+
label = c('Depot','Central','Peripheral 1','Peripheral 2','Output'),
89+
rank = c(1,2,3,3,2),
90+
prm = c(NA,prms['V2'],prms['V3'],prms['V4'],NA,recursive=TRUE),
91+
rse = c(NA,rse['V2'],rse['V3'],rse['V4'],NA,recursive=TRUE))
92+
}
93+
94+
95+
if(advan==20){
96+
node <- DiagrammeR::create_nodes(nodes = paste0('A',1:3),
97+
label = c('Non-RSP','RSP','Dropout'),
98+
rank = c(1,1,2),
99+
prm = NA,
100+
rse = NA,
101+
shape = 'circle',
102+
style = 'dashed')
103+
}
104+
105+
106+
# Add formatting to nodes -------------------------------------------------
107+
108+
if(!'shape'%in%colnames(node)){
109+
node$shape <- 'box'
110+
}
111+
112+
node$scale <- prm_scale(node$prm,FUN=scale.fun)
113+
114+
if(all(is.na(node$rse)) | scaling==FALSE){
115+
node$color <- ifelse(!is.na(node$prm),'steelblue4','grey70')
116+
}else{
117+
node$color[is.na(node$rse)] <- 'grey70'
118+
node$color[node$rse<=0.25] <- 'chartreuse3'
119+
node$color[node$rse>0.25 & node$rse<0.5] <- 'orange3'
120+
node$color[node$rse>0.5] <- 'red'
121+
}
122+
123+
if(filled){
124+
node$style <- 'filled'
125+
}else{
126+
node$style <- 'solid'
127+
node$fontcolor <- node$color
128+
}
129+
130+
node$style[grepl('^OUT',toupper(node$label))] <- 'invisible'
131+
node$style[grepl('DEPOT',toupper(node$label))] <- 'dashed'
132+
node$shape[grepl('DEPOT',toupper(node$label))] <- 'circle'
133+
node$penwidth <- ifelse(node$style%in%c('filled','invisible'),0,1)
134+
135+
if(scaling){
136+
node$width <- ifelse(!is.na(node$scale),node$scale,1)
137+
}else{
138+
node$width <- 1
139+
}
140+
141+
node$height <- node$width*ifelse(node$shape=='circle',1,box.ratio)
142+
node$fontsize <- node.fontsize*node$width
143+
node$fontname <- font
144+
145+
node$alpha_color <- 80
146+
147+
return(node)
148+
}

0 commit comments

Comments
 (0)