Как создать графики со сложенными коэффициентами в R
Узнайте, как создавать графики со сложенными коэффициентами для множественных линейных моделей в R с использованием ggplot2. Исправьте наложение точек и ошибок с помощью position_dodge() и вертикального сложения.
Как создать график со стопкой коэффициентов для множественных линейных моделей в R?
Я пытаюсь создать график коэффициентов для множественных линейных моделей с использованием ggplot2 в R, но столкнулся с проблемой перекрывающихся точек и доверительных интервалов при отображении оценок. Я написал функцию plot_multiple_models_coefficients для построения графиков, и она в некоторой степени работает хорошо. Однако точки и доверительные интервалы из разных моделей перекрываются, что затрудняет чтение.
Я хотел бы расположить коэффициенты из разных моделей вертикально друг под другом, сохраняя их выравнивание с соответствующими параметрами. Я пробовал использовать jittering, но это не сработало с доверительными интервалами.
Вот код, который у меня есть:
library(ggplot2)
library(parameters)
library(dplyr)
a <- rnorm(50)
b <- rnorm(50)
c <- rnorm(50)
y1 <- rnorm(50) * 0.5 + a
y2 <- rnorm(50) * 0.3 + a + b * 0.3
y3 <- rnorm(50) * 0.2 + a + b + c * 0.8
model1 <- lm(y1 ~ a)
model2 <- lm(y2 ~ a + b)
model3 <- lm(y3 ~ a + b + c)
plot_multiple_models_coefficients <- function(models, model_names,
include_intercept = TRUE,
plot_title = "Coefficient Plot",
y_axis_label = "Parameters",
x_axis_label = "Coefficient",
point_colors = NULL,
bar_color = "black") {
# Initialize an empty data frame to store combined results
combined_data <- data.frame()
# Loop through each model to extract parameters and their coefficients
for (i in seq_along(models)) {
model <- models[[i]]
model_name <- model_names[i]
# Extract model parameters
model_data <- parameters::model_parameters(model)
# Filter the data based on the include_intercept argument
if (!include_intercept) {
model_data <- model_data[-1, ] # Remove the intercept if not included
}
# Add a new column for the model name
model_data$Model <- model_name
# Combine the current model's data with the overall data frame
combined_data <- bind_rows(combined_data, model_data)
}
# Create the plot
p <- ggplot(combined_data, aes(x = Parameter, y = Coefficient, color = Model)) +
geom_point(size = 3) + # Points for the Coefficient
geom_errorbar(aes(ymin = CI_low, ymax = CI_high), width = 0.2, color = bar_color) + # Error bars for CI
theme_minimal() + # Minimal theme
labs(title = plot_title, x = x_axis_label, y = y_axis_label) +
scale_color_manual(values = point_colors) + # Custom color for points
coord_flip() + # Flip coordinates for better visibility
theme(legend.title = element_blank())
# Print the plot
print(p)
}
# Example usage:
model_list <- list(model1, model2, model3) # List of different models
model_names <- c("Model 1", "Model 2", "Model 3") # Names for the models
point_colors <- c("red", "green", "blue") # Colors for each model
bar_color <- "black"
plot_multiple_models_coefficients(models = model_list, model_names = model_names,
include_intercept = FALSE,
plot_title = "title",
x_axis_label = "Predictors",
y_axis_label = "Estimates",
point_colors = point_colors,
bar_color = "black")
Как можно изменить эту функцию, чтобы коэффициенты из разных моделей располагались друг под другом без перекрытия? Я хочу легко различать оценки для каждой модели.
График со штабелированными коэффициентами для множественных линейных моделей в R с использованием ggplot2
График со штабелированными коэффициентами для множественных линейных моделей в R с использованием ggplot2 можно создать путем правильной обработки корректировок позиции для избежания перекрытия точек и полос ошибок. Ключевым моментом является либо использование position_dodge() для горизонтального разделения коэффициентов, либо изменение структуры данных для создания истинного вертикального штабелирования.
Содержание
- Использование position_dodge() для горизонтального разделения
- Создание истинного вертикального штабелирования
- Полная модифицированная функция
- Дополнительные варианты настройки
- Альтернативные пакеты R
- Лучшие практики
Использование position_dodge() для горизонтального разделения
Наиболее прямой подход - использование position_dodge() для горизонтального разделения коэффициентов при их выравнивании с параметрами. Это предотвращает перекрытие, сохраняя прямую сравнимость.
# Модифицированный подход к построению графика с position_dodge()
dodge <- position_dodge(width = 0.9)
ggplot(combined_data, aes(x = Parameter, y = Coefficient, color = Model)) +
geom_point(size = 3, position = dodge) +
geom_errorbar(aes(ymin = CI_low, ymax = CI_high),
width = 0.2,
position = dodge,
color = bar_color) +
coord_flip() +
theme_minimal()
Ключевые моменты:
- Используйте одинаковый параметр
widthкак вgeom_point(), так и вgeom_errorbar() - Ширину следует корректировать в зависимости от количества моделей (больше моделей = требуется большая ширина)
- Этот подход сохраняет естественный масштаб коэффициентов и облегчает сравнение
Создание истинного вертикального штабелирования
Для истинного вертикального штабелирования, когда коэффициенты отображаются один над другим для каждого параметра, необходимо изменить структуру данных для создания отдельных y-позиций:
# Функция для создания штабелированных данных
create_stacked_data <- function(models, model_names, include_intercept = TRUE) {
combined_data <- data.frame()
for (i in seq_along(models)) {
model <- models[[i]]
model_name <- model_names[i]
model_data <- parameters::model_parameters(model)
if (!include_intercept) {
model_data <- model_data[-1, ]
}
# Создание смещения штабелирования на основе параметра и порядка модели
unique_params <- unique(combined_data$Parameter)
if (length(unique_params) == 0) {
unique_params <- model_data$Parameter
}
offset <- (i - 1) * 0.3 # Корректируйте это значение для изменения интервала
model_data$Parameter <- factor(model_data$Parameter, levels = unique_params)
model_data$Stacked_Y <- model_data$Coefficient + offset
model_data$Model <- model_name
combined_data <- bind_rows(combined_data, model_data)
}
return(combined_data)
}
# Создание штабелированных данных
stacked_data <- create_stacked_data(model_list, model_names, include_intercept = FALSE)
# Построение графика с вертикальным штабелированием
ggplot(stacked_data, aes(x = Parameter, y = Stacked_Y, color = Model)) +
geom_point(size = 3) +
geom_errorbar(aes(ymin = CI_low + (which(Model == unique(Model)[match(rownames(.), unique(rownames(stacked_data)))] - 1) * 0.3),
ymax = CI_high + (which(Model == unique(Model)[match(rownames(.), unique(rownames(stacked_data)))] - 1) * 0.3)),
width = 0.2,
color = bar_color) +
coord_flip() +
theme_minimal() +
labs(y = "Штабелированные коэффициенты")
Полная модифицированная функция
Вот комплексная модификация вашей функции, включающая оба варианта:
plot_multiple_models_coefficients <- function(models, model_names,
include_intercept = TRUE,
plot_title = "График коэффициентов",
y_axis_label = "Параметры",
x_axis_label = "Коэффициент",
point_colors = NULL,
bar_color = "black",
stacking_method = "dodge", # "dodge" или "stack"
dodge_width = 0.9,
stack_offset = 0.3) {
# Инициализация пустого data frame для хранения объединенных результатов
combined_data <- data.frame()
# Цикл по каждой модели для извлечения параметров и их коэффициентов
for (i in seq_along(models)) {
model <- models[[i]]
model_name <- model_names[i]
# Извлечение параметров модели
model_data <- parameters::model_parameters(model)
# Фильтрация данных на основе аргумента include_intercept
if (!include_intercept) {
model_data <- model_data[-1, ] # Удаление свободного члена, если не включен
}
# Добавление нового столбца с именем модели
model_data$Model <- model_name
# Объединение данных текущей модели с общим data frame
combined_data <- bind_rows(combined_data, model_data)
}
# Создание графика на основе метода штабелирования
if (stacking_method == "dodge") {
# Использование position_dodge для горизонтального разделения
dodge <- position_dodge(width = dodge_width)
p <- ggplot(combined_data, aes(x = Parameter, y = Coefficient, color = Model)) +
geom_point(size = 3, position = dodge) +
geom_errorbar(aes(ymin = CI_low, ymax = CI_high),
width = 0.2,
position = dodge,
color = bar_color) +
theme_minimal() +
labs(title = plot_title, x = x_axis_label, y = y_axis_label) +
scale_color_manual(values = point_colors) +
coord_flip() +
theme(legend.title = element_blank())
} else if (stacking_method == "stack") {
# Создание вертикального штабелирования
unique_params <- unique(combined_data$Parameter)
combined_data$Parameter <- factor(combined_data$Parameter, levels = unique_params)
# Добавление смещения штабелирования
combined_data <- combined_data %>%
group_by(Parameter) %>%
mutate(Stacked_Y = Coefficient + (row_number() - 1) * stack_offset,
CI_low_Stacked = CI_low + (row_number() - 1) * stack_offset,
CI_high_Stacked = CI_high + (row_number() - 1) * stack_offset)
p <- ggplot(combined_data, aes(x = Parameter, y = Stacked_Y, color = Model)) +
geom_point(size = 3) +
geom_errorbar(aes(ymin = CI_low_Stacked, ymax = CI_high_Stacked),
width = 0.2,
color = bar_color) +
theme_minimal() +
labs(title = plot_title, x = x_axis_label, y = "Штабелированные коэффициенты") +
scale_color_manual(values = point_colors) +
coord_flip() +
theme(legend.title = element_blank())
}
# Отображение графика
print(p)
}
# Примеры использования:
# Горизонтальное смещение (рекомендуется для прямого сравнения)
plot_multiple_models_coefficients(
models = model_list,
model_names = model_names,
include_intercept = FALSE,
plot_title = "График коэффициентов - горизонтальное смещение",
stacking_method = "dodge",
dodge_width = 1.0
)
# Вертикальное штабелирование
plot_multiple_models_coefficients(
models = model_list,
model_names = model_names,
include_intercept = FALSE,
plot_title = "График коэффициентов - вертикальное штабелирование",
stacking_method = "stack",
stack_offset = 0.4
)
Дополнительные варианты настройки
Настройка полос ошибок и точек
# Расширенная настройка
ggplot(combined_data, aes(x = Parameter, y = Coefficient, color = Model)) +
geom_point(size = 4, shape = 16, position = position_dodge(width = 1.0)) +
geom_errorbar(aes(ymin = CI_low, ymax = CI_high),
width = 0.15,
position = position_dodge(width = 1.0),
size = 0.8) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
coord_flip() +
theme_minimal(base_size = 12) +
labs(title = "Коэффициенты моделей с 95% доверительными интервалами",
x = "Значение коэффициента",
y = "Предикторные переменные") +
theme(legend.position = "bottom",
legend.title = element_blank(),
plot.title = element_text(hjust = 0.5))
Добавление индикаторов значимости
# Добавление звезд значимости
combined_data <- combined_data %>%
mutate(Significance = case_when(
p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
TRUE ~ ""
))
ggplot(combined_data, aes(x = Parameter, y = Coefficient, color = Model)) +
geom_point(size = 3, position = position_dodge(width = 0.9)) +
geom_errorbar(aes(ymin = CI_low, xmax = CI_high),
width = 0.2,
position = position_dodge(width = 0.9)) +
geom_text(aes(label = Significance),
position = position_dodge(width = 0.9),
vjust = -1, size = 4) +
coord_flip() +
theme_minimal()
Альтернативные пакеты R
Несколько пакетов упрощают создание графиков коэффициентов:
Использование пакета coefplot
# Установка при необходимости
# install.packages("coefplot")
library(coefplot)
library(reshape2)
# Создание графика коэффициентов
multiplot(model1, model2, model3,
single = FALSE, # Отдельные графики для каждой модели
scales = "free") # Разные масштабы
Использование пакета jtools
# Установка при необходимости
# install.packages("jtools")
library(jtools)
plot_summs(model1, model2, model3,
scale = TRUE, # Стандартизация коэффициентов
plot.distributions = TRUE)
Использование пакета dotwhisker
# Установка при необходимости
# install.packages("dotwhisker")
library(dotwhisker)
# Создание графика с точками и усами
dwplot(list(model1, model2, model3),
dodge = 0.3) # Управляет шириной разделения
Лучшие практики
-
Выбор правильного метода:
- Используйте горизонтальное смещение (
position_dodge()) для прямого сравнения коэффициентов - Используйте вертикальное штабелирование, когда у вас много моделей или нужно сэкономить место
- Используйте горизонтальное смещение (
-
Корректировка параметров:
- Увеличивайте
dodge_widthпо мере добавления моделей - Корректируйте
stack_offsetдля предотвращения перекрытия при сохранении читаемости
- Увеличивайте
-
Последовательное стилирование:
- Используйте одну и ту же цветовую схему на графиках
- Сохраняйте постоянную ширину полос ошибок
- Рассмотрите возможность добавления линии отсчета в ноль
-
Именование моделей:
- Используйте описательные имена моделей в легенде
- Рассмотрите логическое упорядочение моделей (например, по сложности, производительности)
-
Обработка свободного члена:
- Решите, включать ли свободные члены на основе целей вашего анализа
- Помните, что свободные члены часто имеют другой масштаб, чем коэффициенты
Подход с position_dodge() обычно рекомендуется для графиков коэффициентов, так как он сохраняет естественный масштаб коэффициентов и обеспечивает прямое сравнение между моделями. Подход с вертикальным штабелированием может быть полезен, когда у вас много моделей или когда вы хотите подчеркнуть относительные различия между моделями, а не их абсолютные значения.
Источники
- Stack Overflow: How to create a stacked coefficients plot for multiple linear models in R
- ggplot2: position_dodge documentation
- coefplot: Multiple coefficient plotting
- jtools: plot_summs function
- dotwhisker: Dot-and-whisker plots vignette
Заключение
Создание эффективных графиков со штабелированными коэффициентами для множественных линейных моделей в R требует тщательного выбора методов визуализации и правильного использования корректировок позиции ggplot2. Ключевые решения:
- Используйте position_dodge() для горизонтального разделения, когда вам нужно прямое сравнение коэффициентов
- Создавайте вертикальное штабелирование, изменяя структуру данных для добавления смещений
- Настраивайте параметры, такие как dodge_width и stack_offset, в зависимости от количества ваших моделей
- Рассмотрите альтернативные пакеты, такие как coefplot, jtools и dotwhisker для специализированной функциональности
Подход с position_dodge() обычно предпочтителен для графиков коэффициентов, так как он сохраняет интерпретируемость, предотвращая перекрытие. Для сложных анализов с множеством моделей вертикальное штабелирование может быть более эффективным с точки зрения использования пространства. Всегда убедитесь, что ваши выборы визуализации поддерживают ваши аналитические цели и делают ключевые сравнения понятными для вашей аудитории.