Заранее прошу прощения за мой первый вопрос на этой платформе. Я просмотрел множество тем, но большинство вещей, которые я нашел, не связаны с какими-либо фиктивными переменными. Однако примерно через 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 неправильно обрабатывает думмификацию видов?
Привет и спасибо за ваш ответ! Я понимаю, что вы имеете в виду под джиттером, но на самом деле мне это нравится, просто чтобы избежать некоторого естественного дублирования и визуализировать все точки данных. О, кажется, я понимаю, к чему вы клоните своим комментарием. Вы имеете в виду, что строка кода geom_smooth() дает сбой, потому что она не может создать строку reg для каждой отдельной группы. Это действительно было бы правдой, потому что нам нужно только два сравнения и, следовательно, только две строки.
Какую линию регрессии вы ожидаете, если все значения x одинаковы для каждой группы? Для меня было бы больше смысла, если бы вы делали что-то вроде ggplot(dataset, aes(x = Petal.Width, y = Petal.Length, colour = Species)) + geom_smooth(method = lm, aes(group = Species)) + geom_point(width = 0.2)
Привет, Джон! Целью было построить график парных сравнений фиктивной переменной. Для трех групп мы получаем две «фиктивные» линии регрессии, которые в основном связывают средние значения между группами. Студентам может быть трудно понять концепцию манекенов, поэтому график, подобный решению, предложенному Миффом (см. Ниже), может быть полезен, чтобы показать, что происходит.
И здесь мне придется немного поправиться. По определению, на самом деле мы не проводим «полные» попарные сравнения. На самом деле мы сравниваем все остальные группы с первой. Просто для уточнения. Чего здесь на самом деле не хватает, так это сравнения уровней 2 и 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.")
В этом вопросе есть и другие подходы к построению парных сравнений.
Это довольно четкий ответ! Я очень ценю ваше решение. Также здорово, что вы опровергли мое предыдущее представление о том, чего я ожидал. Мне просто хотелось бы, чтобы был немного более удобный способ сделать это. Интересно, я один вижу в этом необходимость или моя идея визуализации совершенно нишевая :)
Я также принял ваш ответ как решение. Однако, если бы кто-то придумал более удобный способ, мне, конечно, было бы интересно.
Возможная альтернативная формулировка:
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 на точные сравнения. У вас еще недостаточно баллов, чтобы проголосовать за вас. Сделаю это после того, как получу еще немного.
Вот еще один подход, позволяющий получить линию регрессии для каждой комбинации 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
Это тоже очень круто! Спасибо за ваш вклад :)
lm(Petal.Length ~ Species, data = {iris %>% filter(Species == "setosa")})
попробуйте этот вариант, чтобы понять, почему он не может создать линию регрессии для каждого вида. Кроме того, джиттер обманчив: вместо этого используйте геометрическую точку, чтобы увидеть, как на самом деле выглядят данные.