Построение квантильной регрессии по переменным на одной странице
Я запускаю квантильные регрессии для нескольких независимых переменных отдельно (одна и та же зависимость). Я хочу построить только оценки наклона для нескольких квантилей каждой переменной на одном графике.
Вот данные игрушки:
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)
Теперь я хочу объединить оба этих графика на одной странице.
Что я пробовал до сих пор;
- Я пробовал настройку
par(mfrow=c(2,2))
и заговор их. Но он производит пустую страницу. - Я пытался использовать
gridExtra
и gridGraphics безуспешно. Пытался преобразовать базовые графы в объекты Grob, как указано здесь - Пробовал с помощью функции
layout
функционировать как в этом документе - Я пытаюсь заглянуть в исходный код
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))