Spaces:
Build error
Build error
Upload app.R
Browse files
app.R
ADDED
|
@@ -0,0 +1,763 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
library(shiny)
|
| 2 |
+
library(shinyjs)
|
| 3 |
+
library(bslib)
|
| 4 |
+
library(dplyr)
|
| 5 |
+
library(ggplot2)
|
| 6 |
+
library(tm)
|
| 7 |
+
library(SnowballC)
|
| 8 |
+
library(plotly)
|
| 9 |
+
library(text2vec)
|
| 10 |
+
library(tokenizers)
|
| 11 |
+
library(dplyr)
|
| 12 |
+
library(tidyr)
|
| 13 |
+
library(igraph)
|
| 14 |
+
library(ggraph)
|
| 15 |
+
library(topicmodels)
|
| 16 |
+
library(wordcloud)
|
| 17 |
+
library(wordcloud2)
|
| 18 |
+
library(reshape2)
|
| 19 |
+
library(SnowballC)
|
| 20 |
+
library(RColorBrewer)
|
| 21 |
+
library(syuzhet)
|
| 22 |
+
library(cluster)
|
| 23 |
+
library(tidytext)
|
| 24 |
+
library(word2vec)
|
| 25 |
+
library(Rtsne)
|
| 26 |
+
library(umap)
|
| 27 |
+
library(MASS)
|
| 28 |
+
library(koRpus)
|
| 29 |
+
library(openxlsx)
|
| 30 |
+
library(tools)
|
| 31 |
+
library(shinyWidgets)
|
| 32 |
+
library(reticulate)
|
| 33 |
+
library(keras)
|
| 34 |
+
library(tensorflow)
|
| 35 |
+
library(neuralnet)
|
| 36 |
+
library(rsample)
|
| 37 |
+
library(tfdatasets)
|
| 38 |
+
library(statnet)
|
| 39 |
+
library(UserNetR)
|
| 40 |
+
library(visNetwork)
|
| 41 |
+
library(networkD3)
|
| 42 |
+
library(ergm)
|
| 43 |
+
library(ergm.count)
|
| 44 |
+
library(network)
|
| 45 |
+
library(tidyverse)
|
| 46 |
+
options(width = 150)
|
| 47 |
+
options(digits = 4, scipen = 1000000000)
|
| 48 |
+
options(shiny.maxRequestSize=30*1024^2)
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
ui <- fluidPage(
|
| 53 |
+
theme = bs_theme(version = 5, bootswatch = "spacelab"),
|
| 54 |
+
useShinyjs(), # Initialize shinyjs
|
| 55 |
+
titlePanel("PtteM Data Science"),
|
| 56 |
+
tags$head(tags$link(rel = "stylesheet", href="https://fonts.googleapis.com/css?family=Montserrat:100,300,400,700&display=swap"),
|
| 57 |
+
tags$style(HTML("
|
| 58 |
+
body, h1, h2, h3, h4, h5, h6, .nav, p, a, .shiny-input-container {
|
| 59 |
+
font-family: 'Montserrat'; /* Font type for the title attribute */
|
| 60 |
+
font-weight: 385;
|
| 61 |
+
color: #007c9e !important;
|
| 62 |
+
}
|
| 63 |
+
* {
|
| 64 |
+
font-family: 'Montserrat', sans-serif;
|
| 65 |
+
font-weight: 385;
|
| 66 |
+
color: #195576; /* Blue color */
|
| 67 |
+
}
|
| 68 |
+
body {
|
| 69 |
+
background-color: #f7f7f7; /* Light gray background */
|
| 70 |
+
}
|
| 71 |
+
.icon-btn {
|
| 72 |
+
border: 1px solid #0d6efd; /* Example border: solid, 2 pixels, #555 color */
|
| 73 |
+
border-radius: 15%; /* Circular border */
|
| 74 |
+
color: #00969e; /* Icon color */
|
| 75 |
+
font-family: 'Montserrat'; /* Font type for the title attribute */
|
| 76 |
+
font-weight: 385;
|
| 77 |
+
background-color: #f7f7f7;
|
| 78 |
+
padding: 125px; /* Space around the icon */
|
| 79 |
+
margin: 25px; /* Space around the button */
|
| 80 |
+
font-size: 24px; /* Icon size */
|
| 81 |
+
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
|
| 82 |
+
}
|
| 83 |
+
.icon-btn:hover {
|
| 84 |
+
color: #00969e; /* Icon color on hover */
|
| 85 |
+
border-color: #007c9e;
|
| 86 |
+
background-color: #ebfbfd;/* Border color on hover */
|
| 87 |
+
}
|
| 88 |
+
/* Add custom styles here */
|
| 89 |
+
.shiny-input-container {
|
| 90 |
+
margin-bottom: 15px;
|
| 91 |
+
}
|
| 92 |
+
.box {
|
| 93 |
+
border: 1px solid #ddd;
|
| 94 |
+
padding: 20px;
|
| 95 |
+
border-radius: 50px;
|
| 96 |
+
margin-bottom: 200px;
|
| 97 |
+
gap: 200px;
|
| 98 |
+
align-items: center;
|
| 99 |
+
}
|
| 100 |
+
#statsTable_wrapper {
|
| 101 |
+
margin: 0 auto;
|
| 102 |
+
}
|
| 103 |
+
.shiny-output-error {
|
| 104 |
+
border: 1px solid #FF0000; /* Red border on error */
|
| 105 |
+
}
|
| 106 |
+
/* If you want to change the font size of the tooltip, you can add custom CSS for the 'title' attribute's default styling. */
|
| 107 |
+
"))),
|
| 108 |
+
tags$head(
|
| 109 |
+
# Include JavaScript to reload the page
|
| 110 |
+
tags$script(HTML("
|
| 111 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 112 |
+
document.getElementById('myElement').style.color = '#0d6efd'; // Change to your desired color
|
| 113 |
+
});
|
| 114 |
+
"))
|
| 115 |
+
),
|
| 116 |
+
tags$head(
|
| 117 |
+
tags$script(HTML("
|
| 118 |
+
function reloadPage() {
|
| 119 |
+
window.location.reload();
|
| 120 |
+
}
|
| 121 |
+
"))
|
| 122 |
+
),
|
| 123 |
+
# Refresh button that calls the JavaScript function
|
| 124 |
+
actionButton("refresh", "Refresh Analysis", onclick = "reloadPage();"),
|
| 125 |
+
# Help Text or Information for the user
|
| 126 |
+
helpText("Bu uygulama ile pekiştirmeli öğrenme başlığı altındaki veri bilimi fonksiyonlarına erişebilirsiniz."),
|
| 127 |
+
#Reinforcement Learning
|
| 128 |
+
h2("Reinforcement Learning Section"),
|
| 129 |
+
tabsetPanel(
|
| 130 |
+
tabPanel("Multi-Armed Bandit (MAB) Algorithms",
|
| 131 |
+
tabsetPanel(
|
| 132 |
+
tabPanel("Epsilon-Greedy",
|
| 133 |
+
sidebarLayout(
|
| 134 |
+
sidebarPanel(
|
| 135 |
+
fileInput('epsgreefile', 'Upload Data File', accept = c(".csv", ".xlsx", ".xls")),
|
| 136 |
+
uiOutput('selectActionColumn'),
|
| 137 |
+
uiOutput('selectRewardColumn'),
|
| 138 |
+
numericInput("epsilon", "Epsilon (Exploration Rate)", value = 0.1, min = 0, max = 1, step = 0.01),
|
| 139 |
+
actionButton("runMAB", "Run MAB Decision"),
|
| 140 |
+
),
|
| 141 |
+
mainPanel(
|
| 142 |
+
tableOutput("actionResults"),
|
| 143 |
+
textOutput("selectedAction"),
|
| 144 |
+
)
|
| 145 |
+
)
|
| 146 |
+
),
|
| 147 |
+
tabPanel("Upper Confidence Bound (UCB)",
|
| 148 |
+
sidebarLayout(
|
| 149 |
+
sidebarPanel(
|
| 150 |
+
fileInput("ucbfile", "Upload Data File", accept = c(".csv", ".xlsx", ".xls")),
|
| 151 |
+
uiOutput("selectStrategyColucb"),
|
| 152 |
+
uiOutput("selectRewardColucb"),
|
| 153 |
+
numericInput("epsilon", "Epsilon (Exploration Rate)", value = 0.1, min = 0, max = 1, step = 0.01),
|
| 154 |
+
actionButton("runMABucb", "Run MAB Decision")
|
| 155 |
+
),
|
| 156 |
+
mainPanel(
|
| 157 |
+
tabsetPanel(
|
| 158 |
+
tabPanel("Results", tableOutput("actionResultsucb")),
|
| 159 |
+
tabPanel("Reward History", plotlyOutput("rewardHistoryucb", width = "100%", height = "750px"))
|
| 160 |
+
)
|
| 161 |
+
)
|
| 162 |
+
)
|
| 163 |
+
),
|
| 164 |
+
tabPanel("Thompson Sampling",
|
| 165 |
+
sidebarLayout(
|
| 166 |
+
sidebarPanel(
|
| 167 |
+
fileInput("tsfile", "Upload Data File", accept = c(".csv", ".xlsx", ".xls")),
|
| 168 |
+
uiOutput("selectStrategyColumnTS"), # This should be in the UI part
|
| 169 |
+
uiOutput("selectRewardColumnTS"),
|
| 170 |
+
textInput("successConditionsTS", "Enter success conditions (comma separated)"),
|
| 171 |
+
actionButton("runMABTS", "Run MAB Thompson Sampling")
|
| 172 |
+
),
|
| 173 |
+
mainPanel(
|
| 174 |
+
tabsetPanel(
|
| 175 |
+
tabPanel("Best Display", verbatimTextOutput("bestStrategyDisplayTS")),
|
| 176 |
+
tabPanel("Reward History TS", plotlyOutput("rewardHistoryTS", width = "100%", height = "750px")),
|
| 177 |
+
tabPanel("Strategy Frequency", plotlyOutput("strFrePlotTS", width = "100%", height = "750px"))
|
| 178 |
+
)
|
| 179 |
+
)
|
| 180 |
+
)
|
| 181 |
+
),
|
| 182 |
+
|
| 183 |
+
|
| 184 |
+
)
|
| 185 |
+
),
|
| 186 |
+
tabPanel("Contextual Bandits",
|
| 187 |
+
tabsetPanel(
|
| 188 |
+
tabPanel("Linear Regression UCB",
|
| 189 |
+
sidebarLayout(
|
| 190 |
+
sidebarPanel(
|
| 191 |
+
fileInput("lrucbfile", "Upload your dataset", accept = c(".csv", ".xlsx", ".xls")),
|
| 192 |
+
actionButton("loadlrucb", "Load Data"),
|
| 193 |
+
selectInput("targetlrucb", "Select Target Column", choices = NULL),
|
| 194 |
+
selectizeInput("independentVarlrucb", "Select Independent Variable", choices = NULL, multiple = FALSE),
|
| 195 |
+
actionButton("runModellrucb", "Run Linear Regression UCB")
|
| 196 |
+
),
|
| 197 |
+
mainPanel(
|
| 198 |
+
tabsetPanel(
|
| 199 |
+
tabPanel("Model Summary", verbatimTextOutput("modelSummarylrucb")),
|
| 200 |
+
tabPanel("Diagnostics",
|
| 201 |
+
plotlyOutput("resFitlrucbPlot"),
|
| 202 |
+
plotlyOutput("qqPlotlrucb"),
|
| 203 |
+
plotlyOutput("scaleLoclrucbPlot"),
|
| 204 |
+
plotlyOutput("resLevlrucbPlot")
|
| 205 |
+
),
|
| 206 |
+
tabPanel("Regression Plot", plotlyOutput("regressionPlot", width = "100%", height = "750px"))
|
| 207 |
+
)
|
| 208 |
+
)
|
| 209 |
+
)
|
| 210 |
+
)
|
| 211 |
+
|
| 212 |
+
|
| 213 |
+
)
|
| 214 |
+
)
|
| 215 |
+
)
|
| 216 |
+
|
| 217 |
+
|
| 218 |
+
|
| 219 |
+
)
|
| 220 |
+
|
| 221 |
+
server <- function(input, output, session) {
|
| 222 |
+
##Reinforcement Learning
|
| 223 |
+
###Multi-Armed Bandit (MAB) Algorithms
|
| 224 |
+
####Epsilon-Greedy
|
| 225 |
+
# Reactive to store uploaded data
|
| 226 |
+
uploadedepsgree <- reactive({
|
| 227 |
+
req(input$epsgreefile)
|
| 228 |
+
ext <- tools::file_ext(input$epsgreefile$name)
|
| 229 |
+
switch(ext,
|
| 230 |
+
csv = read.csv(input$epsgreefile$datapath, stringsAsFactors = FALSE),
|
| 231 |
+
xlsx = readxl::read_excel(input$epsgreefile$datapath),
|
| 232 |
+
stop("Unsupported file type"))
|
| 233 |
+
})
|
| 234 |
+
|
| 235 |
+
# Dynamic UI to select the action and reward columns
|
| 236 |
+
output$selectActionColumn <- renderUI({
|
| 237 |
+
df <- uploadedepsgree()
|
| 238 |
+
req(df)
|
| 239 |
+
selectInput("actionColumn", "Select Action Column", choices = names(df))
|
| 240 |
+
})
|
| 241 |
+
|
| 242 |
+
output$selectRewardColumn <- renderUI({
|
| 243 |
+
df <- uploadedepsgree()
|
| 244 |
+
req(df)
|
| 245 |
+
selectInput("rewardColumn", "Select Reward Column", choices = names(df))
|
| 246 |
+
})
|
| 247 |
+
|
| 248 |
+
# Reactive values to store actions and performance metrics
|
| 249 |
+
actionRewards <- reactiveValues(actions = NULL, rewards = NULL, counts = NULL)
|
| 250 |
+
|
| 251 |
+
observeEvent(input$runMAB, {
|
| 252 |
+
req(input$epsilon, input$actionColumn, input$rewardColumn)
|
| 253 |
+
df <- uploadedepsgree()
|
| 254 |
+
df <- df %>% dplyr::select(all_of(input$actionColumn), all_of(input$rewardColumn)) %>% na.omit()
|
| 255 |
+
uniqueActions <- unique(df[[input$actionColumn]])
|
| 256 |
+
summedRewards <- tapply(df[[input$rewardColumn]], df[[input$actionColumn]], sum, na.rm = TRUE)
|
| 257 |
+
|
| 258 |
+
# Store processed data in actionRewards
|
| 259 |
+
actionRewards$actions <- uniqueActions
|
| 260 |
+
actionRewards$rewards <- summedRewards
|
| 261 |
+
actionRewards$counts <- rep(10, length(uniqueActions)) # Initialize with some counts
|
| 262 |
+
|
| 263 |
+
# Run epsilon-greedy algorithm
|
| 264 |
+
if (runif(1) < input$epsilon) {
|
| 265 |
+
# Exploration
|
| 266 |
+
selectedActionIndex <- sample(length(uniqueActions), 1)
|
| 267 |
+
} else {
|
| 268 |
+
# Exploitation
|
| 269 |
+
averages <- summedRewards / actionRewards$counts
|
| 270 |
+
selectedActionIndex <- which.max(averages)
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
selectedAction <- uniqueActions[selectedActionIndex]
|
| 274 |
+
simulatedReward <- runif(1, min = 0, max = max(summedRewards)) # Simulate a reward
|
| 275 |
+
actionRewards$rewards[selectedActionIndex] <- actionRewards$rewards[selectedActionIndex] + simulatedReward
|
| 276 |
+
actionRewards$counts[selectedActionIndex] <- actionRewards$counts[selectedActionIndex] + 1
|
| 277 |
+
|
| 278 |
+
# Update UI
|
| 279 |
+
output$selectedAction <- renderText({ selectedAction })
|
| 280 |
+
output$actionResults <- renderTable({
|
| 281 |
+
data.frame(Action = actionRewards$actions, Reward = actionRewards$rewards, Count = actionRewards$counts)
|
| 282 |
+
})
|
| 283 |
+
})
|
| 284 |
+
|
| 285 |
+
####Upper Confidence Bound (UCB)
|
| 286 |
+
# Reactive values to store actions and performance metrics
|
| 287 |
+
actionData <- reactiveValues(
|
| 288 |
+
actions = NULL,
|
| 289 |
+
counts = NULL,
|
| 290 |
+
rewards = NULL,
|
| 291 |
+
history = list() # Initialize the history list here
|
| 292 |
+
)
|
| 293 |
+
|
| 294 |
+
uploadeducb <- reactive({
|
| 295 |
+
req(input$ucbfile)
|
| 296 |
+
ext <- tools::file_ext(input$ucbfile$name)
|
| 297 |
+
switch(ext,
|
| 298 |
+
csv = read.csv(input$ucbfile$datapath, stringsAsFactors = FALSE),
|
| 299 |
+
xlsx = readxl::read_excel(input$ucbfile$datapath),
|
| 300 |
+
xls = readxl::read_excel(input$ucbfile$datapath),
|
| 301 |
+
stop("Unsupported file type")
|
| 302 |
+
)
|
| 303 |
+
})
|
| 304 |
+
|
| 305 |
+
output$selectStrategyColucb <- renderUI({
|
| 306 |
+
req(input$ucbfile)
|
| 307 |
+
data <- uploadeducb()
|
| 308 |
+
selectInput("strategyColumn", "Select Strategy Column",
|
| 309 |
+
choices = names(data), selected = names(data)[1])
|
| 310 |
+
})
|
| 311 |
+
|
| 312 |
+
output$selectRewardColucb <- renderUI({
|
| 313 |
+
req(input$ucbfile)
|
| 314 |
+
data <- uploadeducb()
|
| 315 |
+
selectInput("rewardColumn", "Select Reward Column",
|
| 316 |
+
choices = names(data), selected = names(data)[2])
|
| 317 |
+
})
|
| 318 |
+
|
| 319 |
+
|
| 320 |
+
|
| 321 |
+
observeEvent(input$runMABucb, {
|
| 322 |
+
|
| 323 |
+
data <- uploadeducb()
|
| 324 |
+
strategyColumn <- input$strategyColumn
|
| 325 |
+
rewardColumn <- input$rewardColumn
|
| 326 |
+
|
| 327 |
+
# Ensure numerical data for computation
|
| 328 |
+
data[[rewardColumn]] <- as.numeric(as.character(data[[rewardColumn]]))
|
| 329 |
+
|
| 330 |
+
# Unique strategies
|
| 331 |
+
strategies <- unique(data[[strategyColumn]])
|
| 332 |
+
n <- nrow(data) # Total number of events
|
| 333 |
+
|
| 334 |
+
if (is.null(actionData$actions)) {
|
| 335 |
+
actionData$actions <- strategies
|
| 336 |
+
actionData$counts <- rep(0, length(strategies))
|
| 337 |
+
actionData$rewards <- rep(0, length(strategies))
|
| 338 |
+
# Initialize history for each strategy
|
| 339 |
+
actionData$history <- setNames(vector("list", length(strategies)), strategies)
|
| 340 |
+
for(strategy in strategies) {
|
| 341 |
+
actionData$history[[strategy]] <- data.frame(Time = integer(), Reward = numeric())
|
| 342 |
+
}
|
| 343 |
+
}
|
| 344 |
+
|
| 345 |
+
# Loop over strategies to compute UCB and update history
|
| 346 |
+
for (strategy in strategies) {
|
| 347 |
+
strategy_data <- data[data[[strategyColumn]] == strategy, ]
|
| 348 |
+
ni <- nrow(strategy_data) # Number of times this strategy was tried
|
| 349 |
+
avg_reward <- mean(strategy_data[[rewardColumn]], na.rm = TRUE)
|
| 350 |
+
|
| 351 |
+
if (ni > 0) {
|
| 352 |
+
ucb_value <- avg_reward + sqrt((2 * log(n)) / ni)
|
| 353 |
+
} else {
|
| 354 |
+
ucb_value <- Inf # Encourage exploration of untried strategies
|
| 355 |
+
}
|
| 356 |
+
# Define strategy_index here, inside the loop, before you use it
|
| 357 |
+
strategy_index <- which(actionData$actions == strategy)
|
| 358 |
+
|
| 359 |
+
actionData$counts[strategy_index] <- actionData$counts[strategy_index] + ni
|
| 360 |
+
actionData$rewards[strategy_index] <- ucb_value
|
| 361 |
+
actionData$history[[strategy]] <- rbind(
|
| 362 |
+
actionData$history[[strategy]],
|
| 363 |
+
data.frame(Time = as.integer(actionData$counts[strategy_index]), Reward = ucb_value)
|
| 364 |
+
)
|
| 365 |
+
}
|
| 366 |
+
# After the loop, the history should be updated
|
| 367 |
+
})
|
| 368 |
+
|
| 369 |
+
output$actionResultsucb <- renderTable({
|
| 370 |
+
req(actionData$actions) # Ensure the action data is not NULL
|
| 371 |
+
data.frame(
|
| 372 |
+
Strategy = actionData$actions,
|
| 373 |
+
Counts = actionData$counts,
|
| 374 |
+
Rewards = actionData$rewards
|
| 375 |
+
)
|
| 376 |
+
})
|
| 377 |
+
|
| 378 |
+
|
| 379 |
+
|
| 380 |
+
# Create the plot in a separate reactive context, responding to changes in actionData
|
| 381 |
+
output$rewardHistoryucb <- renderPlotly({
|
| 382 |
+
req(actionData$history) # Ensure that the history is not NULL or empty
|
| 383 |
+
|
| 384 |
+
# Create plot_data for plotting
|
| 385 |
+
plot_data <- do.call(rbind, Filter(Negate(is.null), lapply(names(actionData$history), function(strategy) {
|
| 386 |
+
history_data <- actionData$history[[strategy]]
|
| 387 |
+
if(nrow(history_data) > 0) {
|
| 388 |
+
return(data.frame(Strategy = strategy, Time = history_data$Time, Reward = history_data$Reward))
|
| 389 |
+
}
|
| 390 |
+
})))
|
| 391 |
+
|
| 392 |
+
# Only attempt to create a plot if plot_data is a data frame and not NULL
|
| 393 |
+
if(!is.null(plot_data) && is.data.frame(plot_data)) {
|
| 394 |
+
# Create a custom color palette with as many colors as there are strategies
|
| 395 |
+
colors <- grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Set2"))(length(unique(plot_data$Strategy)))
|
| 396 |
+
|
| 397 |
+
plot_ly(plot_data, x = ~Time, y = ~Reward, color = ~Strategy, colors = colors, type = 'scatter', mode = 'lines+markers') %>%
|
| 398 |
+
layout(title = "Reward History Over Time",
|
| 399 |
+
xaxis = list(title = "Time"),
|
| 400 |
+
yaxis = list(title = "Reward"))
|
| 401 |
+
} else {
|
| 402 |
+
plot_ly() %>%
|
| 403 |
+
add_annotations(text = "No data available for plot", x = 0.5, y = 0.5, showarrow = FALSE, xref = "paper", yref = "paper")
|
| 404 |
+
}
|
| 405 |
+
})
|
| 406 |
+
|
| 407 |
+
####Thompson Sampling
|
| 408 |
+
uploadedTS <- reactive({
|
| 409 |
+
req(input$tsfile)
|
| 410 |
+
ext <- tools::file_ext(input$tsfile$name)
|
| 411 |
+
switch(ext,
|
| 412 |
+
csv = read.csv(input$tsfile$datapath, stringsAsFactors = FALSE),
|
| 413 |
+
xlsx = readxl::read_excel(input$tsfile$datapath),
|
| 414 |
+
xls = readxl::read_excel(input$tsfile$datapath),
|
| 415 |
+
stop("Unsupported file type: ", ext)
|
| 416 |
+
)
|
| 417 |
+
})
|
| 418 |
+
|
| 419 |
+
# Initialize actionDataTS similar to actionData for UCB
|
| 420 |
+
actionDataTS <- reactiveValues(
|
| 421 |
+
actions = NULL,
|
| 422 |
+
successes = NULL,
|
| 423 |
+
failures = NULL,
|
| 424 |
+
theta = NULL
|
| 425 |
+
)
|
| 426 |
+
|
| 427 |
+
|
| 428 |
+
output$selectStrategyColumnTS <- renderUI({
|
| 429 |
+
req(input$tsfile)
|
| 430 |
+
data <- uploadedTS()
|
| 431 |
+
selectInput("selectStrategyColumnTS", "Select Strategy Column",
|
| 432 |
+
choices = names(data), selected = names(data)[1])
|
| 433 |
+
})
|
| 434 |
+
|
| 435 |
+
output$selectRewardColumnTS <- renderUI({
|
| 436 |
+
req(input$tsfile)
|
| 437 |
+
data <- uploadedTS()
|
| 438 |
+
selectInput("selectRewardColumnTS", "Select Reward Column",
|
| 439 |
+
choices = names(data), selected = names(data)[2])
|
| 440 |
+
})
|
| 441 |
+
|
| 442 |
+
|
| 443 |
+
observeEvent(input$runMABTS, {
|
| 444 |
+
req(input$tsfile)
|
| 445 |
+
data <- uploadedTS()
|
| 446 |
+
|
| 447 |
+
strategyColumn <- input$selectStrategyColumnTS
|
| 448 |
+
rewardColumn <- input$selectRewardColumnTS
|
| 449 |
+
success_conditions <- unlist(strsplit(input$successConditionsTS, ",")) # split the input string into a vector
|
| 450 |
+
|
| 451 |
+
if (is.null(actionDataTS$actions)) {
|
| 452 |
+
actionDataTS$actions <- unique(data[[strategyColumn]])
|
| 453 |
+
actionDataTS$successes <- rep(1, length(actionDataTS$actions)) # Start with 1 success for beta distribution
|
| 454 |
+
actionDataTS$failures <- rep(1, length(actionDataTS$actions)) # Start with 1 failure for beta distribution
|
| 455 |
+
actionDataTS$theta <- rep(0, length(actionDataTS$actions))
|
| 456 |
+
actionDataTS$history <- list() # Initialize history for plotting
|
| 457 |
+
actionDataTS$selectionCount <- rep(0, length(actionDataTS$actions)) # Initialize with zeros
|
| 458 |
+
}
|
| 459 |
+
|
| 460 |
+
for (strategy in actionDataTS$actions) {
|
| 461 |
+
strategy_index <- which(actionDataTS$actions == strategy)
|
| 462 |
+
|
| 463 |
+
# Define strategy_data and num_successes/num_failures after defining strategy_index
|
| 464 |
+
strategy_data <- data[data[[strategyColumn]] == strategy, ]
|
| 465 |
+
strategy_data[[rewardColumn]] <- as.numeric(strategy_data[[rewardColumn]] %in% success_conditions) # Convert to binary
|
| 466 |
+
|
| 467 |
+
num_successes <- sum(strategy_data[[rewardColumn]], na.rm = TRUE)
|
| 468 |
+
num_failures <- nrow(strategy_data) - num_successes
|
| 469 |
+
|
| 470 |
+
actionDataTS$successes[strategy_index] <- actionDataTS$successes[strategy_index] + num_successes
|
| 471 |
+
actionDataTS$failures[strategy_index] <- actionDataTS$failures[strategy_index] + num_failures
|
| 472 |
+
actionDataTS$theta[strategy_index] <- rbeta(1, actionDataTS$successes[strategy_index], actionDataTS$failures[strategy_index])
|
| 473 |
+
actionDataTS$selectionCount[strategy_index] <- actionDataTS$selectionCount[strategy_index] + 1
|
| 474 |
+
|
| 475 |
+
# Update the history with the new data for plotting
|
| 476 |
+
if (is.null(actionDataTS$history[[strategy]])) {
|
| 477 |
+
actionDataTS$history[[strategy]] <- data.frame(Time = seq_along(strategy_data[[rewardColumn]]), Reward = strategy_data[[rewardColumn]])
|
| 478 |
+
} else {
|
| 479 |
+
actionDataTS$history[[strategy]] <- rbind(actionDataTS$history[[strategy]], data.frame(Time = seq_along(strategy_data[[rewardColumn]]) + nrow(actionDataTS$history[[strategy]]), Reward = strategy_data[[rewardColumn]]))
|
| 480 |
+
}
|
| 481 |
+
}
|
| 482 |
+
})
|
| 483 |
+
|
| 484 |
+
output$bestStrategyDisplayTS <- renderPrint({
|
| 485 |
+
req(actionDataTS$theta) # Ensure theta values have been calculated
|
| 486 |
+
best_strategy_index <- which.max(actionDataTS$theta)
|
| 487 |
+
best_strategy <- actionDataTS$actions[best_strategy_index] # Ensure this variable matches throughout your code
|
| 488 |
+
theta_value <- actionDataTS$theta[best_strategy_index]
|
| 489 |
+
|
| 490 |
+
cat("The best strategy is:", best_strategy, "\n",
|
| 491 |
+
"Estimated success probability (theta):", theta_value)
|
| 492 |
+
})
|
| 493 |
+
|
| 494 |
+
|
| 495 |
+
createPlotData <- function(history) {
|
| 496 |
+
if (is.list(history) && length(history) > 0 && all(sapply(history, is.data.frame))) {
|
| 497 |
+
# Combine all strategy data frames into one, adding a 'Strategy' column
|
| 498 |
+
plot_data <- do.call(rbind, lapply(names(history), function(strategy) {
|
| 499 |
+
strategy_data <- history[[strategy]]
|
| 500 |
+
if ("Time" %in% names(strategy_data) && "Reward" %in% names(strategy_data)) {
|
| 501 |
+
strategy_data$Strategy <- strategy # Add the 'Strategy' column
|
| 502 |
+
return(strategy_data)
|
| 503 |
+
} else {
|
| 504 |
+
# Return a data frame with missing values if required columns are not present
|
| 505 |
+
return(data.frame(Time = NA, Reward = NA, Strategy = strategy))
|
| 506 |
+
}
|
| 507 |
+
}))
|
| 508 |
+
# Remove rows with missing values
|
| 509 |
+
plot_data <- na.omit(plot_data)
|
| 510 |
+
return(plot_data)
|
| 511 |
+
} else {
|
| 512 |
+
# If history is not as expected, return an empty data frame with the correct columns
|
| 513 |
+
return(data.frame(Time = integer(0), Reward = numeric(0), Strategy = factor()))
|
| 514 |
+
}
|
| 515 |
+
}
|
| 516 |
+
|
| 517 |
+
|
| 518 |
+
output$rewardHistoryTS <- renderPlotly({
|
| 519 |
+
req(actionDataTS$history) # Ensure that the history is not NULL or empty
|
| 520 |
+
|
| 521 |
+
# Create the required plot_data using the createPlotData function
|
| 522 |
+
plot_data <- createPlotData(actionDataTS$history)
|
| 523 |
+
|
| 524 |
+
# Check if the plot_data has rows to plot
|
| 525 |
+
if (!is.null(plot_data) && nrow(plot_data) > 0) {
|
| 526 |
+
# Create the plot with plotly
|
| 527 |
+
plot_ly(
|
| 528 |
+
data = plot_data,
|
| 529 |
+
x = ~Time,
|
| 530 |
+
y = ~Reward,
|
| 531 |
+
color = ~Strategy,
|
| 532 |
+
type = 'scatter', # Use 'scatter' for line and point plots
|
| 533 |
+
mode = 'markers', # Combine line and marker styles
|
| 534 |
+
marker = list(color = 'rgba(74, 93, 191, 0.7))', line = list(color = 'rgba(55, 128, 191, 1.0)', width = 2)) # Optionally, adjust marker size
|
| 535 |
+
) %>%
|
| 536 |
+
layout(
|
| 537 |
+
title = "Reward History Over Time",
|
| 538 |
+
xaxis = list(title = "Time"),
|
| 539 |
+
yaxis = list(title = "Reward"),
|
| 540 |
+
hovermode = 'closest' # Improves tooltip behavior
|
| 541 |
+
)
|
| 542 |
+
} else {
|
| 543 |
+
# Provide a message or an empty plot if plot_data is empty
|
| 544 |
+
return(plotly_empty())
|
| 545 |
+
}
|
| 546 |
+
})
|
| 547 |
+
output$strFrePlotTS <- renderPlotly({
|
| 548 |
+
req(input$tsfile) # Make sure a file is uploaded
|
| 549 |
+
data <- uploadedTS() # Get the uploaded data
|
| 550 |
+
|
| 551 |
+
# Calculate the frequency of each strategy
|
| 552 |
+
strategy_freq <- table(data[[input$selectStrategyColumnTS]])
|
| 553 |
+
|
| 554 |
+
# Convert to a data frame for plotting
|
| 555 |
+
strategy_freq_df <- as.data.frame(strategy_freq)
|
| 556 |
+
|
| 557 |
+
# Create the plot with plotly
|
| 558 |
+
plot_ly(
|
| 559 |
+
data = strategy_freq_df,
|
| 560 |
+
x = ~Var1, # The strategy names
|
| 561 |
+
y = ~Freq, # The frequency counts
|
| 562 |
+
type = 'scatter', # Use a scatter chart
|
| 563 |
+
mode = 'markers',
|
| 564 |
+
marker = list(color = 'rgba(74, 93, 191, 0.7)', line = list(color = 'rgba(55, 128, 191, 1.0)', width = 2))
|
| 565 |
+
) %>%
|
| 566 |
+
layout(
|
| 567 |
+
title = "Strategy Frequency",
|
| 568 |
+
xaxis = list(title = "Strategy"),
|
| 569 |
+
yaxis = list(title = "Frequency"),
|
| 570 |
+
hovermode = 'closest'
|
| 571 |
+
)
|
| 572 |
+
})
|
| 573 |
+
|
| 574 |
+
####Linear Regression UCB
|
| 575 |
+
# Reactive value to store preprocessed data
|
| 576 |
+
datalrucb <- reactiveVal(NULL)
|
| 577 |
+
modelsList <- reactiveVal(list())
|
| 578 |
+
# Function to read and clean data
|
| 579 |
+
read_data <- function(filepath) {
|
| 580 |
+
ext <- tools::file_ext(filepath)
|
| 581 |
+
if (ext == "csv") {
|
| 582 |
+
read.csv(filepath, stringsAsFactors = FALSE)
|
| 583 |
+
} else if (ext == "xlsx") {
|
| 584 |
+
readxl::read_excel(filepath)
|
| 585 |
+
} else {
|
| 586 |
+
stop("Invalid file format. Please select a CSV or XLSX file.")
|
| 587 |
+
}
|
| 588 |
+
}
|
| 589 |
+
|
| 590 |
+
clean_column_names <- function(dataframe) {
|
| 591 |
+
colnames(dataframe) <- gsub("[^[:alnum:]_]", "", make.names(colnames(dataframe), unique = TRUE))
|
| 592 |
+
return(dataframe)
|
| 593 |
+
}
|
| 594 |
+
|
| 595 |
+
# Observe load data button click
|
| 596 |
+
observeEvent(input$loadlrucb, {
|
| 597 |
+
file <- input$lrucbfile
|
| 598 |
+
req(file)
|
| 599 |
+
data_lrucb <- read_data(file$datapath)
|
| 600 |
+
data_lrucb <- clean_column_names(data_lrucb)
|
| 601 |
+
datalrucb(data_lrucb) # Store the data
|
| 602 |
+
updateSelectInput(session, "targetlrucb", choices = colnames(data_lrucb))
|
| 603 |
+
updateSelectizeInput(session, "independentVarlrucb", choices = setdiff(colnames(data_lrucb), input$targetlrucb))
|
| 604 |
+
})
|
| 605 |
+
|
| 606 |
+
# Function to perform safe regression
|
| 607 |
+
safe_regression <- function(data, responseVar, var) {
|
| 608 |
+
tryCatch({
|
| 609 |
+
# Print types to debug
|
| 610 |
+
#print(paste("Type of response variable:", class(data[[responseVar]])))
|
| 611 |
+
#print(paste("Type of independent variable:", class(data[[var]])))
|
| 612 |
+
|
| 613 |
+
#if(!is.numeric(data[[var]])) {
|
| 614 |
+
#stop(paste(var, "is not numeric and will be skipped."))
|
| 615 |
+
#}
|
| 616 |
+
#if(!is.numeric(data[[responseVar]])) {
|
| 617 |
+
#stop(paste(responseVar, "is not numeric and will be skipped."))
|
| 618 |
+
#}
|
| 619 |
+
|
| 620 |
+
# Check for missing or infinite values
|
| 621 |
+
#if(any(!is.finite(data[[var]])) || any(!is.finite(data[[responseVar]]))) {
|
| 622 |
+
#stop("Non-finite values detected in variables.")
|
| 623 |
+
#}
|
| 624 |
+
# Assuming 'data' is your data frame and 'responseVar' and 'var' are column names
|
| 625 |
+
data <- na.omit(data[c(responseVar, var)])
|
| 626 |
+
formula <- as.formula(paste(responseVar, "~", var))
|
| 627 |
+
model <- lm(formula, data = data)
|
| 628 |
+
summary_model <- summary(model)
|
| 629 |
+
ucb_estimate <- summary_model$coefficients[var, "Estimate"]
|
| 630 |
+
# Store the entire model object along with variable names
|
| 631 |
+
return(list(variable = var, model = model, ucb_estimate = ucb_estimate))
|
| 632 |
+
}, error = function(e) {
|
| 633 |
+
message("Error in regression with variable: ", var, "; Error: ", e$message)
|
| 634 |
+
return(NULL) # Skip this variable
|
| 635 |
+
})
|
| 636 |
+
}
|
| 637 |
+
|
| 638 |
+
|
| 639 |
+
# Perform regression on Run Model button click
|
| 640 |
+
observeEvent(input$runModellrucb, {
|
| 641 |
+
data <- req(datalrucb())
|
| 642 |
+
responseVar <- req(input$targetlrucb)
|
| 643 |
+
var <- req(input$independentVarlrucb)
|
| 644 |
+
|
| 645 |
+
if(!responseVar %in% names(data)) {
|
| 646 |
+
stop("Selected response variable is not in the dataset.")
|
| 647 |
+
}
|
| 648 |
+
|
| 649 |
+
results <- safe_regression(data, responseVar, var)
|
| 650 |
+
modelsList(list(results)) # Append new result to the list
|
| 651 |
+
output$modelSummarylrucb <- renderPrint({
|
| 652 |
+
req(results)
|
| 653 |
+
if (is.null(results$ucb_estimate)) {
|
| 654 |
+
paste("Regression could not be performed for variable:", var)
|
| 655 |
+
} else {
|
| 656 |
+
paste("UCB estimate for variable", var, "is", results$ucb_estimate)
|
| 657 |
+
}
|
| 658 |
+
})
|
| 659 |
+
})
|
| 660 |
+
|
| 661 |
+
# Server function to create diagnostic plots
|
| 662 |
+
output$resFitlrucbPlot <- renderPlotly({
|
| 663 |
+
req(modelsList(), datalrucb())
|
| 664 |
+
models <- req(modelsList())
|
| 665 |
+
|
| 666 |
+
# Use the first model for the plot as an example
|
| 667 |
+
if (length(models) >= 1 && !is.null(models[[1]]$model)) {
|
| 668 |
+
fitted_model <- models[[1]]$model
|
| 669 |
+
p <- ggplot(fitted_model, aes(.fitted, .resid)) +
|
| 670 |
+
geom_point(color = "darkorange") +
|
| 671 |
+
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") +
|
| 672 |
+
labs(title = "Residuals vs Fitted", x = "Fitted Values", y = "Residuals")
|
| 673 |
+
|
| 674 |
+
ggplotly(p)
|
| 675 |
+
} else {
|
| 676 |
+
return(NULL) # No models to plot
|
| 677 |
+
}
|
| 678 |
+
})
|
| 679 |
+
|
| 680 |
+
|
| 681 |
+
output$qqPlotlrucb <- renderPlotly({
|
| 682 |
+
req(modelsList(), datalrucb())
|
| 683 |
+
models <- req(modelsList())
|
| 684 |
+
|
| 685 |
+
# Use the first model for the plot as an example
|
| 686 |
+
if (length(models) >= 1 && !is.null(models[[1]]$model)) {
|
| 687 |
+
fitted_model <- models[[1]]$model
|
| 688 |
+
p <- ggplot(fitted_model, aes(sample = .stdresid)) +
|
| 689 |
+
stat_qq(color = "darkorange") +
|
| 690 |
+
stat_qq_line(color = "dodgerblue") +
|
| 691 |
+
labs(title = "Normal Q-Q")
|
| 692 |
+
|
| 693 |
+
ggplotly(p)
|
| 694 |
+
} else {
|
| 695 |
+
return(NULL) # No models to plot
|
| 696 |
+
}
|
| 697 |
+
})
|
| 698 |
+
|
| 699 |
+
output$scaleLoclrucbPlot <- renderPlotly({
|
| 700 |
+
req(modelsList(), datalrucb())
|
| 701 |
+
models <- req(modelsList())
|
| 702 |
+
|
| 703 |
+
# Use the first model for the plot as an example
|
| 704 |
+
if (length(models) >= 1 && !is.null(models[[1]]$model)) {
|
| 705 |
+
fitted_model <- models[[1]]$model
|
| 706 |
+
p <- ggplot(fitted_model, aes(.fitted, sqrt(abs(.resid)))) +
|
| 707 |
+
geom_point(color = "darkorange") +
|
| 708 |
+
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") +
|
| 709 |
+
labs(title = "Scale-Location", x = "Fitted Values", y = "Sqrt(|Residuals|)")
|
| 710 |
+
|
| 711 |
+
ggplotly(p)
|
| 712 |
+
} else {
|
| 713 |
+
return(NULL) # No models to plot
|
| 714 |
+
}
|
| 715 |
+
})
|
| 716 |
+
|
| 717 |
+
output$resLevlrucbPlot <- renderPlotly({
|
| 718 |
+
req(modelsList(), datalrucb())
|
| 719 |
+
models <- req(modelsList())
|
| 720 |
+
|
| 721 |
+
# Use the first model for the plot as an example
|
| 722 |
+
if (length(models) >= 1 && !is.null(models[[1]]$model)) {
|
| 723 |
+
fitted_model <- models[[1]]$model
|
| 724 |
+
p <- ggplot(fitted_model, aes(.hat, .stdresid)) +
|
| 725 |
+
geom_point(aes(size = .cooksd), shape = 1, color = "darkorange") +
|
| 726 |
+
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") +
|
| 727 |
+
labs(title = "Residuals vs Leverage", x = "Leverage", y = "Standardized Residuals")
|
| 728 |
+
|
| 729 |
+
ggplotly(p)
|
| 730 |
+
} else {
|
| 731 |
+
return(NULL) # No models to plot
|
| 732 |
+
}
|
| 733 |
+
})
|
| 734 |
+
|
| 735 |
+
output$regressionPlot <- renderPlotly({
|
| 736 |
+
req(modelsList(), datalrucb())
|
| 737 |
+
fitted_model <- modelsList()
|
| 738 |
+
data_for_plot <- datalrucb()
|
| 739 |
+
|
| 740 |
+
# Ensure the target and independent variables are provided
|
| 741 |
+
target_col <- input$targetlrucb
|
| 742 |
+
independent_var <- input$independentVarlrucb
|
| 743 |
+
if (is.null(data_for_plot[[target_col]]) || is.null(data_for_plot[[independent_var]])) {
|
| 744 |
+
return("Target or independent variable not found in the data.")
|
| 745 |
+
}
|
| 746 |
+
|
| 747 |
+
# Creating the plot with added color
|
| 748 |
+
p <- ggplot(data_for_plot, aes_string(x = independent_var, y = target_col)) +
|
| 749 |
+
geom_point(color = "darkorange") + # Change color of points
|
| 750 |
+
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") + # Change color of regression line
|
| 751 |
+
ggtitle("Regression Line Plot") +
|
| 752 |
+
xlab(independent_var) +
|
| 753 |
+
ylab(target_col) +
|
| 754 |
+
theme_minimal() + # Adding a minimal theme for a cleaner look
|
| 755 |
+
theme(legend.position = "none") # Remove legend if not needed
|
| 756 |
+
|
| 757 |
+
# Convert ggplot object to Plotly for an interactive plot
|
| 758 |
+
ggplotly(p)
|
| 759 |
+
})
|
| 760 |
+
|
| 761 |
+
}
|
| 762 |
+
|
| 763 |
+
shinyApp(ui, server)
|