如何基于具有反应变量的线性模型进行预测

Fer*_*oao 4 r linear-regression predict reactive-programming shiny

我想请一些方法来预测R中的lm(线性模型),它接受反应变量.
如果你有一个带有y和x的线性模型"lm",那么可以为新数据提供"预测",为x提供新值.我想在闪亮的应用程序中为反应性y和x做到这一点

在下面的工作示例中,我以某种方式(任意地,只是为了使其工作)创建了lm的反应y和x值,并且还创建了一个输入以提供更改的新值(用作新x).

目标是在考虑y(),x()的情况下正确地获得新(输入)x的预测y.

library(shiny)
library(EnvStats)
ui <- fluidPage ( 
  sidebarLayout(
  sidebarPanel (
  numericInput('variable1', 'new x', 0.1, min = 0, max = 100, step = 0.1)
  ),
  mainPanel (plotOutput('plot1') )
  )
  )
server <- function(input, output){
#  Initial data and linear regression that should be reactive,
# the dependency on input$variable1<1 is just an example to work with a lm based on reactive data. 
  y<- reactive (
    if (input$variable1<1)
    { y <- c(3.1, 3.25, 3.5, 4, 3.5, 5, 5.5) }
    else 
     { y <- c(.1, .25, .5, 1, 1.5, 2, 2.5) }
  )
  x<- reactive (
    if (input$variable1>=1)
    { x <- c(.1, .332, .631, .972, 1.201, 1.584, 1.912) }
    else 
    { x <- c(.1, .3,  .631, .972, 2.201, 2.584, 2.912) }
  )

output$plot1 <- renderPlot({
  # UNCORRECTED INITIAL VERSION some reactive functions are unnecessary 
  #  results <- reactive({ 
  #    r <- data.frame(y(),x())
  #  })
  #  lmod <- reactive ({ 
  #    mod1 <- lm(y()~ x(), data = results() 
  #    )
  #   x <-reactive ({ x <- input$variable1  })
  #  newdata <- reactive ({  data.frame(x() ) } )
  #  newdata.pred <- reactive ({  predict(lmod(),newdata(),level=1)
  #  })
  #  segments(input$variable1, 0, input$variable1, newdata.pred(), col = "red")
  # CORRECTED AFTER MRFLICK
    plot(x(),y())
    results <- data.frame(y=y(),x=x()) # reactive is not necessary because 
    lmod <- lm(y~x, data = results)    #of the reactive context (renderPlot)
    abline(lmod)  
    x <- input$variable1 
    newdata <- data.frame(x=x ) 
    newdata.pred2 <- predict(lmod,newdata,se.fit=TRUE)
    ci<- pointwise(newdata.pred2, coverage = 0.95, simultaneous = TRUE)

    newdata.pred <- predict(lmod,newdata)

        segments(input$variable1, 0, input$variable1, newdata.pred, col = "red")
        points(input$variable1, ci$lower, col = "magenta") 
        points(input$variable1, ci$upper, col = "magenta")
        text(input$variable1, newdata.pred, labels=paste("predicted",signif(newdata.pred, 3) ), pos =4, cex = 1.2)
        text(input$variable1, ci$upper, labels=paste("upper limit of pointwise confidence intervals",
                                                                     signif(ci$upper, 3) ), pos =4, cex = 1.2)
        text(input$variable1, ci$lower, labels=paste("lower limit of pointwise confidence intervals",
                                                        signif(ci$lower, 3) ), pos =4, cex = 1.2)
} )
} # end server
  shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 5

使用lm()predict获得正确命名的data.frame并使用适当的公式时更好.如果您更改这些部件

results <- reactive({ 
  r <- data.frame(y=y(),x=x())
})

lmod <- reactive ({ 
  mod1 <- lm(y~x, data = results() )
 })
Run Code Online (Sandbox Code Playgroud)

newdata <- reactive ({  data.frame(x=x() ) } )
Run Code Online (Sandbox Code Playgroud)

我想你会得到你想要的行为.现在,模型拟合data.frame和预测data.frame都有一个名为列的列,x并且在lm()清单列表中使用的公式x作为用于预测的变量y