在R中,是否有ggplot2的类似于avPlots函数的功能?

3
在进行回归建模时,为了检查所假定的与响应变量的关系是否适合数据,为模型中的解释变量生成添加变量图很有用。在R语言的car包中,avPlots函数采用基本图形系统,输入模型并生成一组添加变量图。该函数非常用户友好,因为你只需要将模型对象作为参数放入其中,它就会自动为每个解释变量生成所有添加变量图。这组图包含了所有所需信息,但不幸的是,由于它使用基本图形系统而不是ggplot2包,因此图表看起来很差。例如,使用此处找到的数据(下载为文件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);

enter image description here


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

1个回答

12

我不知道是否有任何自动化功能可以使用 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对象列表。这些图形被构建为给出“漂亮”的图形,其中蓝色点和虚线红色回归线通过每个图形。如果您希望所有添加的变量图都显示在单个图中,则可以使用gridExtra包中的grid.arrange函数相对简单地完成此操作。下面我们将其应用于您的模型并显示结果图。

#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)

enter image description here

在上述的ggplot代码中,您可以进行任何想要的修改,如果用户希望更改颜色、字体大小等,则可以使用ggplot中的标准语法来完成。这种方法是通过从avPlots函数导入添加变量图的数据来实现的,但一旦您完成了这个步骤,就可以使用这些数据来生成任何类型的图表。

这太棒了!但是avPlots.invis的目的是什么?如果你用avPlots(MODEL)替换avPlots.invis(MODEL),ggAVPLOTS似乎也能正常工作。 - undefined
该部分的唯一目的是抑制初始(非ggplot)的打印输出,并保存值而不打印它们。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接