PtteMDataScience's picture
Upload app.R
f734497 verified
raw
history blame
29.7 kB
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)