2017-09-12 65 views
3

假設我有以下數據框:創建使用purrr殘差圖的矩陣和ggplot

library(tidyverse) 
fit <- lm(speed ~ dist, data = cars) 
select(broom::augment(fit), .fitted:.std.resid) -> dt 
names(dt) <- substring(names(dt), 2) 

我想創建一個使用purrr殘差圖的網格。例如,我對迄今2個診斷圖的公式:

residual <- function(model) {ggplot(model, aes(fitted, resid)) + 
            geom_point() + 
            geom_hline(yintercept = 0) + 
            geom_smooth(se = FALSE)} 

stdResidual <- function(model) {ggplot(model, aes(fitted, std.resid)) + 
            geom_point() + 
            geom_hline(yintercept = 0) + 
            geom_smooth(se = FALSE)} 

而且我存儲在列表中,我打算對強化數據集dt運行的公式。

formulas <- tibble(charts = list(residual, stdResidual)) 
# A tibble: 2 x 1 
    charts 
    <list> 
1 <fun> 
2 <fun> 

現在我需要通過dt到列chart的每個元素在formulas。我其實也試圖結合使用gridExtra,但現在我會滿意,如果我可以至少渲染他們兩個。我想我應該運行像

pwalk(list(dt, formulas), ???) 

但我不知道什麼功能,我應該在???使用渲染圖。

+1

設防是有利於掃帚棄用。您的圖的代碼不是函數,您不能將其應用於數據集。你需要寫函數。我懷疑這篇文章可能與你想要做的事情有關,如果你向下掃描:https://github.com/egoulddo/many_models/blob/master/many_models.md –

+0

@qqq我編輯過我的問題,但我不知道如何使用您的鏈接來解決我的問題。在這種情況下,他們有一個數據集的子集在相同的模型上運行(順便說一句,我想我會更容易使用'split(。$ var)')。在我的情況下,我有相同的數據框來運行多個函數。 – Dambo

+0

'purrr :: invoke_map(.f = formula,.x = list(list(dt)))'然後在'gridExtra :: grid.arrange'中使用結果列表中的'ggplot'對象 – Brian

回答

4

設置功能,以繪製每一個,就像上面一樣:

diagplot_resid <- function(df) { 
    ggplot(df, aes(.fitted, .resid)) + 
    geom_hline(yintercept = 0) + 
    geom_point() + 
    geom_smooth(se = F) + 
    labs(x = "Fitted", y = "Residuals") 
} 

diagplot_stdres <- function(df) { 
    ggplot(df, aes(.fitted, sqrt(.std.resid))) + 
    geom_hline(yintercept = 0) + 
    geom_point() + 
    geom_smooth(se = F) + 
    labs(x = "Fitted", y = expression(sqrt("Standardized residuals"))) 
} 

diagplot_qq <- function(df) { 
    ggplot(df, aes(sample = .std.resid)) + 
    geom_abline(slope = 1, intercept = 0, color = "black") + 
    stat_qq() + 
    labs(x = "Theoretical quantiles", y = "Standardized residuals") 
} 

然後調用每一個列表,數據框爲您的第二個參數。這裏是一個函數列表,並且將它們並行應用於函數參數列表。由於第二個列表中只有一個元素,因此invoke_map會在其上循環。

fit <- lm(mpg~wt, mtcars) 
df_aug <- augment(fit) 

purrr::invoke_map(.f = list(diagplot_resid, diagplot_stdres, diagplot_qq), 
        .x = list(list(df_aug))) %>% 
    gridExtra::grid.arrange(grobs = ., ncol = 2, 
          top = paste("Diagnostic plots for", 
             as.expression(fit$call))) 

enter image description here