Ggplot geom_smooth() для фиктивной переменной линейной регрессии – нет линий регрессии

Заранее прошу прощения за мой первый вопрос на этой платформе. Я просмотрел множество тем, но большинство вещей, которые я нашел, не связаны с какими-либо фиктивными переменными. Однако примерно через 4 часа изучения проблемы я не могу понять, в чем дело.

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

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

Вот мой код и то, что я пробовал до сих пор.

#Загрузка tidyverse.

library(tidyverse)

#Загрузка набора данных радужной оболочки глаза и сохранение его как объекта.

dataset <- as_tibble(iris)

#В качестве фона: я хотел бы визуализировать следующую линейную регрессию.

ols_lm_iris_all <- lm(Petal.Length ~ Species,
                      data = dataset)

summary(ols_lm_iris_all)

#В результате получается следующая lm-модель, которая дает попарные сравнения: versicolor с setosa и Virginica с setosa. Все идет нормально.

#Мой код для визуализации данных будет следующим.

iris_lm_plot_all <- ggplot(dataset, aes(x = Species, y = Petal.Length, colour = Species)) +
                    geom_smooth(method = lm, aes(group = Species)) +
                    geom_jitter(width = 0.2) +
                    labs(title = "Linear OLS regression with two regression lines for three types of Iris.")

iris_lm_plot_all

#Однако в итоге я получаю диаграмму рассеяния с джиттером, но вообще без каких-либо линий регрессии.

#Вот что я тоже пробовал, частично успешно. Если мы назначим «aes(group = 1)» вместо group = Species, мы получим одну lm-строку от последнего фактора Virginica до Setosa. Это полдела, но теперь мы не доводим лишай до сетозы.

iris_lm_plot_all <- ggplot(dataset, aes(x = Species, y = Petal.Length, colour = Species)) +
                    geom_smooth(method = lm, aes(group = 1)) +
                    geom_jitter(width = 0.2) +
                    labs(title = "Linear OLS regression with two regression lines for three types of Iris.")

О чем я также подумал: может ли быть так, что geom_smooth неправильно обрабатывает думмификацию видов?

lm(Petal.Length ~ Species, data = {iris %>% filter(Species == "setosa")}) попробуйте этот вариант, чтобы понять, почему он не может создать линию регрессии для каждого вида. Кроме того, джиттер обманчив: вместо этого используйте геометрическую точку, чтобы увидеть, как на самом деле выглядят данные.
M-- 15.04.2024 17:29

Привет и спасибо за ваш ответ! Я понимаю, что вы имеете в виду под джиттером, но на самом деле мне это нравится, просто чтобы избежать некоторого естественного дублирования и визуализировать все точки данных. О, кажется, я понимаю, к чему вы клоните своим комментарием. Вы имеете в виду, что строка кода geom_smooth() дает сбой, потому что она не может создать строку reg для каждой отдельной группы. Это действительно было бы правдой, потому что нам нужно только два сравнения и, следовательно, только две строки.

peppermint 15.04.2024 17:56

Какую линию регрессии вы ожидаете, если все значения x одинаковы для каждой группы? Для меня было бы больше смысла, если бы вы делали что-то вроде ggplot(dataset, aes(x = Petal.Width, y = Petal.Length, colour = Species)) + geom_smooth(method = lm, aes(group = Species)) + geom_point(width = 0.2)

Jon Spring 15.04.2024 18:49

Привет, Джон! Целью было построить график парных сравнений фиктивной переменной. Для трех групп мы получаем две «фиктивные» линии регрессии, которые в основном связывают средние значения между группами. Студентам может быть трудно понять концепцию манекенов, поэтому график, подобный решению, предложенному Миффом (см. Ниже), может быть полезен, чтобы показать, что происходит.

peppermint 15.04.2024 18:52

И здесь мне придется немного поправиться. По определению, на самом деле мы не проводим «полные» попарные сравнения. На самом деле мы сравниваем все остальные группы с первой. Просто для уточнения. Чего здесь на самом деле не хватает, так это сравнения уровней 2 и 3, лишайника и виригиники. Но это совершенно намеренно.

peppermint 15.04.2024 19:23
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
97
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Вы можете вручную редактировать данные для двух сравнений/трех факторов, но это нелегко обобщить:

dataset <- as.tibble(iris)

dataset <- rbind(
  cbind(subset(dataset, as.numeric(Species) %in% c(1,2)),comparison = "A"),
  cbind(subset(dataset, as.numeric(Species) %in% c(1,3)),comparison = "B")
)

ggplot(dataset, aes(x = Species, y = Petal.Length, colour = Species)) +
    geom_smooth(method = lm, aes(group=comparison)) +
  geom_jitter(width = 0.2, ) +
  labs(title = "Linear OLS regression mit with two regression line for three types of Iris.")

В этом вопросе есть и другие подходы к построению парных сравнений.

Это довольно четкий ответ! Я очень ценю ваше решение. Также здорово, что вы опровергли мое предыдущее представление о том, чего я ожидал. Мне просто хотелось бы, чтобы был немного более удобный способ сделать это. Интересно, я один вижу в этом необходимость или моя идея визуализации совершенно нишевая :)

peppermint 15.04.2024 17:59

Я также принял ваш ответ как решение. Однако, если бы кто-то придумал более удобный способ, мне, конечно, было бы интересно.

peppermint 15.04.2024 18:06

Возможная альтернативная формулировка:

library(ggplot2)

iris |>  
  ggplot(aes(Species, Petal.Length, colour = Species, group = 1)) +
  geom_smooth(method = lm, data = subset(iris, Species != "versicolor")) +
  geom_smooth(method = lm, data = subset(iris, Species != "virginica")) +
  geom_jitter(width = 0.2) +
  labs(title = "Linear OLS regression with two regression line for three types of Iris.")

Created on 2024-04-15 with reprex v2.1.0

Привет, Карл! Это очень элегантное решение, очень ценю ваш подход! Мне кажется, что по сути мы делаем некую ручную «думмификацию», чтобы направить geom_smooth на точные сравнения. У вас еще недостаточно баллов, чтобы проголосовать за вас. Сделаю это после того, как получу еще немного.

peppermint 15.04.2024 19:21

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

library(dplyr)
library(ggplot2)
library(ggh4x)

combn(group_split(iris, Species), 2, bind_rows, simplify = FALSE) %>% 
  bind_rows(.id = "ID") %>% 
  mutate(Species_Combn = paste(unique(Species), collapse = "-"), 
         .by = ID) -> iris_combn

suppressWarnings(
ggplot() +
  geom_smooth(data = iris_combn, method = lm, 
              aes(Species, Petal.Length, group = ID, colorL = Species_Combn)) +
  geom_jitter(data = iris, width = 0.2,
              aes(x = Species, y = Petal.Length, colorP = Species)) +
  scale_listed(
    list(scale_color_manual(values = c("blue4", "green4", "red4"), 
                           aesthetics = "colorL", name = "Species Combination"),
         scale_color_manual(values = c("blue3", "red3","green3"),
                           aesthetics = "colorP")),
    replaces = c("color", "color")) +
  labs(title = "Linear OLS regression for three types of Iris.")
)
#> `geom_smooth()` using formula = 'y ~ x'

Created on 2024-04-16 with reprex v2.0.2

Это тоже очень круто! Спасибо за ваш вклад :)

peppermint 18.04.2024 11:42

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