Построение оценок с использованием ggplot2 & facet_wrap БЕЗ повторного подбора моделей - PullRequest
0 голосов
/ 07 февраля 2019

Я довольно новичок в ggplot2 и собираюсь создать фигуру с несколькими точками рассеяния с соответствующими оценками регрессии.Однако я использую нестандартные регрессионные подходы (например, квантильную регрессию и полную регрессию), которых нет в списке method аргументов, доступных в geom_smooth().У меня есть список подходящих моделей и соответствующих данных.Ниже приведен рабочий пример.

require(data.table); require(ggplot2)
N <- 1000 # Generate some data
DT <- NULL
models <- list() # list of of fitted models. For simplicity i am using lm in this example
for(i in 1:8){
  x <- rnorm(N)
  y <- i*x + rnorm(N)
  z <- rep(i,N)
  DT <- rbind(DT,data.table(cbind(x=x,y=y,z=z)))
  models[[i]] <- lm(y~x,DT)
}

# Traditional way to plot the data with regression estimates is to use geom_smooth
my.plot <- ggplot(DT, aes(x=x, y=y)) + geom_point() + 
  facet_wrap(~ z, nrow=2, ncol=4) + 
  geom_smooth(method = "lm", se=FALSE, color="red", formula = y ~ x)
my.plot

enter image description here

Мне нужен способ построения оценок красной регрессии без подгонки регрессионных моделей в пределах geom_smooth.Есть ли обходной путь, который сделает мой отдельный список приспособленных Models совместимыми с facet_wrap?

1 Ответ

0 голосов
/ 07 февраля 2019

Поскольку неясно, как вы будете отображать эстетику в переменные, используемые в вашей модели, вам нужно будет самостоятельно рассчитать значения для линий, а затем просто добавить их как стандартный слой geom_line вместо использования geom_smooth.Например,

lines <- purrr::map_dfr(models, function(m) {
  xrng <- range(m$model$x)
  data.frame(x=xrng, y=predict(m, data.frame(x=xrng)))
}, .id="z")

ggplot(DT, aes(x=x, y=y)) + geom_point() + 
  facet_wrap(~ z, nrow=2, ncol=4) + 
  geom_line(color="red", data=lines)

enter image description here

Обратите внимание, что здесь уклоны выглядят немного «выкл», но это соответствует тому, что вы фактически смоделировали (вы использовали весь DT каждый раз).Если вы хотите оценивать уклоны отдельно в каждой итерации, цикл должен выглядеть примерно так:

for(i in 1:8){
  x <- rnorm(N)
  y <- i*x + rnorm(N)
  z <- rep(i,N)
  chunk <- data.table(x=x,y=y,z=z)
  models[[i]] <- lm(y~x,chunk)
  DT <- rbind(DT, chunk)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...