|
a |
|
b/uieasyroc.R |
|
|
1 |
shinyUI(pageWithSidebar( |
|
|
2 |
|
|
|
3 |
titlePanel("easyROC: a web-tool for ROC curve analysis (ver. 1.1)"), |
|
|
4 |
|
|
|
5 |
sidebarPanel( |
|
|
6 |
# Sol panelde nelerin yer alacağı bu bölümde belirleniyor. |
|
|
7 |
# Tab panellerden veya sol panel içindeki çeşitli radyo butonlar |
|
|
8 |
# checkbox'lar gibi seçimlerden sonra panelde nelerin değişeceği de |
|
|
9 |
# ayrıca bir conditionalPanel() bloğu ile burada tanımlanabiliyor. |
|
|
10 |
|
|
|
11 |
conditionalPanel(condition="input.tabs1=='Introduction'", |
|
|
12 |
HTML('<p><img src="multi.png" width=400 height=400></p>'), |
|
|
13 |
tags$head(includeScript("google-analytics.js")) |
|
|
14 |
|
|
|
15 |
), |
|
|
16 |
|
|
|
17 |
conditionalPanel(condition="input.tabs1=='Data upload'", |
|
|
18 |
h4("Input data"), |
|
|
19 |
#radioButtons("dataInput", "", list("Load example data"=1, "Upload a file"=2, "Paste your data"=3), selected=1), |
|
|
20 |
radioButtons("dataInput", "", list("Load example data"=1, "Upload a file"=2), selected=1), |
|
|
21 |
|
|
|
22 |
selectizeInput("statusVar", "Name of the status variable", choices = NULL, multiple = FALSE), |
|
|
23 |
textInput("valueStatus", "Value of the status:", ""), |
|
|
24 |
HTML('<br>'), |
|
|
25 |
|
|
|
26 |
conditionalPanel(condition="input.dataInput=='1'", |
|
|
27 |
h5("Load example data:"), |
|
|
28 |
radioButtons("sampleData", "", list("Mayo data (n=312, p=4)"=1, "PBC data set (n=418, p=20)"=2), selected=1), |
|
|
29 |
HTML('<p>n: number of observations</p>'), |
|
|
30 |
HTML('<p>p: number of variables</p>') |
|
|
31 |
), |
|
|
32 |
|
|
|
33 |
conditionalPanel(condition="input.dataInput=='2'", |
|
|
34 |
h5("Upload a delimited text file (max. 10MB): "), |
|
|
35 |
#HTML('<i class="fa fa-beer fa-lg"></i>'), |
|
|
36 |
fileInput("upload", "", multiple = FALSE), |
|
|
37 |
radioButtons("fileSepDF", "Delimiter:", list("Comma"=1, "Tab"=2, "Semicolon"=3, "Space"=4),selected=2), |
|
|
38 |
|
|
|
39 |
conditionalPanel(condition="input.fileSepDF!='1'", |
|
|
40 |
checkboxInput(inputId = "decimal", label = "Use comma as decimal", value = FALSE) |
|
|
41 |
), |
|
|
42 |
|
|
|
43 |
HTML('<br>'), |
|
|
44 |
HTML('<p>You can upload your data as separated by comma, tab, semicolon or space.</p>'), |
|
|
45 |
HTML('<p><b>Note</b>: First row must be header.</p>') |
|
|
46 |
), |
|
|
47 |
|
|
|
48 |
conditionalPanel(condition="input.dataInput=='3'", |
|
|
49 |
h5("Paste or enter your data below:"), |
|
|
50 |
tags$textarea(id="myData", rows=10, cols=5, ""), |
|
|
51 |
actionButton('clearText_button','Clear data'), |
|
|
52 |
HTML('<br>'), |
|
|
53 |
HTML('<br>'), |
|
|
54 |
|
|
|
55 |
radioButtons("fileSepP", "Separator:", list("Comma"=1,"Tab"=2,"Semicolon"=3), selected=2), |
|
|
56 |
HTML('<p>You can paste or manually enter your data as separated by comma, tab or semicolon.</p>'), |
|
|
57 |
HTML('<p>Note: First row must be header.</p>') |
|
|
58 |
) |
|
|
59 |
), |
|
|
60 |
|
|
|
61 |
conditionalPanel(condition="input.tabs1=='ROC curve'", |
|
|
62 |
|
|
|
63 |
selectizeInput("markerInput", "Select markers (*)", choices = NULL, multiple = TRUE), |
|
|
64 |
checkboxInput("lowhigh", "Higher values indicate disease", TRUE), |
|
|
65 |
|
|
|
66 |
HTML('<br>'), |
|
|
67 |
|
|
|
68 |
conditionalPanel(condition = "input.navbarROCcurve == 'Multiple Comparisons'", |
|
|
69 |
selectInput(inputId = "MultipleCompMethod", label = "Multiple Comparison Method", selected = "bonferroni", |
|
|
70 |
choices = c("Bonferroni" = "bonferroni", "False discovery rate" = "fdr", "None" = "none") |
|
|
71 |
), |
|
|
72 |
HTML('<br>') |
|
|
73 |
), |
|
|
74 |
|
|
|
75 |
|
|
|
76 |
helpText("(*) Multiple markers are allowed."), |
|
|
77 |
HTML('<br>'), |
|
|
78 |
|
|
|
79 |
|
|
|
80 |
checkboxInput(inputId = "advanced", label = "Advanced options", value = FALSE), |
|
|
81 |
|
|
|
82 |
conditionalPanel(condition = "input.advanced", |
|
|
83 |
radioButtons(inputId = "StdErr", label = "1. Select a method for SE estimation", |
|
|
84 |
choices = list("Mann-Whitney"="MW", "DeLong(1988)[+]"="DeLong", "Under Null Hyp."="Null", "Binomial"="Binomial"), selected = "DeLong"), |
|
|
85 |
|
|
|
86 |
radioButtons(inputId = "ConfInt", label = "2. Select a method for Conf. Interval", |
|
|
87 |
choices = list("Mann-Whitney"="MW", "DeLong(1988)[+]"="DeLong", "Under Null Hyp."="Null", "Binomial Exact"="Exact"), selected = "DeLong"), |
|
|
88 |
numericInput(inputId = "alpha", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), |
|
|
89 |
HTML('<br>'), |
|
|
90 |
HTML('<br>'), |
|
|
91 |
helpText("[+]: Default options."), |
|
|
92 |
HTML('<br>') |
|
|
93 |
), |
|
|
94 |
|
|
|
95 |
checkboxInput(inputId = "ROCplotOpts", label = "Plot options", value = FALSE), |
|
|
96 |
|
|
|
97 |
|
|
|
98 |
|
|
|
99 |
conditionalPanel(condition = "input.ROCplotOpts", |
|
|
100 |
fluidRow(column(5,sliderInput("myheight", "Plot height:", value=400, min=200, max=1200)), |
|
|
101 |
column(2), |
|
|
102 |
column(5,sliderInput("mywidth", "Plot width:", value=400, min=200, max=1200 )) |
|
|
103 |
), |
|
|
104 |
|
|
|
105 |
HTML('<br>'), |
|
|
106 |
|
|
|
107 |
fluidRow( |
|
|
108 |
column(10, selectizeInput("fontfamilyRC", "Font family", |
|
|
109 |
choices = c("Times New Roman" = "serif", "Arial" = "sans", |
|
|
110 |
"Corier New" = "mono"), selected = "sans")) |
|
|
111 |
), |
|
|
112 |
|
|
|
113 |
HTML('<br>'), |
|
|
114 |
|
|
|
115 |
selectizeInput("subGrpsRC", "", choices = c("Edit x-axis" = "xAxis", "Edit y-axis" = "yAxis", |
|
|
116 |
"Other options" = "others"), selected = "xAxis"), |
|
|
117 |
|
|
|
118 |
conditionalPanel(condition = "input.subGrpsRC == 'others'", |
|
|
119 |
fluidRow( |
|
|
120 |
column(5, textInput("mainRC", "Graph title", "ROC Curve")), |
|
|
121 |
column(1), |
|
|
122 |
column(5, selectizeInput("font.mainRC", "Title font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
123 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
124 |
selected = "2")) |
|
|
125 |
), |
|
|
126 |
|
|
|
127 |
fluidRow( |
|
|
128 |
column(5, textInput("col.mainRC", "Title color", "black")), |
|
|
129 |
column(1), |
|
|
130 |
column(5, numericInput("cex.mainRC", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) |
|
|
131 |
), |
|
|
132 |
|
|
|
133 |
fluidRow( |
|
|
134 |
column(5, textInput("ROCcolRC", "ROC line color", "black,red")), |
|
|
135 |
column(1), |
|
|
136 |
column(5, selectizeInput("ROCltyRC", "ROC line type", |
|
|
137 |
choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", |
|
|
138 |
"\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", |
|
|
139 |
"\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", |
|
|
140 |
"\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", |
|
|
141 |
"\U2500 \U2500 \U2500 \U2500 \U2500" = "5", |
|
|
142 |
"\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), |
|
|
143 |
selected = "1")) |
|
|
144 |
), |
|
|
145 |
|
|
|
146 |
textInput(inputId = "legend.namesRC", label = "Legend names", value = "") |
|
|
147 |
), |
|
|
148 |
|
|
|
149 |
conditionalPanel(condition = "input.subGrpsRC == 'xAxis'", |
|
|
150 |
h5('X-axis options:'), |
|
|
151 |
|
|
|
152 |
## X axis label options |
|
|
153 |
fluidRow( |
|
|
154 |
column(5, textInput("xlabRC", "Axis label", "1-Specificity")), |
|
|
155 |
column(1), |
|
|
156 |
column(5, selectizeInput("xfont.labRC", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
157 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
158 |
selected = "1")) |
|
|
159 |
), |
|
|
160 |
|
|
|
161 |
fluidRow( |
|
|
162 |
column(5, textInput("xcol.labRC", "Label color", "black")), |
|
|
163 |
column(1), |
|
|
164 |
column(5, numericInput("xcex.labRC", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
165 |
), |
|
|
166 |
|
|
|
167 |
## X axis annotation options |
|
|
168 |
fluidRow( |
|
|
169 |
column(5, textInput("xcol.axisRC", "Annotation color", "black")), |
|
|
170 |
column(1), |
|
|
171 |
column(5, numericInput("xcex.axisRC", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
172 |
) |
|
|
173 |
|
|
|
174 |
#fluidRow( |
|
|
175 |
# column(5, textInput("xcol11", "Axis color", "black")), |
|
|
176 |
# column(1), |
|
|
177 |
# column(5, textInput("xcol.ticks11", "Tickmarks color", "black")) |
|
|
178 |
#), |
|
|
179 |
), |
|
|
180 |
|
|
|
181 |
conditionalPanel(condition = "input.subGrpsRC == 'yAxis'", |
|
|
182 |
h5('Y-axis options:'), |
|
|
183 |
|
|
|
184 |
## Y axis label options |
|
|
185 |
fluidRow( |
|
|
186 |
column(5, textInput("ylabRC", "Axis label", "Sensitivity")), |
|
|
187 |
column(1), |
|
|
188 |
column(5, selectizeInput("yfont.labRC", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
189 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
190 |
selected = "1")) |
|
|
191 |
), |
|
|
192 |
|
|
|
193 |
fluidRow( |
|
|
194 |
column(5, textInput("ycol.labRC", "Label color", "black")), |
|
|
195 |
column(1), |
|
|
196 |
column(5, numericInput("ycex.labRC", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
197 |
), |
|
|
198 |
|
|
|
199 |
## Y axis annotation options |
|
|
200 |
fluidRow( |
|
|
201 |
column(5, textInput("ycol.axisRC", "Annotation color", "black")), |
|
|
202 |
column(1), |
|
|
203 |
column(5, numericInput("ycex.axisRC", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
204 |
) |
|
|
205 |
) |
|
|
206 |
|
|
|
207 |
), |
|
|
208 |
|
|
|
209 |
conditionalPanel(condition = "input.navbarROCcurve == 'Partial AUC'", |
|
|
210 |
|
|
|
211 |
checkboxInput(inputId = "partialAUC", label = "Partial AUC", value = TRUE), |
|
|
212 |
|
|
|
213 |
conditionalPanel(condition = "input.partialAUC", |
|
|
214 |
|
|
|
215 |
fluidRow( |
|
|
216 |
column(5, numericInput("pointA", "Value 1", min=0, max=1, value = 0.5, step = 0.1)), |
|
|
217 |
column(1), |
|
|
218 |
column(5, numericInput("pointB", "Value 2", min=0, max=1, value = 1, step = 0.1)) |
|
|
219 |
), |
|
|
220 |
|
|
|
221 |
selectizeInput("sensSpec", "Select a measure", choices = c("Sensitivity", "Specificity"), multiple = FALSE, selected = "Sensitivity") |
|
|
222 |
|
|
|
223 |
) |
|
|
224 |
) |
|
|
225 |
|
|
|
226 |
), |
|
|
227 |
|
|
|
228 |
|
|
|
229 |
|
|
|
230 |
|
|
|
231 |
|
|
|
232 |
conditionalPanel(condition="input.tabs1=='Cut points'", |
|
|
233 |
h5("1. Select a marker"), |
|
|
234 |
selectizeInput("cutoffMarker", "", choices = NULL, multiple = FALSE), |
|
|
235 |
HTML('<br>'), |
|
|
236 |
h5("2. Select a method for optimal cut-off (*)"), |
|
|
237 |
selectizeInput("cutOffMethods", "", choices = c("Youden", "CB", "MCT", "MinValueSp", "MinValueSe", "ValueSe", "ValueSp", "MinValueSpSe", |
|
|
238 |
"MaxSp", "MaxSe", "MaxSpSe", "MaxProdSpSe", "ROC01", "SpEqualSe", "MaxEfficiency", |
|
|
239 |
"Minimax", "MaxDOR", "MaxKappa", "MinValueNPV", "MinValuePPV", "ValueNPV", "ValuePPV", |
|
|
240 |
"MinValueNPVPPV", "PROC01", "NPVEqualPPV", "MaxNPVPPV", "MaxSumNPVPPV", "MaxProdNPVPPV", |
|
|
241 |
"ValueDLR.Negative", "ValueDLR.Positive", "MinPvalue", "ObservedPrev", "MeanPrev", |
|
|
242 |
"PrevalenceMatching"), multiple = FALSE), |
|
|
243 |
#HTML('<br>'), |
|
|
244 |
|
|
|
245 |
conditionalPanel(condition="input.cutOffMethods=='Youden'", |
|
|
246 |
HTML('<p><b>Youden:</b> Youden index</p>'), |
|
|
247 |
HTML('<br>'), |
|
|
248 |
numericInput(inputId = "CFP_Youden", label = "Cost of a False Positive", value = 1, min = 0, max = 9999999), |
|
|
249 |
numericInput(inputId = "CFN_Youden", label = "Cost of a False Negative", value = 1, min = 0, max = 9999999), |
|
|
250 |
checkboxInput(inputId = "generalized_Youden", label = "Generalized Youden Index", value = FALSE), |
|
|
251 |
checkboxInput(inputId = "costs_benefits_Youden", label = "Cost-benefit based Youden Index", value = FALSE) |
|
|
252 |
), |
|
|
253 |
|
|
|
254 |
conditionalPanel(condition="input.cutOffMethods=='CB'", |
|
|
255 |
HTML('<p><b>CB:</b> cost-benefit method</p>'), |
|
|
256 |
HTML('<br>'), |
|
|
257 |
numericInput(inputId = "costs_ratio", label = "Cost ratio", value = 1, min = 0, max = 99999999) |
|
|
258 |
), |
|
|
259 |
|
|
|
260 |
conditionalPanel(condition="input.cutOffMethods=='MCT'", |
|
|
261 |
HTML('<p><b>MCT:</b> minimizes misclassification cost term</p>'), |
|
|
262 |
HTML('<br>'), |
|
|
263 |
numericInput(inputId = "CFP_MCT", label = "Cost of a False Positive", value = 1, min = 0, max = 9999999), |
|
|
264 |
numericInput(inputId = "CFN_MCT", label = "Cost of a False Negative", value = 1, min = 0, max = 9999999) |
|
|
265 |
), |
|
|
266 |
|
|
|
267 |
conditionalPanel(condition="input.cutOffMethods=='MinValueSp'", |
|
|
268 |
HTML('<p><b>MinValueSp:</b> a minimum value set for specificity</p>'), |
|
|
269 |
HTML('<br>'), |
|
|
270 |
numericInput(inputId = "valueSp_MVSp", label = "Value of Specificity", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
271 |
), |
|
|
272 |
|
|
|
273 |
conditionalPanel(condition="input.cutOffMethods=='MinValueSe'", |
|
|
274 |
HTML('<p><b>MinValueSe:</b> a minimum value set for sensitivity</p>'), |
|
|
275 |
HTML('<br>'), |
|
|
276 |
numericInput(inputId = "valueSe_MVSe", label = "Value of Sensitivity", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
277 |
), |
|
|
278 |
|
|
|
279 |
conditionalPanel(condition="input.cutOffMethods=='ValueSe'", |
|
|
280 |
HTML('<p><b>ValueSe:</b> a value set for sensitivity</p>'), |
|
|
281 |
HTML('<br>'), |
|
|
282 |
numericInput(inputId = "valueSe_VSe", label = "Value of Sensitivity", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
283 |
), |
|
|
284 |
|
|
|
285 |
conditionalPanel(condition="input.cutOffMethods=='ValueSp'", |
|
|
286 |
HTML('<p><b>ValueSp:</b> a value set for specificity</p>'), |
|
|
287 |
HTML('<br>'), |
|
|
288 |
numericInput(inputId = "valueSp_VSp", label = "Value of Specificity", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
289 |
), |
|
|
290 |
|
|
|
291 |
conditionalPanel(condition="input.cutOffMethods=='MinValueSpSe'", |
|
|
292 |
HTML('<p><b>MinValueSpSe:</b> a minimum value set for specificity and sensitivity</p>'), |
|
|
293 |
HTML('<br>'), |
|
|
294 |
numericInput(inputId = "valueSe_MVSpSe", label = "Value of Sensitivity", value = 0.85, min = 0, max = 1, step = 0.01), |
|
|
295 |
numericInput(inputId = "valueSp_MVSpSe", label = "Value of Specificity", value = 0.85, min = 0, max = 1, step = 0.01), |
|
|
296 |
checkboxInput(inputId = "maxSp_MVSpSe", label = "Maximum specificity", value = TRUE) |
|
|
297 |
), |
|
|
298 |
|
|
|
299 |
conditionalPanel(condition="input.cutOffMethods=='MaxSp'", |
|
|
300 |
HTML('<p><b>MaxSp:</b> maximizes specificity</p>') |
|
|
301 |
), |
|
|
302 |
|
|
|
303 |
conditionalPanel(condition="input.cutOffMethods=='MaxSe'", |
|
|
304 |
HTML('<p><b>MaxSe:</b> maximizes sensitivity</p>') |
|
|
305 |
), |
|
|
306 |
|
|
|
307 |
conditionalPanel(condition="input.cutOffMethods=='MaxSpSe'", |
|
|
308 |
HTML('<p><b>MaxSpSe:</b> maximizes sensitivity and specificity simultaneously</p>') |
|
|
309 |
), |
|
|
310 |
|
|
|
311 |
conditionalPanel(condition="input.cutOffMethods=='MaxProdSpSe'", |
|
|
312 |
HTML('<p><b>MaxProdSpSe:</b> maximizes the product of sensitivity and specificity or accuracy area</p>') |
|
|
313 |
), |
|
|
314 |
|
|
|
315 |
conditionalPanel(condition="input.cutOffMethods=='ROC01'", |
|
|
316 |
HTML('<p><b>ROC01:</b> minimizes distance between ROC plot and point (0,1)</p>') |
|
|
317 |
), |
|
|
318 |
|
|
|
319 |
conditionalPanel(condition="input.cutOffMethods=='SpEqualSe'", |
|
|
320 |
HTML('<p><b>SpEqualSe:</b> sensitivity = specificity</p>') |
|
|
321 |
), |
|
|
322 |
|
|
|
323 |
conditionalPanel(condition="input.cutOffMethods=='MaxEfficiency'", |
|
|
324 |
HTML('<p><b>MaxEfficiency:</b> maximizes efficiency or accuracy, similar to minimize error rate </p>'), |
|
|
325 |
HTML('<br>'), |
|
|
326 |
checkboxInput(inputId = "costs_benefits_Efficiency", label = "Cost-benefit based Efficiency", value = FALSE), |
|
|
327 |
checkboxInput(inputId = "standard_deviation_accuracy", label = "Standart deviation accuracy", value = FALSE) |
|
|
328 |
), |
|
|
329 |
|
|
|
330 |
conditionalPanel(condition="input.cutOffMethods=='Minimax'", |
|
|
331 |
HTML('<p><b>Minimax:</b> minimizes the most frequent error</p>') |
|
|
332 |
), |
|
|
333 |
|
|
|
334 |
conditionalPanel(condition="input.cutOffMethods=='MaxDOR'", |
|
|
335 |
HTML('<p><b>MaxDOR:</b> maximizes diagnostic odds ratio</p>') |
|
|
336 |
), |
|
|
337 |
|
|
|
338 |
conditionalPanel(condition="input.cutOffMethods=='MaxKappa'", |
|
|
339 |
HTML('<p><b>MaxKappa:</b> maximizes kappa index</p>'), |
|
|
340 |
HTML('<br>'), |
|
|
341 |
numericInput(inputId = "CFP_MK", label = "Cost of a False Positive", value = 1, min = 0, max = 9999999), |
|
|
342 |
numericInput(inputId = "CFN_MK", label = "Cost of a False Negative", value = 1, min = 0, max = 9999999), |
|
|
343 |
checkboxInput(inputId = "weighted_Kappa", label = "Weighted Kappa", value = FALSE) |
|
|
344 |
), |
|
|
345 |
|
|
|
346 |
conditionalPanel(condition="input.cutOffMethods=='MinValueNPV'", |
|
|
347 |
HTML('<p><b>MinValueNPV:</b> a minimum value set for negative predictive value</p>'), |
|
|
348 |
HTML('<br>'), |
|
|
349 |
numericInput(inputId = "valueNPV_MVNPV", label = "Value of NPV", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
350 |
), |
|
|
351 |
|
|
|
352 |
conditionalPanel(condition="input.cutOffMethods=='MinValuePPV'", |
|
|
353 |
HTML('<p><b>MinValuePPV:</b> a minimum value set for positive predictive value</p>'), |
|
|
354 |
HTML('<br>'), |
|
|
355 |
numericInput(inputId = "valuePPV_MVPPV", label = "Value of PPV", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
356 |
), |
|
|
357 |
|
|
|
358 |
conditionalPanel(condition="input.cutOffMethods=='ValueNPV'", |
|
|
359 |
HTML('<p><b>ValueNPV:</b> a value set for negative predictive value</p>'), |
|
|
360 |
HTML('<br>'), |
|
|
361 |
numericInput(inputId = "valueNPV_VNPV", label = "Value of NPV", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
362 |
), |
|
|
363 |
|
|
|
364 |
conditionalPanel(condition="input.cutOffMethods=='ValuePPV'", |
|
|
365 |
HTML('<p><b>ValuePPV:</b> a value set for positive predictive value</p>'), |
|
|
366 |
HTML('<br>'), |
|
|
367 |
numericInput(inputId = "valuePPV_VPPV", label = "Value of PPV", value = 0.85, min = 0, max = 1, step = 0.01) |
|
|
368 |
), |
|
|
369 |
|
|
|
370 |
conditionalPanel(condition="input.cutOffMethods=='MinValueNPVPPV'", |
|
|
371 |
HTML('<p><b>MinValueNPVPPV:</b> a minimum value set for predictive values</p>'), |
|
|
372 |
HTML('<br>'), |
|
|
373 |
numericInput(inputId = "valuePPV_MVNPVPPV", label = "Value of PPV", value = 0.85, min = 0, max = 1, step = 0.01), |
|
|
374 |
numericInput(inputId = "valueNPV_MVNPVPPV", label = "Value of NPV", value = 0.85, min = 0, max = 1, step = 0.01), |
|
|
375 |
checkboxInput(inputId = "maxNPV_MVNPVPPV", label = "Maximum NPV", value = TRUE) |
|
|
376 |
), |
|
|
377 |
|
|
|
378 |
conditionalPanel(condition="input.cutOffMethods=='PROC01'", |
|
|
379 |
HTML('<p><b>PROC01:</b> minimizes distance between PROC plot and point (0,1)</p>') |
|
|
380 |
), |
|
|
381 |
|
|
|
382 |
conditionalPanel(condition="input.cutOffMethods=='NPVEqualPPV'", |
|
|
383 |
HTML('<p><b>NPVEqualPPV:</b> negative predictive value = positive predictive value</p>') |
|
|
384 |
), |
|
|
385 |
|
|
|
386 |
conditionalPanel(condition="input.cutOffMethods=='MaxNPVPPV'", |
|
|
387 |
HTML('<p><b>MaxNPVPPV:</b> maximizes positive predictive value and negative predictive value simultaneously</p>') |
|
|
388 |
), |
|
|
389 |
|
|
|
390 |
conditionalPanel(condition="input.cutOffMethods=='MaxSumNPVPPV'", |
|
|
391 |
HTML('<p><b>MaxSumNPVPPV:</b> maximizes the sum of the predictive values</p>') |
|
|
392 |
), |
|
|
393 |
|
|
|
394 |
conditionalPanel(condition="input.cutOffMethods=='MaxProdNPVPPV'", |
|
|
395 |
HTML('<p><b>MaxProdNPVPPV:</b> maximizes the product of predictive values</p>') |
|
|
396 |
), |
|
|
397 |
|
|
|
398 |
conditionalPanel(condition="input.cutOffMethods=='ValueDLR.Negative'", |
|
|
399 |
HTML('<p><b>ValueDLR.Negative:</b> a value set for negative diagnostic likelihood ratio</p>'), |
|
|
400 |
HTML('<br>'), |
|
|
401 |
numericInput(inputId = "valueDLR_Negative", label = "Value of Negative DLR", value = 0.5, min = 0, max = 999999) |
|
|
402 |
), |
|
|
403 |
|
|
|
404 |
conditionalPanel(condition="input.cutOffMethods=='ValueDLR.Positive'", |
|
|
405 |
HTML('<p><b>ValueDLR.Positive:</b> a value set for positive diagnostic likelihood ratio</p>'), |
|
|
406 |
HTML('<br>'), |
|
|
407 |
numericInput(inputId = "valueDLR_Positive", label = "Value of Positive DLR", value = 2, min = 0, max = 999999) |
|
|
408 |
), |
|
|
409 |
|
|
|
410 |
conditionalPanel(condition="input.cutOffMethods=='MinPvalue'", |
|
|
411 |
HTML('<p><b>MinPvalue:</b> minimizes p-value associated with the statistical Chi-squared test which measures the association between the marker and the binary result obtained on using the cutpoint</p>'), |
|
|
412 |
HTML('<br>'), |
|
|
413 |
selectInput(inputId = "adjusted_pvalue", label = "Adjustment method for p-value", |
|
|
414 |
choices = c("Miller and Siegmund" = "PADJMS", "Altman_5" = "PALT5", "Altman_10" = "PALT10"), |
|
|
415 |
multiple = FALSE, selected = "PADJMS") |
|
|
416 |
), |
|
|
417 |
|
|
|
418 |
conditionalPanel(condition="input.cutOffMethods=='ObservedPrev'", |
|
|
419 |
HTML('<p><b>ObservedPrev:</b> the closest value to observed prevalence</p>') |
|
|
420 |
), |
|
|
421 |
|
|
|
422 |
conditionalPanel(condition="input.cutOffMethods=='MeanPrev'", |
|
|
423 |
HTML('<p><b>MeanPrev:</b> the closest value to the mean of the diagnostic test values</p>') |
|
|
424 |
), |
|
|
425 |
|
|
|
426 |
conditionalPanel(condition="input.cutOffMethods=='PrevalenceMatching'", |
|
|
427 |
HTML('<p><b>PrevalenceMatching:</b> the value for which predicted prevalence is practically equal to observed prevalence</p>') |
|
|
428 |
), |
|
|
429 |
|
|
|
430 |
HTML('<br>'), |
|
|
431 |
HTML('<p>(*) See <a href="http://cran.r-project.org/web/packages/OptimalCutpoints/index.html" target="_blank"> OptimalCutpoints</a> package from R</p>'), |
|
|
432 |
HTML('<br>'), |
|
|
433 |
|
|
|
434 |
checkboxInput("showPlots", "Include plots.", FALSE), |
|
|
435 |
|
|
|
436 |
conditionalPanel(condition="input.showPlots", |
|
|
437 |
fluidRow( |
|
|
438 |
column(1), |
|
|
439 |
column(5, sliderInput("myheightCutoff", "Plot height:", value=600, min=400, max=1400)), |
|
|
440 |
column(1), |
|
|
441 |
column(5, sliderInput("mywidthCutoff", "Plot width:", value=800, min=400, max=1400 )) |
|
|
442 |
), |
|
|
443 |
|
|
|
444 |
HTML('<br>'), |
|
|
445 |
checkboxInput("cutoffPlotsOpts", "More plot options (See Manual)", FALSE), |
|
|
446 |
HTML('<br>') |
|
|
447 |
), |
|
|
448 |
|
|
|
449 |
conditionalPanel(condition="input.cutoffPlotsOpts", |
|
|
450 |
fluidRow( |
|
|
451 |
column(10, selectizeInput("fontfamily", "Font family", |
|
|
452 |
choices = c("Times New Roman" = "serif", "Arial" = "sans", |
|
|
453 |
"Corier New" = "mono"), selected = "sans")) |
|
|
454 |
), |
|
|
455 |
|
|
|
456 |
radioButtons("selectedGraph", "", list("Top Left \U2003 \U2003" = 1, "Top Right \U2003 \U2003" = 2, |
|
|
457 |
"Bottom Left \U2002\U2008" = 3, "Bottom Right" = 4), selected=1), |
|
|
458 |
|
|
|
459 |
HTML('<br>'), |
|
|
460 |
|
|
|
461 |
selectizeInput("subGrps", "", choices = NULL, selected = NULL), |
|
|
462 |
|
|
|
463 |
## First graph options (11) |
|
|
464 |
conditionalPanel(condition = "input.selectedGraph == '1'", |
|
|
465 |
|
|
|
466 |
conditionalPanel(condition = "input.subGrps == 'others'", |
|
|
467 |
fluidRow( |
|
|
468 |
column(5, textInput("main11", "Graph title", "ROC Curve")), |
|
|
469 |
column(1), |
|
|
470 |
column(5, selectizeInput("font.main11", "Title font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
471 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
472 |
selected = "2")) |
|
|
473 |
), |
|
|
474 |
|
|
|
475 |
fluidRow( |
|
|
476 |
column(5, textInput("col.main11", "Title color", "black")), |
|
|
477 |
column(1), |
|
|
478 |
column(5, numericInput("cex.main11", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) |
|
|
479 |
), |
|
|
480 |
|
|
|
481 |
fluidRow( |
|
|
482 |
column(5, textInput("ROCcol11", "ROC line color", "black")), |
|
|
483 |
column(1), |
|
|
484 |
column(5, selectizeInput("ROClty11", "ROC line type", |
|
|
485 |
choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", |
|
|
486 |
"\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", |
|
|
487 |
"\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", |
|
|
488 |
"\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", |
|
|
489 |
"\U2500 \U2500 \U2500 \U2500 \U2500" = "5", |
|
|
490 |
"\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), |
|
|
491 |
selected = "1")) |
|
|
492 |
) |
|
|
493 |
), |
|
|
494 |
|
|
|
495 |
conditionalPanel(condition = "input.subGrps == 'xAxis'", |
|
|
496 |
h5('X-axis options:'), |
|
|
497 |
|
|
|
498 |
## X axis label options |
|
|
499 |
fluidRow( |
|
|
500 |
column(5, textInput("xlab11", "Axis label", "1-Specificity")), |
|
|
501 |
column(1), |
|
|
502 |
column(5, selectizeInput("xfont.lab11", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
503 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
504 |
selected = "1")) |
|
|
505 |
), |
|
|
506 |
|
|
|
507 |
fluidRow( |
|
|
508 |
column(5, textInput("xcol.lab11", "Label color", "black")), |
|
|
509 |
column(1), |
|
|
510 |
column(5, numericInput("xcex.lab11", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
511 |
), |
|
|
512 |
|
|
|
513 |
## X axis annotation options |
|
|
514 |
fluidRow( |
|
|
515 |
column(5, textInput("xcol.axis11", "Annotation color", "black")), |
|
|
516 |
column(1), |
|
|
517 |
column(5, numericInput("xcex.axis11", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
518 |
) |
|
|
519 |
|
|
|
520 |
#fluidRow( |
|
|
521 |
# column(5, textInput("xcol11", "Axis color", "black")), |
|
|
522 |
# column(1), |
|
|
523 |
# column(5, textInput("xcol.ticks11", "Tickmarks color", "black")) |
|
|
524 |
#), |
|
|
525 |
), |
|
|
526 |
|
|
|
527 |
conditionalPanel(condition = "input.subGrps == 'yAxis'", |
|
|
528 |
h5('Y-axis options:'), |
|
|
529 |
|
|
|
530 |
## Y axis label options |
|
|
531 |
fluidRow( |
|
|
532 |
column(5, textInput("ylab11", "Axis label", "Sensitivity")), |
|
|
533 |
column(1), |
|
|
534 |
column(5, selectizeInput("yfont.lab11", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
535 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
536 |
selected = "1")) |
|
|
537 |
), |
|
|
538 |
|
|
|
539 |
fluidRow( |
|
|
540 |
column(5, textInput("ycol.lab11", "Label color", "black")), |
|
|
541 |
column(1), |
|
|
542 |
column(5, numericInput("ycex.lab11", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
543 |
), |
|
|
544 |
|
|
|
545 |
## Y axis annotation options |
|
|
546 |
fluidRow( |
|
|
547 |
column(5, textInput("ycol.axis11", "Annotation color", "black")), |
|
|
548 |
column(1), |
|
|
549 |
column(5, numericInput("ycex.axis11", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
550 |
) |
|
|
551 |
) |
|
|
552 |
), |
|
|
553 |
|
|
|
554 |
## Second graph options (12) |
|
|
555 |
conditionalPanel(condition = "input.selectedGraph == '2'", |
|
|
556 |
|
|
|
557 |
conditionalPanel(condition = "input.subGrps == 'others'", |
|
|
558 |
fluidRow( |
|
|
559 |
column(5, textInput("main12", "Graph title", "Sens. & Spec. Curve")), |
|
|
560 |
column(1), |
|
|
561 |
column(5, selectizeInput("font.main12", "Title font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
562 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
563 |
selected = "2")) |
|
|
564 |
), |
|
|
565 |
|
|
|
566 |
fluidRow( |
|
|
567 |
column(5, textInput("col.main12", "Title color", "black")), |
|
|
568 |
column(1), |
|
|
569 |
column(5, numericInput("cex.main12", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) |
|
|
570 |
), |
|
|
571 |
|
|
|
572 |
fluidRow( |
|
|
573 |
column(5, textInput("specCol", "Spec. line color", "blue")), |
|
|
574 |
column(1), |
|
|
575 |
column(5, selectizeInput("specType", "Spec. line type", |
|
|
576 |
choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", |
|
|
577 |
"\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", |
|
|
578 |
"\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", |
|
|
579 |
"\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", |
|
|
580 |
"\U2500 \U2500 \U2500 \U2500 \U2500" = "5", |
|
|
581 |
"\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), |
|
|
582 |
selected = "1")) |
|
|
583 |
), |
|
|
584 |
|
|
|
585 |
fluidRow( |
|
|
586 |
column(5, textInput("sensCol", "Sens. line color", "red")), |
|
|
587 |
column(1), |
|
|
588 |
column(5, selectizeInput("sensType", "Sens. line type", |
|
|
589 |
choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", |
|
|
590 |
"\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", |
|
|
591 |
"\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", |
|
|
592 |
"\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", |
|
|
593 |
"\U2500 \U2500 \U2500 \U2500 \U2500" = "5", |
|
|
594 |
"\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), |
|
|
595 |
selected = "1")) |
|
|
596 |
) |
|
|
597 |
), |
|
|
598 |
|
|
|
599 |
conditionalPanel(condition = "input.subGrps == 'Legend'", |
|
|
600 |
fluidRow( |
|
|
601 |
column(5, selectizeInput("legendPos12", "Position", choices = c("Top right" = "topright", "Top left" = "topleft", "Bottom right" = "bottomright", "Bottom left" = "bottomleft", "xy coord." = "xy"), |
|
|
602 |
selected = "topright")), |
|
|
603 |
column(1), |
|
|
604 |
column(2, |
|
|
605 |
conditionalPanel(condition = "input.legendPos12 == 'xy'", |
|
|
606 |
numericInput("legendXpos12", "x", value = 0, step = 0.1) |
|
|
607 |
) |
|
|
608 |
), |
|
|
609 |
column(1), |
|
|
610 |
column(2, |
|
|
611 |
conditionalPanel(condition = "input.legendPos12 == 'xy'", |
|
|
612 |
numericInput("legendYpos12", "y", value = 0, step = 0.02) |
|
|
613 |
) |
|
|
614 |
) |
|
|
615 |
), |
|
|
616 |
|
|
|
617 |
fluidRow( |
|
|
618 |
column(7, textInput("legendNames12", "Leg. labels (comma sep.)", "Sens.,Spec.")), |
|
|
619 |
column(1), |
|
|
620 |
column(3, numericInput("cex.legend12", "Leg. size", min = 0.5, max = 5, step = 0.1, value = 1)) |
|
|
621 |
), |
|
|
622 |
|
|
|
623 |
fluidRow( |
|
|
624 |
column(5, textInput("legendTitle12", "Title", "")), |
|
|
625 |
column(1), |
|
|
626 |
column(5, textInput("col.legendTitle12", "Title color", "black")) |
|
|
627 |
), |
|
|
628 |
|
|
|
629 |
checkboxInput("borderless12", label = "Remove borders.", value = FALSE) |
|
|
630 |
), |
|
|
631 |
|
|
|
632 |
conditionalPanel(condition = "input.subGrps == 'xAxis'", |
|
|
633 |
h5('X-axis options:'), |
|
|
634 |
|
|
|
635 |
## X axis label options |
|
|
636 |
fluidRow( |
|
|
637 |
column(5, textInput("xlab12", "Axis label", "Marker Name")), |
|
|
638 |
column(1), |
|
|
639 |
column(5, selectizeInput("xfont.lab12", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
640 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
641 |
selected = "1")) |
|
|
642 |
), |
|
|
643 |
|
|
|
644 |
fluidRow( |
|
|
645 |
column(5, textInput("xcol.lab12", "Label color", "black")), |
|
|
646 |
column(1), |
|
|
647 |
column(5, numericInput("xcex.lab12", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
648 |
), |
|
|
649 |
|
|
|
650 |
## X axis annotation options |
|
|
651 |
fluidRow( |
|
|
652 |
column(5, textInput("xcol.axis12", "Annotation color", "black")), |
|
|
653 |
column(1), |
|
|
654 |
column(5, numericInput("xcex.axis12", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
655 |
) |
|
|
656 |
), |
|
|
657 |
|
|
|
658 |
conditionalPanel(condition = "input.subGrps == 'yAxis'", |
|
|
659 |
h5('Y-axis options:'), |
|
|
660 |
|
|
|
661 |
## Y axis label options |
|
|
662 |
fluidRow( |
|
|
663 |
column(5, textInput("ylab12", "Axis label", "Value")), |
|
|
664 |
column(1), |
|
|
665 |
column(5, selectizeInput("yfont.lab12", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
666 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
667 |
selected = "1")) |
|
|
668 |
), |
|
|
669 |
|
|
|
670 |
fluidRow( |
|
|
671 |
column(5, textInput("ycol.lab12", "Label color", "black")), |
|
|
672 |
column(1), |
|
|
673 |
column(5, numericInput("ycex.lab12", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
674 |
), |
|
|
675 |
|
|
|
676 |
## Y axis annotation options |
|
|
677 |
fluidRow( |
|
|
678 |
column(5, textInput("ycol.axis12", "Annotation color", "black")), |
|
|
679 |
column(1), |
|
|
680 |
column(5, numericInput("ycex.axis12", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
681 |
) |
|
|
682 |
) |
|
|
683 |
), |
|
|
684 |
|
|
|
685 |
## Third graph options (21) |
|
|
686 |
conditionalPanel(condition = "input.selectedGraph == '3'", |
|
|
687 |
|
|
|
688 |
conditionalPanel(condition = "input.subGrps == 'others'", |
|
|
689 |
fluidRow( |
|
|
690 |
column(5, textInput("main21", "Graph title", "Distribution Graph")), |
|
|
691 |
column(1), |
|
|
692 |
column(5, selectizeInput("font.main21", "Title font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
693 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
694 |
selected = "2")) |
|
|
695 |
), |
|
|
696 |
|
|
|
697 |
fluidRow( |
|
|
698 |
column(5, textInput("col.main21", "Title color", "black")), |
|
|
699 |
column(1), |
|
|
700 |
column(5, numericInput("cex.main21", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) |
|
|
701 |
), |
|
|
702 |
|
|
|
703 |
fluidRow( |
|
|
704 |
column(6, textInput("lineColD", "Line color (Diseased)", "red")), |
|
|
705 |
column(1), |
|
|
706 |
column(5, selectizeInput("lineTypeD", "Line type", |
|
|
707 |
choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", |
|
|
708 |
"\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", |
|
|
709 |
"\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", |
|
|
710 |
"\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", |
|
|
711 |
"\U2500 \U2500 \U2500 \U2500 \U2500" = "5", |
|
|
712 |
"\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), |
|
|
713 |
selected = "1")) |
|
|
714 |
), |
|
|
715 |
|
|
|
716 |
fluidRow( |
|
|
717 |
column(6, textInput("lineColH", "Line color (Healthy)", "blue")), |
|
|
718 |
column(1), |
|
|
719 |
column(5, selectizeInput("lineTypeH", "Line type", |
|
|
720 |
choices = c("\U2500\U2500\U2500\U2500\U2500\U2500\U2500" = "1", |
|
|
721 |
"\U2574 \U2574 \U2574 \U2574 \U2574 \U2574" = "2", |
|
|
722 |
"\U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7 \U00B7" = "3", |
|
|
723 |
"\U2574 \U00B7 \U2574 \U00B7 \U2574 \U00B7 \U2574" = "4", |
|
|
724 |
"\U2500 \U2500 \U2500 \U2500 \U2500" = "5", |
|
|
725 |
"\U2500 \U2574 \U2500 \U2574 \U2500 \U2574" = "6"), |
|
|
726 |
selected = "1")) |
|
|
727 |
) |
|
|
728 |
), |
|
|
729 |
|
|
|
730 |
conditionalPanel(condition = "input.subGrps == 'Legend'", |
|
|
731 |
fluidRow( |
|
|
732 |
column(5, selectizeInput("legendPos21", "Position", choices = c("Top right" = "topright", "Top left" = "topleft", "Bottom right" = "bottomright", "Bottom left" = "bottomleft", "xy coord." = "xy"), |
|
|
733 |
selected = "topright")), |
|
|
734 |
column(1), |
|
|
735 |
column(2, |
|
|
736 |
conditionalPanel(condition = "input.legendPos21 == 'xy'", |
|
|
737 |
numericInput("legendXpos21", "x", value = 0, step = 0.1) |
|
|
738 |
) |
|
|
739 |
), |
|
|
740 |
column(1), |
|
|
741 |
column(2, |
|
|
742 |
conditionalPanel(condition = "input.legendPos21 == 'xy'", |
|
|
743 |
numericInput("legendYpos21", "y", value = 0, step = 0.1) |
|
|
744 |
) |
|
|
745 |
) |
|
|
746 |
), |
|
|
747 |
|
|
|
748 |
fluidRow( |
|
|
749 |
column(7, textInput("legendNames21", "Leg. labels (comma sep.)", "Diseased,Healthy")), |
|
|
750 |
column(1), |
|
|
751 |
column(3, numericInput("cex.legend21", "Leg. Size", min = 0.5, max = 5, step = 0.1, value = 1)) |
|
|
752 |
), |
|
|
753 |
|
|
|
754 |
fluidRow( |
|
|
755 |
column(5, textInput("legendTitle21", "Title", "")), |
|
|
756 |
column(1), |
|
|
757 |
column(5, textInput("col.legendTitle21", "Title color", "black")) |
|
|
758 |
), |
|
|
759 |
|
|
|
760 |
checkboxInput("borderless21", label = "Remove borders.", value = FALSE) |
|
|
761 |
), |
|
|
762 |
|
|
|
763 |
conditionalPanel(condition = "input.subGrps == 'xAxis'", |
|
|
764 |
h5('X-axis options:'), |
|
|
765 |
|
|
|
766 |
## X axis label options |
|
|
767 |
fluidRow( |
|
|
768 |
column(5, textInput("xlab21", "Axis label", "Marker Name")), |
|
|
769 |
column(1), |
|
|
770 |
column(5, selectizeInput("xfont.lab21", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
771 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
772 |
selected = "1")) |
|
|
773 |
), |
|
|
774 |
|
|
|
775 |
fluidRow( |
|
|
776 |
column(5, textInput("xcol.lab21", "Label color", "black")), |
|
|
777 |
column(1), |
|
|
778 |
column(5, numericInput("xcex.lab21", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
779 |
), |
|
|
780 |
|
|
|
781 |
## X axis annotation options |
|
|
782 |
fluidRow( |
|
|
783 |
column(5, textInput("xcol.axis21", "Annotation color", "black")), |
|
|
784 |
column(1), |
|
|
785 |
column(5, numericInput("xcex.axis21", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
786 |
) |
|
|
787 |
), |
|
|
788 |
|
|
|
789 |
conditionalPanel(condition = "input.subGrps == 'yAxis'", |
|
|
790 |
h5('Y-axis options:'), |
|
|
791 |
|
|
|
792 |
## Y axis label options |
|
|
793 |
fluidRow( |
|
|
794 |
column(5, textInput("ylab21", "Axis label", "Density")), |
|
|
795 |
column(1), |
|
|
796 |
column(5, selectizeInput("yfont.lab21", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
797 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
798 |
selected = "1")) |
|
|
799 |
), |
|
|
800 |
|
|
|
801 |
fluidRow( |
|
|
802 |
column(5, textInput("ycol.lab21", "Label color", "black")), |
|
|
803 |
column(1), |
|
|
804 |
column(5, numericInput("ycex.lab21", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
805 |
), |
|
|
806 |
|
|
|
807 |
## Y axis annotation options |
|
|
808 |
fluidRow( |
|
|
809 |
column(5, textInput("ycol.axis21", "Annotation color", "black")), |
|
|
810 |
column(1), |
|
|
811 |
column(5, numericInput("ycex.axis21", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
812 |
) |
|
|
813 |
) |
|
|
814 |
), |
|
|
815 |
|
|
|
816 |
## Fourth graph options (22) |
|
|
817 |
conditionalPanel(condition = "input.selectedGraph == '4'", |
|
|
818 |
conditionalPanel(condition = "input.subGrps == 'others'", |
|
|
819 |
fluidRow( |
|
|
820 |
column(5, textInput("main22", "Graph title", "Distribution Graph")), |
|
|
821 |
column(1), |
|
|
822 |
column(5, selectizeInput("font.main22", "Title font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
823 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
824 |
selected = "2")) |
|
|
825 |
), |
|
|
826 |
|
|
|
827 |
fluidRow( |
|
|
828 |
column(5, textInput("col.main22", "Title color", "black")), |
|
|
829 |
column(1), |
|
|
830 |
column(5, numericInput("cex.main22", "Title size", min=0.1, max=5, value = 1.2, step = 0.1)) |
|
|
831 |
), |
|
|
832 |
|
|
|
833 |
numericInput("jitterAmount", "Amount of jittering", min=0.01, max = 0.5, value = 0.05, step = 0.01), |
|
|
834 |
|
|
|
835 |
## pch options for Healthy and Diseased subjects |
|
|
836 |
fluidRow( |
|
|
837 |
column(8, textInput("colPoints", "Point colors (comma sep.)", "black,black")), |
|
|
838 |
column(1), |
|
|
839 |
column(2, numericInput("pchPoints", "Type", min = 0, max = 25, step = 1, value = 1)) |
|
|
840 |
), |
|
|
841 |
|
|
|
842 |
fluidRow( |
|
|
843 |
column(3, numericInput("pchSize", "Point size", min = 0.1, max = 5, step = 0.1, value = 1)), |
|
|
844 |
column(1), |
|
|
845 |
column(7, |
|
|
846 |
conditionalPanel(condition = "input.pchPoints > 20", |
|
|
847 |
textInput("pchFill", "Fill points with color" ,"white,white") |
|
|
848 |
) |
|
|
849 |
) |
|
|
850 |
) |
|
|
851 |
), |
|
|
852 |
|
|
|
853 |
conditionalPanel(condition = "input.subGrps == 'xAxis'", |
|
|
854 |
h5('X-axis options:'), |
|
|
855 |
|
|
|
856 |
## X axis label options |
|
|
857 |
fluidRow( |
|
|
858 |
column(5, textInput("xlab22", "Axis label", "Disease Status")), |
|
|
859 |
column(1), |
|
|
860 |
column(5, selectizeInput("xfont.lab22", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
861 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
862 |
selected = "1")) |
|
|
863 |
), |
|
|
864 |
|
|
|
865 |
fluidRow( |
|
|
866 |
column(5, textInput("xcol.lab22", "Label color", "black")), |
|
|
867 |
column(1), |
|
|
868 |
column(5, numericInput("xcex.lab22", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
869 |
), |
|
|
870 |
|
|
|
871 |
## X axis annotation options |
|
|
872 |
fluidRow( |
|
|
873 |
column(12, textInput("xlabels22", "Annotation names (comma seperated)", "Healthy,Diseased")) |
|
|
874 |
), |
|
|
875 |
|
|
|
876 |
fluidRow( |
|
|
877 |
column(5, textInput("xcol.axis22", "Annotation color", "black")), |
|
|
878 |
column(1), |
|
|
879 |
column(5, numericInput("xcex.axis22", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
880 |
) |
|
|
881 |
), |
|
|
882 |
|
|
|
883 |
conditionalPanel(condition = "input.subGrps == 'yAxis'", |
|
|
884 |
h5('Y-axis options:'), |
|
|
885 |
|
|
|
886 |
## Y axis label options |
|
|
887 |
fluidRow( |
|
|
888 |
column(5, textInput("ylab22", "Axis label", "Marker Name")), |
|
|
889 |
column(1), |
|
|
890 |
column(5, selectizeInput("yfont.lab22", "Label font", choices = c("Regular" = "1", "Bold" = "2", |
|
|
891 |
"Italic" = "3", "Bold Italic" = "4"), |
|
|
892 |
selected = "1")) |
|
|
893 |
), |
|
|
894 |
|
|
|
895 |
fluidRow( |
|
|
896 |
column(5, textInput("ycol.lab22", "Label color", "black")), |
|
|
897 |
column(1), |
|
|
898 |
column(5, numericInput("ycex.lab22", "Label size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
899 |
), |
|
|
900 |
|
|
|
901 |
## Y axis annotation options |
|
|
902 |
fluidRow( |
|
|
903 |
column(5, textInput("ycol.axis22", "Annotation color", "black")), |
|
|
904 |
column(1), |
|
|
905 |
column(5, numericInput("ycex.axis22", "Annotation size", min=0.1, max=5, value = 1, step = 0.1)) |
|
|
906 |
) |
|
|
907 |
) |
|
|
908 |
) |
|
|
909 |
) |
|
|
910 |
), |
|
|
911 |
|
|
|
912 |
|
|
|
913 |
conditionalPanel(condition="input.tabs1=='Sample size'", |
|
|
914 |
|
|
|
915 |
h5("Choose one of the following methods (*):"), |
|
|
916 |
HTML('<br>'), |
|
|
917 |
|
|
|
918 |
|
|
|
919 |
checkboxInput("singleTest", "Single diagnostic test", FALSE), |
|
|
920 |
|
|
|
921 |
conditionalPanel(condition="input.singleTest", |
|
|
922 |
|
|
|
923 |
numericInput(inputId = "alpha1", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), |
|
|
924 |
numericInput(inputId = "power1", label = "Power", value = 0.80, min = 0, max = 1, step = 0.1), |
|
|
925 |
numericInput(inputId = "auc", label = "Area under the ROC curve", value = 0.60, min = 0.5, max = 1, step = 0.1), |
|
|
926 |
numericInput(inputId = "ratio", label = "Allocation ratio", value = 1, min = 0, step = 0.1) |
|
|
927 |
|
|
|
928 |
), |
|
|
929 |
|
|
|
930 |
HTML('<br>'), |
|
|
931 |
|
|
|
932 |
checkboxInput("twoTests", "Comparison of two diagnostic tests", FALSE), |
|
|
933 |
|
|
|
934 |
conditionalPanel(condition="input.twoTests", |
|
|
935 |
|
|
|
936 |
numericInput(inputId = "alpha2", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), |
|
|
937 |
numericInput(inputId = "power2", label = "Power", value = 0.80, min = 0, max = 1, step = 0.1), |
|
|
938 |
numericInput(inputId = "auc01", label = "AUC for 1st test under null hypothesis", value = 0.80, min = 0.5, max = 1, step = 0.1), |
|
|
939 |
numericInput(inputId = "auc02", label = "AUC for 2nd test under null hypothesis", value = 0.80, min = 0.5, max = 1, step = 0.1), |
|
|
940 |
numericInput(inputId = "auc11", label = "AUC for 1st test under alternative hypothesis", value = 0.90, min = 0.5, max = 1, step = 0.1), |
|
|
941 |
numericInput(inputId = "auc12", label = "AUC for 2nd test under alternative hypothesis", value = 0.70, min = 0.5, max = 1, step = 0.1), |
|
|
942 |
numericInput(inputId = "ratio2", label = "Allocation ratio", value = 1, min = 0, step = 0.1) |
|
|
943 |
|
|
|
944 |
), |
|
|
945 |
HTML('<br>'), |
|
|
946 |
|
|
|
947 |
|
|
|
948 |
checkboxInput("StandardVsNew", "Noninferiority of a new test to a standard test", FALSE), |
|
|
949 |
|
|
|
950 |
|
|
|
951 |
conditionalPanel(condition="input.StandardVsNew", |
|
|
952 |
|
|
|
953 |
numericInput(inputId = "alpha3", label = "Type I error", value = 0.05, min = 0, max = 1, step = 0.01), |
|
|
954 |
numericInput(inputId = "power3", label = "Power", value = 0.80, min = 0, max = 1, step = 0.1), |
|
|
955 |
numericInput(inputId = "aucs", label = "AUC for standard test", value = 0.80, min = 0.5, max = 1, step = 0.1), |
|
|
956 |
numericInput(inputId = "aucn", label = "AUC for new test", value = 0.80, min = 0.5, max = 1, step = 0.1), |
|
|
957 |
numericInput(inputId = "sd", label = "Smallest difference", value = 0.1, step = 0.1), |
|
|
958 |
numericInput(inputId = "ratio3", label = "Allocation ratio", value = 1, min = 0, step = 0.1) |
|
|
959 |
|
|
|
960 |
), |
|
|
961 |
|
|
|
962 |
HTML('<br>'), |
|
|
963 |
HTML('<p>(*) See <a href="http://66.199.228.237/boundary/complex_decision_making_and_ethics/ROC_Analysis.pdf" target="_blank"> Obuchowski, 2005</a> for further details.</p>'), |
|
|
964 |
HTML('<br>') |
|
|
965 |
|
|
|
966 |
|
|
|
967 |
), |
|
|
968 |
|
|
|
969 |
|
|
|
970 |
conditionalPanel(condition="input.tabs1=='Manual'", |
|
|
971 |
HTML('<p align="center"><img src="manual.png" width=200 height=200></p>') |
|
|
972 |
), |
|
|
973 |
|
|
|
974 |
conditionalPanel(condition="input.tabs1=='Authors & News'", |
|
|
975 |
HTML('<p align="center"> <a href="https://www.hacettepe.edu.tr/english/" target="_blank"><img src="hulogo.JPEG" width=150 height=150></a> </p>') |
|
|
976 |
) |
|
|
977 |
), |
|
|
978 |
|
|
|
979 |
|
|
|
980 |
mainPanel( |
|
|
981 |
# Tab panelinden herhangi bir sekme seçildiği zaman ana bölmede (Ekranın orta kısmı) |
|
|
982 |
# nelerin görüneceği bu kısımda tanımlanıyor. Belirli koşullar tanımlanmak istenir ise |
|
|
983 |
# ayrıca bir conditionalPanel() bloğu burada tanımlanabilir. |
|
|
984 |
tabsetPanel( |
|
|
985 |
tabPanel(title="Introduction", |
|
|
986 |
h5("The easiest way to perform ROC analysis!"), |
|
|
987 |
HTML('<p> A receiver operating characteristics (ROC) curve is a graphical approach which |
|
|
988 |
assess the performance of a binary classifier system. The ROC curve analysis is widely |
|
|
989 |
used in medicine, radiology, biometrics and various application of machine learning. </p>'), |
|
|
990 |
HTML('<p align="justify"> Here we developed an easy way to carry out ROC analysis. |
|
|
991 |
This application creates ROC curves, calculates area under the curve (AUC) |
|
|
992 |
values and confidence intervals for the AUC values, and performs multiple comparisons |
|
|
993 |
for ROC curves in a user-friendly, up-to-date and comprehensive way. Moreover, |
|
|
994 |
easyROC computes and compares partial AUCs. It can also perform sample size calculation.</p>'), |
|
|
995 |
|
|
|
996 |
HTML('<p> An important feature of this application is to determine cut-off values especially |
|
|
997 |
for diagnostic tests. For this task, we made use of |
|
|
998 |
<a href="http://cran.r-project.org/web/packages/OptimalCutpoints/index.html" target="_blank">OptimalCutpoints</a> package (Lopez-Raton et al, 2014) of R [1].</p>'), |
|
|
999 |
|
|
|
1000 |
#HTML('<br>'), |
|
|
1001 |
|
|
|
1002 |
HTML('<p><div align="center"><table cellpadding="0" cellspacing="0"><tr><td><img src="ROCplot.png" width="300" height="300" border="10000"></td><td><img src="CutOff_Plots.png" width="400" height="400" border="70"></td></tr></table></div></p>'), |
|
|
1003 |
|
|
|
1004 |
# HTML('<br>'), |
|
|
1005 |
|
|
|
1006 |
|
|
|
1007 |
h6("[1] Monica Lopez-Raton, Maria Xose Rodriguez-Alvarez, Carmen Cadarso Suarez, Francisco Gude Sampedro (2014). OptimalCutpoints: An R Package for Selecting Optimal Cutpoints in Diagnostic Tests. Journal of Statistical Software, 61(8), 1-36.") |
|
|
1008 |
), |
|
|
1009 |
|
|
|
1010 |
tabPanel("Data upload", |
|
|
1011 |
navbarPage(title = '', |
|
|
1012 |
tabPanel('Data', dataTableOutput('RawData')) |
|
|
1013 |
) |
|
|
1014 |
), |
|
|
1015 |
|
|
|
1016 |
tabPanel("ROC curve", |
|
|
1017 |
downloadButton("downloadROCStats", "Download ROC statistics as txt-file"), |
|
|
1018 |
downloadButton("downloadROCData", "Download ROC coordinates as txt-file"), |
|
|
1019 |
downloadButton("downloadROCPlot", "Download plot as pdf-file"), |
|
|
1020 |
|
|
|
1021 |
h4(textOutput(outputId = "section1")), |
|
|
1022 |
navbarPage(id = "navbarROCcurve", |
|
|
1023 |
title = '', |
|
|
1024 |
tabPanel('Statistics', dataTableOutput('ROCstatistics')), |
|
|
1025 |
tabPanel('ROC Coordinates', dataTableOutput('ROCcoordinates')), |
|
|
1026 |
tabPanel('Multiple Comparisons', dataTableOutput('ROCcomparisons')), |
|
|
1027 |
tabPanel('Partial AUC', dataTableOutput('resultPAuc')) |
|
|
1028 |
|
|
|
1029 |
|
|
|
1030 |
|
|
|
1031 |
), |
|
|
1032 |
|
|
|
1033 |
conditionalPanel(condition = "input.navbarROCcurve != 'ROC Coordinates'", |
|
|
1034 |
textOutput(outputId = "CIreminderLine1"), |
|
|
1035 |
h6(textOutput(outputId = "CIreminderLine2")) |
|
|
1036 |
), |
|
|
1037 |
|
|
|
1038 |
HTML('<br>'), |
|
|
1039 |
h4(textOutput(outputId = "section2")), |
|
|
1040 |
plotOutput("ROCplot") |
|
|
1041 |
|
|
|
1042 |
|
|
|
1043 |
|
|
|
1044 |
#verbatimTextOutput("resultPAuc") |
|
|
1045 |
), |
|
|
1046 |
|
|
|
1047 |
tabPanel("Cut points", |
|
|
1048 |
downloadButton("downloadCutOffresults", "Download results as txt-file"), |
|
|
1049 |
downloadButton("downloadCutOffPlotPDF", "Download plots as pdf-file"), |
|
|
1050 |
verbatimTextOutput("cutPoints"), |
|
|
1051 |
|
|
|
1052 |
## İçeriği sayfada ortalamak için kullanılan HTML kodu. |
|
|
1053 |
HTML('<div align="center">'), |
|
|
1054 |
plotOutput("cutPointsPlot"), |
|
|
1055 |
HTML('</div>') |
|
|
1056 |
), |
|
|
1057 |
|
|
|
1058 |
tabPanel(title="Sample size", |
|
|
1059 |
|
|
|
1060 |
downloadButton("downloadSampleSizeResults", "Download results as txt-file"), |
|
|
1061 |
verbatimTextOutput("SampleSizeForRoc") |
|
|
1062 |
|
|
|
1063 |
|
|
|
1064 |
), |
|
|
1065 |
|
|
|
1066 |
tabPanel(title="Manual", |
|
|
1067 |
h5("Detailed manual will be released soon...") |
|
|
1068 |
), |
|
|
1069 |
|
|
|
1070 |
tabPanel("Authors & News", |
|
|
1071 |
h4("Authors"), |
|
|
1072 |
HTML('<p><a href="http://www.biostatistics.hacettepe.edu.tr/cv/Dincer_Goksuluk_CV_Eng.pdf" target="_blank"> <b>Dincer Goksuluk</b></a><p>'), |
|
|
1073 |
HTML('<p>Hacettepe University Faculty of Medicine <a href="http://www.biostatistics.hacettepe.edu.tr" target="_blank"> Department of Biostatistics</a><p>'), |
|
|
1074 |
HTML('<p><a href="mailto:dincer.goksuluk@hacettepe.edu.tr" target="_blank">dincer.goksuluk@hacettepe.edu.tr</a><p>'), |
|
|
1075 |
HTML('<p><a href="http://yunus.hacettepe.edu.tr/~selcuk.korkmaz/" target="_blank"> <b>Selcuk Korkmaz</b></a><p>'), |
|
|
1076 |
HTML('<p>Hacettepe University Faculty of Medicine <a href="http://www.biostatistics.hacettepe.edu.tr" target="_blank"> Department of Biostatistics</a><p>'), |
|
|
1077 |
HTML('<p><a href="mailto:selcuk.korkmaz@hacettepe.edu.tr" target="_blank">selcuk.korkmaz@hacettepe.edu.tr</a><p>'), |
|
|
1078 |
HTML('<p><a href="http://www.biostatistics.hacettepe.edu.tr/cv/Gokmen_Zararsiz_CV_Eng.pdf" target="_blank"> <b>Gokmen Zararsiz</b></a><p>'), |
|
|
1079 |
HTML('<p>Hacettepe University Faculty of Medicine <a href="http://www.biostatistics.hacettepe.edu.tr" target="_blank"> Department of Biostatistics</a><p>'), |
|
|
1080 |
HTML('<p><a href="mailto:gokmen.zararsiz@hacettepe.edu.tr" target="_blank">gokmen.zararsiz@hacettepe.edu.tr</a><p>'), |
|
|
1081 |
HTML('<br>'), |
|
|
1082 |
h4("News"), |
|
|
1083 |
HTML('<br>'), |
|
|
1084 |
HTML('<p><b> Version 1.1 (June 23, 2015) </b><p>'), |
|
|
1085 |
HTML('<p> (1) Partial AUC feature has been added.<p>'), |
|
|
1086 |
HTML('<p> (2) Sample size calculation tab has been added.<p>'), |
|
|
1087 |
HTML('<p> (3) Minor improvements and bug fixes.<p>'), |
|
|
1088 |
|
|
|
1089 |
HTML('<br>'), |
|
|
1090 |
HTML('<p><b> Version 1.0 (March 19, 2015)</b><p>'), |
|
|
1091 |
HTML('<p> (1) Initial version has been released.<p>'), |
|
|
1092 |
HTML('<br>'), |
|
|
1093 |
|
|
|
1094 |
|
|
|
1095 |
h5("Other Tools"), |
|
|
1096 |
|
|
|
1097 |
HTML('<p><a href="http://www.biosoft.hacettepe.edu.tr/MLViS/" target="_blank"> <b>MLViS: a machine learning-based virtual screening tool</b></a><p>'), |
|
|
1098 |
HTML('<p><a href="http://www.biosoft.hacettepe.edu.tr/MVN/" target="_blank"> <b>MVN: a web-tool for assessing multivariate normality </b></a><p>'), |
|
|
1099 |
HTML('<p><a href="http://www.biosoft.hacettepe.edu.tr/DDNAA/" target="_blank"> <b>DDNAA: Decision support system for differential diagnosis of nontraumatic acute abdomen </b></a><p>'), |
|
|
1100 |
HTML('<br>'), |
|
|
1101 |
|
|
|
1102 |
h6("Please feel free to send us bugs and feature requests.") |
|
|
1103 |
), |
|
|
1104 |
|
|
|
1105 |
#tabPanel("News", |
|
|
1106 |
# h4("New Features") |
|
|
1107 |
#), |
|
|
1108 |
id="tabs1" |
|
|
1109 |
), |
|
|
1110 |
|
|
|
1111 |
tags$head(tags$style(type="text/css", "label.radio { display: inline-block; }", ".radio input[type=\"radio\"] { float: none; }"), |
|
|
1112 |
tags$style(type="text/css", "select { max-width: 200px; }"), |
|
|
1113 |
tags$style(type="text/css", "textarea { max-width: 185px; }"), |
|
|
1114 |
tags$style(type="text/css", ".jslider { max-width: 200px; }"), |
|
|
1115 |
tags$style(type='text/css', ".well { max-width: 330px; }"), |
|
|
1116 |
tags$style(type='text/css', ".span4 { max-width: 330px; }")), |
|
|
1117 |
|
|
|
1118 |
tags$head( |
|
|
1119 |
tags$link(rel = "shortcut icon", href = "favicon-2.ico")) |
|
|
1120 |
|
|
|
1121 |
) |
|
|
1122 |
)) |
|
|
1123 |
|
|
|
1124 |
|
|
|
1125 |
|
|
|
1126 |
|