Добавление отдельной строки регрессии в ggplot в R

Предполагая, что у меня есть фрейм данных со следующими заголовками столбцов: рост, вес, пол.

Я использую ggplot для создания точечной диаграммы.

ggplot(df, aes(x = height, y = weight , col = gender)) +
 geom_point() +
 theme_classic() +
 geom_smooth(method = "lm", se = FALSE)

Это строит две линии регрессии, одну для мужчин и женщин. Я хотел бы добавить еще одну регрессию для общего сравнения роста и веса. Как мне это сделать?

Добавьте код для воспроизведения минимальной версии набора данных df.

s_baldur 11.12.2020 11:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить еще один geom_smooth с col, установленным на статическую метку. Это переопределяет первый аргумент aes(col = gender), возвращает все наблюдения в одну группу и дает им метку, которую вы хотите использовать:

library(ggplot2)

ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, col = Species)) +
  geom_point() +
  theme_classic() +
  geom_smooth(method = "lm", se = FALSE) +
  geom_smooth(aes(col = "Overall"), method = "lm", se = FALSE)
#> `geom_smooth()` using formula 'y ~ x'
#> `geom_smooth()` using formula 'y ~ x'

Created on 2020-12-11 by the reprex package (v0.3.0)

Обновлено: отвечая на вопросы ниже, это также работает с scale_colour_lancet:

library(ggplot2)
library(dplyr)

iris %>% 
  modelr::add_predictions(model = lm(Sepal.Length ~ Sepal.Width + Species, 
                          data = iris)) %>% 
  ggplot(aes(x = Sepal.Width, y = Sepal.Length, col = Species)) +
  geom_point() +
  theme_classic() +
  geom_line(aes(y = pred)) +
  geom_smooth(aes(col = "Overall"), method = "lm", se = FALSE) +
  ggsci::scale_color_lancet()
#> `geom_smooth()` using formula 'y ~ x'

Created on 2020-12-12 by the reprex package (v0.3.0)

geom_smooth, использованный выше, автоматически выполняет lm(y ~ x) для каждой группы, в этом случае давая эквивалентные строки для lm(Sepal.Length ~ Sepal.Width*Species). Чтобы получить lm(Sepal.Length ~ Sepal.Width + Species), простым способом было бы использовать modelr::add_predictions() для создания переменной pred для значений y перед передачей в ggplot.

Здравствуйте, Андрей, спасибо за помощь! Еще один вопрос по моему набору данных. Категория «Общие» не отображается в легенде? Есть дополнительный шаг?

Randy Ohms 11.12.2020 14:41

Есть несколько вариантов того, почему это может быть - в приведенном выше примере это выглядит так, как вызовы aes(col) между двумя geom_smooth() естественным образом добавляют «В целом» в список разрывов для перехода к легенде. Если вы используете scale_colour_manual и не присваиваете ему значение, оно может не отображаться. Кроме того, убедитесь, что он указан в скобках aes(). Если вы все еще застряли, не стесняйтесь добавить новый код к своему вопросу, чтобы увидеть, не пропало ли что-то.

Andy Baxter 11.12.2020 15:06

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

Andy Baxter 11.12.2020 15:07

Я использую scale_colour_lancet() Нужно ли это корректировать? Могу я также спросить, как добавить следующие линии регрессии, предоставляемые функцией lm(Sepal.Length~Sepal.Width + Species) для каждого вида?

Randy Ohms 12.12.2020 21:44

сделал маленькое редактирование, чтобы посмотреть, поможет ли это. scale_colour_lancet как указано выше, добавляет метку «В целом». Кроме того, чтобы получить эту конкретную формулу, которую вы описали, я думаю, вам нужно будет сделать прогнозы, прежде чем переходить к ggplot. Это работает? Также опубликуйте последний код, если он все еще не работает, и мы сможем увидеть, есть ли ошибка или отсутствующий элемент.

Andy Baxter 12.12.2020 22:18

Я определил проблему, почему комбинезон не появляется в легенде. Если сделать geom_smooth(aes(col = "Overall"), method = "lm", linetype = "dashed", se = FALSE) Появляется, но удаляется, одна из категорий становится пустой. Если я делаю geom_smooth(aes(col = "Overall"), method = "lm", colour = "black", linetype = "dashed", se = FALSE) , это не отображается. у меня 9 категорий

Randy Ohms 12.12.2020 22:56

Ах, это имеет смысл! Согласно файлу справки, в палитре Lancet всего 9 цветов. Таким образом, он не может назначить 10 уникальных цветов и впоследствии отбрасывает один. Тогда подойдет другая палитра, если она будет содержать более 10 цветов.

Andy Baxter 12.12.2020 23:07

Потрясающий! Большое спасибо

Randy Ohms 12.12.2020 23:14

Если у меня есть фрейм данных, содержащий столбцы Ширина, Длина, Цвет. Со значениями в цвете - красный, синий, зеленый. Я использую следующую регрессию: lm(Width~Length+Colour, df) Я хотел бы изменить контрольный уровень фиктивной переменной на зеленый.

Randy Ohms 12.12.2020 23:15

решение будет заключаться в изменении уровней фактора Colour, чтобы сделать «зеленый» базовым уровнем. Если это уже фактор, вы можете использовать mutate(Colour = forcats::fct_relevel(Colour, "green")) или создать фактор из символьной переменной и сделать зеленый первый случай. Надеюсь, это работает! Теперь это превращается в совершенно другой вопрос - если у вас есть дальнейшие проблемы с переупорядочением факторов, задайте новый вопрос. Дает больше места для работы, а не упаковывает все в комментарии :)

Andy Baxter 12.12.2020 23:40

(PS - если вам нравятся цвета палитры Lancet и вы хотите выжать из нее десятый цвет, вы можете заменить scale_colour_lancet на scale_colour_manual(values = colorRampPalette(pal_lancet()(9))(10)) - это берет 9 цветов палитры Lancet и перемешивает их, чтобы получить 10 в том же грубом спектре. )

Andy Baxter 12.12.2020 23:47

Привет, я хотел добавить регрессию к моему графику с большим количеством переменных, например. lm(Sepal.Length ~ Sepal.Width + Petal Width + Species), где «вид» — фиктивная переменная. Я хочу, чтобы линия регрессии показывала коэффициент Sepal.Width для всех видов, когда все остальные переменные остаются постоянными.

Randy Ohms 14.12.2020 17:02

Другие вопросы по теме