首页 > 解决方案 > 是否有 ggplot2 类似于 R 中的 avPlots 函数?

问题描述

在进行回归建模时,为模型中的解释变量生成附加变量图很有用,以检查与响应变量的假定关系是否适合数据。包中的avPlots函数接受模型输入,并使用基本图形系统生成一个添加变量图的网格。这个函数非常用户友好,只要你需要做的就是将模型对象作为参数放入,它会自动为每个解释变量生成所有添加的变量图。这个绘图矩阵包含所有需要的信息,但不幸的是,绘图看起来很糟糕,因为它使用基本图形系统而不是carRggplot2包裹。例如,使用在此处找到的数据(作为文件下载Trucking.csv)是avPlots函数的输出。

#Load required libraries
library(car);

#Import data, fit model, and show AV plots
DATA  <- read.csv('Trucking.csv');
MODEL <- lm(log(PRICPTM) ~ DISTANCE + PCTLOAD + ORIGIN + MARKET + DEREG + PRODUCT, 
            data = DATA);
avPlots(MODEL);

在此处输入图像描述


问题:是否有一个等效函数ggplot2可以为模型生成每个附加变量图的矩阵,但具有“更漂亮”的图?是否可以生成这些图,然后使用标准ggplot语法对其进行自定义?

标签: rggplot2

解决方案


我不知道任何使用ggplot. 但是,除了作为函数调用的副作用avPlots提供绘图输出外,该函数还会生成一个对象,该对象是一个列表,其中包含每个添加的变量绘图中使用的数据值。提取这些变量的数据框并使用它们生成添加的变量图相对简单ggplot。这可以使用以下函数为通用模型对象完成。

avPlots.invis <- function(MODEL, ...) {
  
  ff <- tempfile()
  png(filename = ff)
  OUT <- car::avPlots(MODEL, ...)
  dev.off()
  unlink(ff)
  OUT }

ggAVPLOTS  <- function(MODEL, YLAB = NULL) {
  
  #Extract the information for AV plots
  AVPLOTS <- avPlots.invis(MODEL)
  K       <- length(AVPLOTS)
  
  #Create the added variable plots using ggplot
  GGPLOTS <- vector('list', K)
  for (i in 1:K) {
  DATA         <- data.frame(AVPLOTS[[i]])
  GGPLOTS[[i]] <- ggplot2::ggplot(aes_string(x = colnames(DATA)[1], 
                                             y = colnames(DATA)[2]), 
                                  data = DATA) +
                  geom_point(colour = 'blue') + 
                  geom_smooth(method = 'lm', se = FALSE, 
                              color = 'red', formula = y ~ x, linetype = 'dashed') +
                  xlab(paste0('Predictor Residual \n (', 
                         names(DATA)[1], ' | others)')) +
                  ylab(paste0('Response Residual \n (',
                         ifelse(is.null(YLAB), 
                           paste0(names(DATA)[2], ' | others'), YLAB), ')')) }
  
  #Return output object
  GGPLOTS }

该函数ggAVPLOTS将采用输入模型并ggplot为每个添加的变量图生成对象列表。这些已被构建为给出带有蓝色点的“漂亮”图和通过每个图的红色虚线回归线。如果您希望所有添加的变量图都显示在一个图中,使用包grid.arrange中的函数执行此操作相对简单gridExtra。下面我们将其应用于您的模型并显示结果图。

#Produce matrix of added variable plots
library(gridExtra)
PLOTS <- ggAVPLOTS(MODEL)
K     <- length(PLOTS)
NCOL  <- ceiling(sqrt(K))
AVPLOTS <- do.call("arrangeGrob", c(PLOTS, ncol = NCOL, top = 'Added Variable Plots'))
ggsave('AV Plots - Trucking.jpg', width = 10, height = 10)

在此处输入图像描述

可以在上面的代码中对这些绘图进行任何更改ggplot,因此如果用户喜欢更改颜色、字体大小等,可以使用ggplot. 此方法通过从avPlots函数导入添加的变量图的数据来工作,但是一旦你这样做了,你就可以使用这些数据来生成任何类型的图。


推荐阅读