Spaces:
Sleeping
Sleeping
library(shiny) | |
library(shinyjs) | |
library(bslib) | |
library(dplyr) | |
library(ggplot2) | |
library(tm) | |
library(SnowballC) | |
library(plotly) | |
library(text2vec) | |
library(tokenizers) | |
library(dplyr) | |
library(tidyr) | |
library(igraph) | |
library(ggraph) | |
library(topicmodels) | |
library(wordcloud) | |
library(wordcloud2) | |
library(reshape2) | |
library(SnowballC) | |
library(RColorBrewer) | |
library(syuzhet) | |
library(cluster) | |
library(tidytext) | |
library(word2vec) | |
library(Rtsne) | |
library(umap) | |
library(MASS) | |
library(koRpus) | |
library(openxlsx) | |
library(tools) | |
library(shinyWidgets) | |
library(reticulate) | |
library(keras) | |
library(tensorflow) | |
library(neuralnet) | |
library(rsample) | |
library(tfdatasets) | |
library(statnet) | |
library(UserNetR) | |
library(visNetwork) | |
library(networkD3) | |
library(ergm) | |
library(ergm.count) | |
library(network) | |
library(tidyverse) | |
options(width = 150) | |
options(digits = 4, scipen = 1000000000) | |
options(shiny.maxRequestSize=30*1024^2) | |
ui <- fluidPage( | |
theme = bs_theme(version = 5, bootswatch = "spacelab"), | |
useShinyjs(), # Initialize shinyjs | |
titlePanel("PtteM Data Science"), | |
tags$head(tags$link(rel = "stylesheet", href="https://fonts.googleapis.com/css?family=Montserrat:100,300,400,700&display=swap"), | |
tags$style(HTML(" | |
body, h1, h2, h3, h4, h5, h6, .nav, p, a, .shiny-input-container { | |
font-family: 'Montserrat'; /* Font type for the title attribute */ | |
font-weight: 385; | |
color: #007c9e !important; | |
} | |
* { | |
font-family: 'Montserrat', sans-serif; | |
font-weight: 385; | |
color: #195576; /* Blue color */ | |
} | |
body { | |
background-color: #f7f7f7; /* Light gray background */ | |
} | |
.icon-btn { | |
border: 1px solid #0d6efd; /* Example border: solid, 2 pixels, #555 color */ | |
border-radius: 15%; /* Circular border */ | |
color: #00969e; /* Icon color */ | |
font-family: 'Montserrat'; /* Font type for the title attribute */ | |
font-weight: 385; | |
background-color: #f7f7f7; | |
padding: 125px; /* Space around the icon */ | |
margin: 25px; /* Space around the button */ | |
font-size: 24px; /* Icon size */ | |
box-shadow: 0 2px 4px rgba(0,0,0,0.2); | |
} | |
.icon-btn:hover { | |
color: #00969e; /* Icon color on hover */ | |
border-color: #007c9e; | |
background-color: #ebfbfd;/* Border color on hover */ | |
} | |
/* Add custom styles here */ | |
.shiny-input-container { | |
margin-bottom: 15px; | |
} | |
.box { | |
border: 1px solid #ddd; | |
padding: 20px; | |
border-radius: 50px; | |
margin-bottom: 200px; | |
gap: 200px; | |
align-items: center; | |
} | |
#statsTable_wrapper { | |
margin: 0 auto; | |
} | |
.shiny-output-error { | |
border: 1px solid #FF0000; /* Red border on error */ | |
} | |
/* If you want to change the font size of the tooltip, you can add custom CSS for the 'title' attribute's default styling. */ | |
"))), | |
tags$head( | |
# Include JavaScript to reload the page | |
tags$script(HTML(" | |
document.addEventListener('DOMContentLoaded', function() { | |
document.getElementById('myElement').style.color = '#0d6efd'; // Change to your desired color | |
}); | |
")) | |
), | |
tags$head( | |
tags$script(HTML(" | |
function reloadPage() { | |
window.location.reload(); | |
} | |
")) | |
), | |
# Refresh button that calls the JavaScript function | |
actionButton("refresh", "Refresh Analysis", onclick = "reloadPage();"), | |
# Help Text or Information for the user | |
helpText("Bu uygulama ile pekiştirmeli öğrenme başlığı altındaki veri bilimi fonksiyonlarına erişebilirsiniz."), | |
#Reinforcement Learning | |
h2("Reinforcement Learning Section"), | |
tabsetPanel( | |
tabPanel("Multi-Armed Bandit (MAB) Algorithms", | |
tabsetPanel( | |
tabPanel("Epsilon-Greedy", | |
sidebarLayout( | |
sidebarPanel( | |
fileInput('epsgreefile', 'Upload Data File', accept = c(".csv", ".xlsx", ".xls")), | |
uiOutput('selectActionColumn'), | |
uiOutput('selectRewardColumn'), | |
numericInput("epsilon", "Epsilon (Exploration Rate)", value = 0.1, min = 0, max = 1, step = 0.01), | |
actionButton("runMAB", "Run MAB Decision"), | |
), | |
mainPanel( | |
tableOutput("actionResults"), | |
textOutput("selectedAction"), | |
) | |
) | |
), | |
tabPanel("Upper Confidence Bound (UCB)", | |
sidebarLayout( | |
sidebarPanel( | |
fileInput("ucbfile", "Upload Data File", accept = c(".csv", ".xlsx", ".xls")), | |
uiOutput("selectStrategyColucb"), | |
uiOutput("selectRewardColucb"), | |
numericInput("epsilon", "Epsilon (Exploration Rate)", value = 0.1, min = 0, max = 1, step = 0.01), | |
actionButton("runMABucb", "Run MAB Decision") | |
), | |
mainPanel( | |
tabsetPanel( | |
tabPanel("Results", tableOutput("actionResultsucb")), | |
tabPanel("Reward History", plotlyOutput("rewardHistoryucb", width = "100%", height = "750px")) | |
) | |
) | |
) | |
), | |
tabPanel("Thompson Sampling", | |
sidebarLayout( | |
sidebarPanel( | |
fileInput("tsfile", "Upload Data File", accept = c(".csv", ".xlsx", ".xls")), | |
uiOutput("selectStrategyColumnTS"), # This should be in the UI part | |
uiOutput("selectRewardColumnTS"), | |
textInput("successConditionsTS", "Enter success conditions (comma separated)"), | |
actionButton("runMABTS", "Run MAB Thompson Sampling") | |
), | |
mainPanel( | |
tabsetPanel( | |
tabPanel("Best Display", verbatimTextOutput("bestStrategyDisplayTS")), | |
tabPanel("Reward History TS", plotlyOutput("rewardHistoryTS", width = "100%", height = "750px")), | |
tabPanel("Strategy Frequency", plotlyOutput("strFrePlotTS", width = "100%", height = "750px")) | |
) | |
) | |
) | |
), | |
) | |
), | |
tabPanel("Contextual Bandits", | |
tabsetPanel( | |
tabPanel("Linear Regression UCB", | |
sidebarLayout( | |
sidebarPanel( | |
fileInput("lrucbfile", "Upload your dataset", accept = c(".csv", ".xlsx", ".xls")), | |
actionButton("loadlrucb", "Load Data"), | |
selectInput("targetlrucb", "Select Target Column", choices = NULL), | |
selectizeInput("independentVarlrucb", "Select Independent Variable", choices = NULL, multiple = FALSE), | |
actionButton("runModellrucb", "Run Linear Regression UCB") | |
), | |
mainPanel( | |
tabsetPanel( | |
tabPanel("Model Summary", verbatimTextOutput("modelSummarylrucb")), | |
tabPanel("Diagnostics", | |
plotlyOutput("resFitlrucbPlot"), | |
plotlyOutput("qqPlotlrucb"), | |
plotlyOutput("scaleLoclrucbPlot"), | |
plotlyOutput("resLevlrucbPlot") | |
), | |
tabPanel("Regression Plot", plotlyOutput("regressionPlot", width = "100%", height = "750px")) | |
) | |
) | |
) | |
) | |
) | |
) | |
) | |
) | |
server <- function(input, output, session) { | |
##Reinforcement Learning | |
###Multi-Armed Bandit (MAB) Algorithms | |
####Epsilon-Greedy | |
# Reactive to store uploaded data | |
uploadedepsgree <- reactive({ | |
req(input$epsgreefile) | |
ext <- tools::file_ext(input$epsgreefile$name) | |
switch(ext, | |
csv = read.csv(input$epsgreefile$datapath, stringsAsFactors = FALSE), | |
xlsx = readxl::read_excel(input$epsgreefile$datapath), | |
stop("Unsupported file type")) | |
}) | |
# Dynamic UI to select the action and reward columns | |
output$selectActionColumn <- renderUI({ | |
df <- uploadedepsgree() | |
req(df) | |
selectInput("actionColumn", "Select Action Column", choices = names(df)) | |
}) | |
output$selectRewardColumn <- renderUI({ | |
df <- uploadedepsgree() | |
req(df) | |
selectInput("rewardColumn", "Select Reward Column", choices = names(df)) | |
}) | |
# Reactive values to store actions and performance metrics | |
actionRewards <- reactiveValues(actions = NULL, rewards = NULL, counts = NULL) | |
observeEvent(input$runMAB, { | |
req(input$epsilon, input$actionColumn, input$rewardColumn) | |
df <- uploadedepsgree() | |
df <- df %>% dplyr::select(all_of(input$actionColumn), all_of(input$rewardColumn)) %>% na.omit() | |
uniqueActions <- unique(df[[input$actionColumn]]) | |
summedRewards <- tapply(df[[input$rewardColumn]], df[[input$actionColumn]], sum, na.rm = TRUE) | |
# Store processed data in actionRewards | |
actionRewards$actions <- uniqueActions | |
actionRewards$rewards <- summedRewards | |
actionRewards$counts <- rep(10, length(uniqueActions)) # Initialize with some counts | |
# Run epsilon-greedy algorithm | |
if (runif(1) < input$epsilon) { | |
# Exploration | |
selectedActionIndex <- sample(length(uniqueActions), 1) | |
} else { | |
# Exploitation | |
averages <- summedRewards / actionRewards$counts | |
selectedActionIndex <- which.max(averages) | |
} | |
selectedAction <- uniqueActions[selectedActionIndex] | |
simulatedReward <- runif(1, min = 0, max = max(summedRewards)) # Simulate a reward | |
actionRewards$rewards[selectedActionIndex] <- actionRewards$rewards[selectedActionIndex] + simulatedReward | |
actionRewards$counts[selectedActionIndex] <- actionRewards$counts[selectedActionIndex] + 1 | |
# Update UI | |
output$selectedAction <- renderText({ selectedAction }) | |
output$actionResults <- renderTable({ | |
data.frame(Action = actionRewards$actions, Reward = actionRewards$rewards, Count = actionRewards$counts) | |
}) | |
}) | |
####Upper Confidence Bound (UCB) | |
# Reactive values to store actions and performance metrics | |
actionData <- reactiveValues( | |
actions = NULL, | |
counts = NULL, | |
rewards = NULL, | |
history = list() # Initialize the history list here | |
) | |
uploadeducb <- reactive({ | |
req(input$ucbfile) | |
ext <- tools::file_ext(input$ucbfile$name) | |
switch(ext, | |
csv = read.csv(input$ucbfile$datapath, stringsAsFactors = FALSE), | |
xlsx = readxl::read_excel(input$ucbfile$datapath), | |
xls = readxl::read_excel(input$ucbfile$datapath), | |
stop("Unsupported file type") | |
) | |
}) | |
output$selectStrategyColucb <- renderUI({ | |
req(input$ucbfile) | |
data <- uploadeducb() | |
selectInput("strategyColumn", "Select Strategy Column", | |
choices = names(data), selected = names(data)[1]) | |
}) | |
output$selectRewardColucb <- renderUI({ | |
req(input$ucbfile) | |
data <- uploadeducb() | |
selectInput("rewardColumn", "Select Reward Column", | |
choices = names(data), selected = names(data)[2]) | |
}) | |
observeEvent(input$runMABucb, { | |
data <- uploadeducb() | |
strategyColumn <- input$strategyColumn | |
rewardColumn <- input$rewardColumn | |
# Ensure numerical data for computation | |
data[[rewardColumn]] <- as.numeric(as.character(data[[rewardColumn]])) | |
# Unique strategies | |
strategies <- unique(data[[strategyColumn]]) | |
n <- nrow(data) # Total number of events | |
if (is.null(actionData$actions)) { | |
actionData$actions <- strategies | |
actionData$counts <- rep(0, length(strategies)) | |
actionData$rewards <- rep(0, length(strategies)) | |
# Initialize history for each strategy | |
actionData$history <- setNames(vector("list", length(strategies)), strategies) | |
for(strategy in strategies) { | |
actionData$history[[strategy]] <- data.frame(Time = integer(), Reward = numeric()) | |
} | |
} | |
# Loop over strategies to compute UCB and update history | |
for (strategy in strategies) { | |
strategy_data <- data[data[[strategyColumn]] == strategy, ] | |
ni <- nrow(strategy_data) # Number of times this strategy was tried | |
avg_reward <- mean(strategy_data[[rewardColumn]], na.rm = TRUE) | |
if (ni > 0) { | |
ucb_value <- avg_reward + sqrt((2 * log(n)) / ni) | |
} else { | |
ucb_value <- Inf # Encourage exploration of untried strategies | |
} | |
# Define strategy_index here, inside the loop, before you use it | |
strategy_index <- which(actionData$actions == strategy) | |
actionData$counts[strategy_index] <- actionData$counts[strategy_index] + ni | |
actionData$rewards[strategy_index] <- ucb_value | |
actionData$history[[strategy]] <- rbind( | |
actionData$history[[strategy]], | |
data.frame(Time = as.integer(actionData$counts[strategy_index]), Reward = ucb_value) | |
) | |
} | |
# After the loop, the history should be updated | |
}) | |
output$actionResultsucb <- renderTable({ | |
req(actionData$actions) # Ensure the action data is not NULL | |
data.frame( | |
Strategy = actionData$actions, | |
Counts = actionData$counts, | |
Rewards = actionData$rewards | |
) | |
}) | |
# Create the plot in a separate reactive context, responding to changes in actionData | |
output$rewardHistoryucb <- renderPlotly({ | |
req(actionData$history) # Ensure that the history is not NULL or empty | |
# Create plot_data for plotting | |
plot_data <- do.call(rbind, Filter(Negate(is.null), lapply(names(actionData$history), function(strategy) { | |
history_data <- actionData$history[[strategy]] | |
if(nrow(history_data) > 0) { | |
return(data.frame(Strategy = strategy, Time = history_data$Time, Reward = history_data$Reward)) | |
} | |
}))) | |
# Only attempt to create a plot if plot_data is a data frame and not NULL | |
if(!is.null(plot_data) && is.data.frame(plot_data)) { | |
# Create a custom color palette with as many colors as there are strategies | |
colors <- grDevices::colorRampPalette(RColorBrewer::brewer.pal(8, "Set2"))(length(unique(plot_data$Strategy))) | |
plot_ly(plot_data, x = ~Time, y = ~Reward, color = ~Strategy, colors = colors, type = 'scatter', mode = 'lines+markers') %>% | |
layout(title = "Reward History Over Time", | |
xaxis = list(title = "Time"), | |
yaxis = list(title = "Reward")) | |
} else { | |
plot_ly() %>% | |
add_annotations(text = "No data available for plot", x = 0.5, y = 0.5, showarrow = FALSE, xref = "paper", yref = "paper") | |
} | |
}) | |
####Thompson Sampling | |
uploadedTS <- reactive({ | |
req(input$tsfile) | |
ext <- tools::file_ext(input$tsfile$name) | |
switch(ext, | |
csv = read.csv(input$tsfile$datapath, stringsAsFactors = FALSE), | |
xlsx = readxl::read_excel(input$tsfile$datapath), | |
xls = readxl::read_excel(input$tsfile$datapath), | |
stop("Unsupported file type: ", ext) | |
) | |
}) | |
# Initialize actionDataTS similar to actionData for UCB | |
actionDataTS <- reactiveValues( | |
actions = NULL, | |
successes = NULL, | |
failures = NULL, | |
theta = NULL | |
) | |
output$selectStrategyColumnTS <- renderUI({ | |
req(input$tsfile) | |
data <- uploadedTS() | |
selectInput("selectStrategyColumnTS", "Select Strategy Column", | |
choices = names(data), selected = names(data)[1]) | |
}) | |
output$selectRewardColumnTS <- renderUI({ | |
req(input$tsfile) | |
data <- uploadedTS() | |
selectInput("selectRewardColumnTS", "Select Reward Column", | |
choices = names(data), selected = names(data)[2]) | |
}) | |
observeEvent(input$runMABTS, { | |
req(input$tsfile) | |
data <- uploadedTS() | |
strategyColumn <- input$selectStrategyColumnTS | |
rewardColumn <- input$selectRewardColumnTS | |
success_conditions <- unlist(strsplit(input$successConditionsTS, ",")) # split the input string into a vector | |
if (is.null(actionDataTS$actions)) { | |
actionDataTS$actions <- unique(data[[strategyColumn]]) | |
actionDataTS$successes <- rep(1, length(actionDataTS$actions)) # Start with 1 success for beta distribution | |
actionDataTS$failures <- rep(1, length(actionDataTS$actions)) # Start with 1 failure for beta distribution | |
actionDataTS$theta <- rep(0, length(actionDataTS$actions)) | |
actionDataTS$history <- list() # Initialize history for plotting | |
actionDataTS$selectionCount <- rep(0, length(actionDataTS$actions)) # Initialize with zeros | |
} | |
for (strategy in actionDataTS$actions) { | |
strategy_index <- which(actionDataTS$actions == strategy) | |
# Define strategy_data and num_successes/num_failures after defining strategy_index | |
strategy_data <- data[data[[strategyColumn]] == strategy, ] | |
strategy_data[[rewardColumn]] <- as.numeric(strategy_data[[rewardColumn]] %in% success_conditions) # Convert to binary | |
num_successes <- sum(strategy_data[[rewardColumn]], na.rm = TRUE) | |
num_failures <- nrow(strategy_data) - num_successes | |
actionDataTS$successes[strategy_index] <- actionDataTS$successes[strategy_index] + num_successes | |
actionDataTS$failures[strategy_index] <- actionDataTS$failures[strategy_index] + num_failures | |
actionDataTS$theta[strategy_index] <- rbeta(1, actionDataTS$successes[strategy_index], actionDataTS$failures[strategy_index]) | |
actionDataTS$selectionCount[strategy_index] <- actionDataTS$selectionCount[strategy_index] + 1 | |
# Update the history with the new data for plotting | |
if (is.null(actionDataTS$history[[strategy]])) { | |
actionDataTS$history[[strategy]] <- data.frame(Time = seq_along(strategy_data[[rewardColumn]]), Reward = strategy_data[[rewardColumn]]) | |
} else { | |
actionDataTS$history[[strategy]] <- rbind(actionDataTS$history[[strategy]], data.frame(Time = seq_along(strategy_data[[rewardColumn]]) + nrow(actionDataTS$history[[strategy]]), Reward = strategy_data[[rewardColumn]])) | |
} | |
} | |
}) | |
output$bestStrategyDisplayTS <- renderPrint({ | |
req(actionDataTS$theta) # Ensure theta values have been calculated | |
best_strategy_index <- which.max(actionDataTS$theta) | |
best_strategy <- actionDataTS$actions[best_strategy_index] # Ensure this variable matches throughout your code | |
theta_value <- actionDataTS$theta[best_strategy_index] | |
cat("The best strategy is:", best_strategy, "\n", | |
"Estimated success probability (theta):", theta_value) | |
}) | |
createPlotData <- function(history) { | |
if (is.list(history) && length(history) > 0 && all(sapply(history, is.data.frame))) { | |
# Combine all strategy data frames into one, adding a 'Strategy' column | |
plot_data <- do.call(rbind, lapply(names(history), function(strategy) { | |
strategy_data <- history[[strategy]] | |
if ("Time" %in% names(strategy_data) && "Reward" %in% names(strategy_data)) { | |
strategy_data$Strategy <- strategy # Add the 'Strategy' column | |
return(strategy_data) | |
} else { | |
# Return a data frame with missing values if required columns are not present | |
return(data.frame(Time = NA, Reward = NA, Strategy = strategy)) | |
} | |
})) | |
# Remove rows with missing values | |
plot_data <- na.omit(plot_data) | |
return(plot_data) | |
} else { | |
# If history is not as expected, return an empty data frame with the correct columns | |
return(data.frame(Time = integer(0), Reward = numeric(0), Strategy = factor())) | |
} | |
} | |
output$rewardHistoryTS <- renderPlotly({ | |
req(actionDataTS$history) # Ensure that the history is not NULL or empty | |
# Create the required plot_data using the createPlotData function | |
plot_data <- createPlotData(actionDataTS$history) | |
# Check if the plot_data has rows to plot | |
if (!is.null(plot_data) && nrow(plot_data) > 0) { | |
# Create the plot with plotly | |
plot_ly( | |
data = plot_data, | |
x = ~Time, | |
y = ~Reward, | |
color = ~Strategy, | |
type = 'scatter', # Use 'scatter' for line and point plots | |
mode = 'markers', # Combine line and marker styles | |
marker = list(color = 'rgba(74, 93, 191, 0.7))', line = list(color = 'rgba(55, 128, 191, 1.0)', width = 2)) # Optionally, adjust marker size | |
) %>% | |
layout( | |
title = "Reward History Over Time", | |
xaxis = list(title = "Time"), | |
yaxis = list(title = "Reward"), | |
hovermode = 'closest' # Improves tooltip behavior | |
) | |
} else { | |
# Provide a message or an empty plot if plot_data is empty | |
return(plotly_empty()) | |
} | |
}) | |
output$strFrePlotTS <- renderPlotly({ | |
req(input$tsfile) # Make sure a file is uploaded | |
data <- uploadedTS() # Get the uploaded data | |
# Calculate the frequency of each strategy | |
strategy_freq <- table(data[[input$selectStrategyColumnTS]]) | |
# Convert to a data frame for plotting | |
strategy_freq_df <- as.data.frame(strategy_freq) | |
# Create the plot with plotly | |
plot_ly( | |
data = strategy_freq_df, | |
x = ~Var1, # The strategy names | |
y = ~Freq, # The frequency counts | |
type = 'scatter', # Use a scatter chart | |
mode = 'markers', | |
marker = list(color = 'rgba(74, 93, 191, 0.7)', line = list(color = 'rgba(55, 128, 191, 1.0)', width = 2)) | |
) %>% | |
layout( | |
title = "Strategy Frequency", | |
xaxis = list(title = "Strategy"), | |
yaxis = list(title = "Frequency"), | |
hovermode = 'closest' | |
) | |
}) | |
####Linear Regression UCB | |
# Reactive value to store preprocessed data | |
datalrucb <- reactiveVal(NULL) | |
modelsList <- reactiveVal(list()) | |
# Function to read and clean data | |
read_data <- function(filepath) { | |
ext <- tools::file_ext(filepath) | |
if (ext == "csv") { | |
read.csv(filepath, stringsAsFactors = FALSE) | |
} else if (ext == "xlsx") { | |
readxl::read_excel(filepath) | |
} else { | |
stop("Invalid file format. Please select a CSV or XLSX file.") | |
} | |
} | |
clean_column_names <- function(dataframe) { | |
colnames(dataframe) <- gsub("[^[:alnum:]_]", "", make.names(colnames(dataframe), unique = TRUE)) | |
return(dataframe) | |
} | |
# Observe load data button click | |
observeEvent(input$loadlrucb, { | |
file <- input$lrucbfile | |
req(file) | |
data_lrucb <- read_data(file$datapath) | |
data_lrucb <- clean_column_names(data_lrucb) | |
datalrucb(data_lrucb) # Store the data | |
updateSelectInput(session, "targetlrucb", choices = colnames(data_lrucb)) | |
updateSelectizeInput(session, "independentVarlrucb", choices = setdiff(colnames(data_lrucb), input$targetlrucb)) | |
}) | |
# Function to perform safe regression | |
safe_regression <- function(data, responseVar, var) { | |
tryCatch({ | |
# Print types to debug | |
#print(paste("Type of response variable:", class(data[[responseVar]]))) | |
#print(paste("Type of independent variable:", class(data[[var]]))) | |
#if(!is.numeric(data[[var]])) { | |
#stop(paste(var, "is not numeric and will be skipped.")) | |
#} | |
#if(!is.numeric(data[[responseVar]])) { | |
#stop(paste(responseVar, "is not numeric and will be skipped.")) | |
#} | |
# Check for missing or infinite values | |
#if(any(!is.finite(data[[var]])) || any(!is.finite(data[[responseVar]]))) { | |
#stop("Non-finite values detected in variables.") | |
#} | |
# Assuming 'data' is your data frame and 'responseVar' and 'var' are column names | |
data <- na.omit(data[c(responseVar, var)]) | |
formula <- as.formula(paste(responseVar, "~", var)) | |
model <- lm(formula, data = data) | |
summary_model <- summary(model) | |
ucb_estimate <- summary_model$coefficients[var, "Estimate"] | |
# Store the entire model object along with variable names | |
return(list(variable = var, model = model, ucb_estimate = ucb_estimate)) | |
}, error = function(e) { | |
message("Error in regression with variable: ", var, "; Error: ", e$message) | |
return(NULL) # Skip this variable | |
}) | |
} | |
# Perform regression on Run Model button click | |
observeEvent(input$runModellrucb, { | |
data <- req(datalrucb()) | |
responseVar <- req(input$targetlrucb) | |
var <- req(input$independentVarlrucb) | |
if(!responseVar %in% names(data)) { | |
stop("Selected response variable is not in the dataset.") | |
} | |
results <- safe_regression(data, responseVar, var) | |
modelsList(list(results)) # Append new result to the list | |
output$modelSummarylrucb <- renderPrint({ | |
req(results) | |
if (is.null(results$ucb_estimate)) { | |
paste("Regression could not be performed for variable:", var) | |
} else { | |
paste("UCB estimate for variable", var, "is", results$ucb_estimate) | |
} | |
}) | |
}) | |
# Server function to create diagnostic plots | |
output$resFitlrucbPlot <- renderPlotly({ | |
req(modelsList(), datalrucb()) | |
models <- req(modelsList()) | |
# Use the first model for the plot as an example | |
if (length(models) >= 1 && !is.null(models[[1]]$model)) { | |
fitted_model <- models[[1]]$model | |
p <- ggplot(fitted_model, aes(.fitted, .resid)) + | |
geom_point(color = "darkorange") + | |
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") + | |
labs(title = "Residuals vs Fitted", x = "Fitted Values", y = "Residuals") | |
ggplotly(p) | |
} else { | |
return(NULL) # No models to plot | |
} | |
}) | |
output$qqPlotlrucb <- renderPlotly({ | |
req(modelsList(), datalrucb()) | |
models <- req(modelsList()) | |
# Use the first model for the plot as an example | |
if (length(models) >= 1 && !is.null(models[[1]]$model)) { | |
fitted_model <- models[[1]]$model | |
p <- ggplot(fitted_model, aes(sample = .stdresid)) + | |
stat_qq(color = "darkorange") + | |
stat_qq_line(color = "dodgerblue") + | |
labs(title = "Normal Q-Q") | |
ggplotly(p) | |
} else { | |
return(NULL) # No models to plot | |
} | |
}) | |
output$scaleLoclrucbPlot <- renderPlotly({ | |
req(modelsList(), datalrucb()) | |
models <- req(modelsList()) | |
# Use the first model for the plot as an example | |
if (length(models) >= 1 && !is.null(models[[1]]$model)) { | |
fitted_model <- models[[1]]$model | |
p <- ggplot(fitted_model, aes(.fitted, sqrt(abs(.resid)))) + | |
geom_point(color = "darkorange") + | |
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") + | |
labs(title = "Scale-Location", x = "Fitted Values", y = "Sqrt(|Residuals|)") | |
ggplotly(p) | |
} else { | |
return(NULL) # No models to plot | |
} | |
}) | |
output$resLevlrucbPlot <- renderPlotly({ | |
req(modelsList(), datalrucb()) | |
models <- req(modelsList()) | |
# Use the first model for the plot as an example | |
if (length(models) >= 1 && !is.null(models[[1]]$model)) { | |
fitted_model <- models[[1]]$model | |
p <- ggplot(fitted_model, aes(.hat, .stdresid)) + | |
geom_point(aes(size = .cooksd), shape = 1, color = "darkorange") + | |
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") + | |
labs(title = "Residuals vs Leverage", x = "Leverage", y = "Standardized Residuals") | |
ggplotly(p) | |
} else { | |
return(NULL) # No models to plot | |
} | |
}) | |
output$regressionPlot <- renderPlotly({ | |
req(modelsList(), datalrucb()) | |
fitted_model <- modelsList() | |
data_for_plot <- datalrucb() | |
# Ensure the target and independent variables are provided | |
target_col <- input$targetlrucb | |
independent_var <- input$independentVarlrucb | |
if (is.null(data_for_plot[[target_col]]) || is.null(data_for_plot[[independent_var]])) { | |
return("Target or independent variable not found in the data.") | |
} | |
# Creating the plot with added color | |
p <- ggplot(data_for_plot, aes_string(x = independent_var, y = target_col)) + | |
geom_point(color = "darkorange") + # Change color of points | |
geom_smooth(method = "lm", se = FALSE, color = "dodgerblue") + # Change color of regression line | |
ggtitle("Regression Line Plot") + | |
xlab(independent_var) + | |
ylab(target_col) + | |
theme_minimal() + # Adding a minimal theme for a cleaner look | |
theme(legend.position = "none") # Remove legend if not needed | |
# Convert ggplot object to Plotly for an interactive plot | |
ggplotly(p) | |
}) | |
} | |
shinyApp(ui, server) |