Joonistab regressioonimudeli / Draws regression line




          
show with app
library(shiny)
library(ggplot2)
library(broom)
library(dplyr)
#Tänusõnad TÜ CITIS

#teen tühja faili / empty dataframe
points <- as.data.frame(cbind(x=vector("numeric", 0), y=vector("numeric", 0))) 

ui <- fluidPage(
      titlePanel("Joonistab regressioonimudeli / Draws regression line"),
      #joonis, kust võetakse mudeli punktid ja joonistatakse tulemused 
      plotOutput("joonis", width  = 600, height = 500,
                 click = "plot_click"),
      #nupp, mis teeb andmestiku nulliks / resets data
      actionButton("nullipunktid", "Nulli punktid / Reset data"),
      br(), br(),
      #mudeli väljund / model summary
      verbatimTextOutput("mudelsummary") ,
      #br(), br(),
      #andmed ja regressioonimudeli diagnostikud / data and diagnostics
      DT::dataTableOutput(outputId = "andmed", width = '600px')
)

server <- function(input, output) {

  #nullib andmed / resets data
  observeEvent(input$nullipunktid, {
    points <<- as.data.frame(cbind(x=vector("numeric", 0), y=vector("numeric", 0)))
  })

  #Lisame andmestikule järjest punkte juurde ja saadame joonisele ja mudelisse
  #Add rows to the data
  pointsdf <- reactive({
    input$nullipunktid
    points <<- rbind(points, as.data.frame(cbind(x=input$plot_click$x, y=input$plot_click$y)))
    points
  })
  

  #joonis/ graph
  output$joonis <- renderPlot({
    ggplot(data=pointsdf(), aes(x=x, y=y)) +
      geom_point() +
      geom_smooth(method = "lm", fullrange = TRUE)+
      scale_x_continuous(limits = c(-10,10)) +
      scale_y_continuous(limits = c(-10,10)) +
      geom_hline(yintercept=0) + geom_vline(xintercept=0)
    })

  #OLS
  mudel <- reactive({
    if(nrow(pointsdf())>2) { # if at least 3 observations, present results
      mudel <- lm(y ~ x, data=pointsdf())  
      mudel
    }
  })
  
  #presents results
  output$mudelsummary <- renderPrint({
    if(nrow(pointsdf())>2) {
      summary(mudel())  
    }
  }, width = 400)
  
  #Andmed koos diagnostikaga / Data with diagnostics
  output$andmed <- DT::renderDataTable({
     round(mudel() %>% 
       augment(), 3)
   })
   
}

shinyApp(ui = ui, server = server)