Построение квантильной регрессии по переменным на одной странице

Я запускаю квантильные регрессии для нескольких независимых переменных отдельно (одна и та же зависимость). Я хочу построить только оценки наклона для нескольких квантилей каждой переменной на одном графике.

Вот данные игрушки:

set.seed(1988)

y <- rnorm(50, 5, 3)
x1 <- rnorm(50, 3, 1)
x2 <- rnorm(50, 1, 0.5)

# Running Quantile Regression 
require(quantreg)
fit1 <- summary(rq(y~x1, tau=1:9/10), se="boot")
fit2 <- summary(rq(y~x2, tau=1:9/10), se="boot")

Я хочу построить только оценки уклона по квантилям. Следовательно, я даю parm=2 в plot,

 plot(fit1, parm=2)
 plot(fit2, parm=2)

Теперь я хочу объединить оба этих графика на одной странице.

Что я пробовал до сих пор;

  1. Я пробовал настройку par(mfrow=c(2,2)) и заговор их. Но он производит пустую страницу.
  2. Я пытался использовать gridExtra и gridGraphics безуспешно. Пытался преобразовать базовые графы в объекты Grob, как указано здесь
  3. Пробовал с помощью функции layout функционировать как в этом документе
  4. Я пытаюсь заглянуть в исходный код plot.rqs, Но я не могу понять, как он строит доверительные интервалы (я могу изобразить только коэффициенты по квантилям) или изменить mfrow Параметр там.

Кто-нибудь может указать, где я иду не так? Должен ли я посмотреть в исходный код plot.rqs а какие-нибудь параметры там менять?

2 ответа

Решение

В то время как quantreg::plot.summary.rqs имеет mfrow параметр, он использует его для переопределения par('mfrow') чтобы огранить parm ценности, а это не то, что вы хотите сделать.

Один из вариантов - разобрать объекты и построить график вручную. Вы можете извлечь значения тау и матрицу коэффициентов из fit1 а также fit2, которые являются просто списками значений для каждого тау, поэтому в Tidyverse грамматики,

library(tidyverse)

c(fit1, fit2) %>%    # concatenate lists, flattening to one level
    # iterate over list and rbind to data.frame
    map_dfr(~cbind(tau = .x[['tau']],    # from each list element, cbind the tau...
                   coef(.x) %>%    # ...and the coefficient matrix, 
                       data.frame(check.names = TRUE) %>%    # cleaned a little
                       rownames_to_column('term'))) %>% 
    filter(term != '(Intercept)') %>%    # drop intercept rows
    # initialize plot and map variables to aesthetics (positions)
    ggplot(aes(x = tau, y = Value, 
               ymin = Value - Std..Error, 
               ymax = Value + Std..Error)) + 
    geom_ribbon(alpha = 0.5) + 
    geom_line(color = 'blue') + 
    facet_wrap(~term, nrow = 2)    # make a plot for each value of `term`

граненый сюжет

Вытяните больше из объектов, если хотите, добавьте горизонтальные линии оригинала, и в противном случае вы получите дикий характер.


Другой вариант заключается в использовании magick захватить исходные изображения (или сохранить их на любом устройстве и перечитать их) и вручную объединить их:

library(magick)

plots <- image_graph(height = 300)    # graphics device to capture plots in image stack
plot(fit1, parm = 2)
plot(fit2, parm = 2)
dev.off()

im1 <- image_append(p1p2, stack = TRUE)    # attach images in stack top to bottom

image_write(im1, 'rq.png')

соединенные участки

Функция plot использован quantreg Пакет имеет свой собственный параметр mfrow. Если вы не укажете его, он применяет некоторые опции, которые он выбирает самостоятельно (и, таким образом, переопределяет ваш par(mfrow = c(2,2)),

С использованием mfrow параметр в plot.rqs:

# make one plot, change the layout
plot(fit1, parm = 2, mfrow = c(2,1))
# add a new plot
par(new = TRUE)
# create a second plot
plot(fit2, parm = 2, mfrow = c(2,1))
Другие вопросы по тегам