Is it possible to plot the smooth components of a gam fit with ggplot2?

后端 未结 3 639
旧巷少年郎
旧巷少年郎 2021-01-30 09:20

I am fitting a model using gam from the mgcv package and store the result in model and so far I have been looking at the smooth components

3条回答
  •  再見小時候
    2021-01-30 10:02

    Updated to allow user to choose which variables are plotted. Changed 'residuals' term to 'res_data' to avoid conflict with residuals function.

    ggplot.model <- function(model, type="conditional", res=FALSE, 
                           col.line="#7fc97f", col.point="#beaed4", size.line=1, size.point=1, no_col = NULL,
                           what = "all") {
      require(visreg)
      require(plyr)
      
      plotdata <- visreg(model, type = type, plot = FALSE)
      smooths <- ldply(plotdata, function(part)   
        data.frame(Variable = part$meta$x, 
                 x=part$fit[[part$meta$x]], 
                 smooth=part$fit$visregFit, 
                 lower=part$fit$visregLwr, 
                 upper=part$fit$visregUpr))
      res_data <- ldply(plotdata, function(part)
        data.frame(Variable = part$meta$x, 
                   x=part$res[[part$meta$x]], 
                   y=part$res$visregRes))
      
       if (what != "all") {
        smooths <- smooths %>%
          filter(lapply(Variable,as.character)%in% what)
        res_data <- res_data%>%
          filter(lapply(Variable,as.character)%in% what)
       }
      
      
      if (res)
        ggplot(smooths, aes(x, smooth)) + geom_line(col=col.line, size=size.line) +
          geom_line(aes(y=lower), linetype="dashed", col=col.line, size=size.line) +
          geom_line(aes(y=upper), linetype="dashed", col=col.line, size=size.line) +
          geom_point(data = res_data, aes(x, y), col=col.point, size=size.point) +
          facet_wrap(. ~ Variable, scales = "free_x", ncol = no_col) + theme_bw()
      else
        ggplot(smooths, aes(x, smooth)) + geom_line(col=col.line, size=size.line) +
          geom_line(aes(y=lower), linetype="dashed", col=col.line, size=size.line) +
          geom_line(aes(y=upper), linetype="dashed", col=col.line, size=size.line) +
          facet_wrap(. ~ Variable, scales = "free_x", ncol=no_col)
    }
    

提交回复
热议问题