Другое

Как создать графики со сложенными коэффициентами в R

Узнайте, как создавать графики со сложенными коэффициентами для множественных линейных моделей в R с использованием ggplot2. Исправьте наложение точек и ошибок с помощью position_dodge() и вертикального сложения.

Как создать график со стопкой коэффициентов для множественных линейных моделей в R?

Я пытаюсь создать график коэффициентов для множественных линейных моделей с использованием ggplot2 в R, но столкнулся с проблемой перекрывающихся точек и доверительных интервалов при отображении оценок. Я написал функцию plot_multiple_models_coefficients для построения графиков, и она в некоторой степени работает хорошо. Однако точки и доверительные интервалы из разных моделей перекрываются, что затрудняет чтение.

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

Вот код, который у меня есть:

r
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() для горизонтального разделения

Наиболее прямой подход - использование position_dodge() для горизонтального разделения коэффициентов при их выравнивании с параметрами. Это предотвращает перекрытие, сохраняя прямую сравнимость.

r
# Модифицированный подход к построению графика с 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-позиций:

r
# Функция для создания штабелированных данных
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 = "Штабелированные коэффициенты")

Полная модифицированная функция

Вот комплексная модификация вашей функции, включающая оба варианта:

r
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
)

Дополнительные варианты настройки

Настройка полос ошибок и точек

r
# Расширенная настройка
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))

Добавление индикаторов значимости

r
# Добавление звезд значимости
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

r
# Установка при необходимости
# install.packages("coefplot")

library(coefplot)
library(reshape2)

# Создание графика коэффициентов
multiplot(model1, model2, model3, 
          single = FALSE,  # Отдельные графики для каждой модели
          scales = "free") # Разные масштабы

Использование пакета jtools

r
# Установка при необходимости
# install.packages("jtools")

library(jtools)

plot_summs(model1, model2, model3,
           scale = TRUE,  # Стандартизация коэффициентов
           plot.distributions = TRUE)

Использование пакета dotwhisker

r
# Установка при необходимости
# install.packages("dotwhisker")

library(dotwhisker)

# Создание графика с точками и усами
dwplot(list(model1, model2, model3),
       dodge = 0.3)  # Управляет шириной разделения

Лучшие практики

  1. Выбор правильного метода:

    • Используйте горизонтальное смещение (position_dodge()) для прямого сравнения коэффициентов
    • Используйте вертикальное штабелирование, когда у вас много моделей или нужно сэкономить место
  2. Корректировка параметров:

    • Увеличивайте dodge_width по мере добавления моделей
    • Корректируйте stack_offset для предотвращения перекрытия при сохранении читаемости
  3. Последовательное стилирование:

    • Используйте одну и ту же цветовую схему на графиках
    • Сохраняйте постоянную ширину полос ошибок
    • Рассмотрите возможность добавления линии отсчета в ноль
  4. Именование моделей:

    • Используйте описательные имена моделей в легенде
    • Рассмотрите логическое упорядочение моделей (например, по сложности, производительности)
  5. Обработка свободного члена:

    • Решите, включать ли свободные члены на основе целей вашего анализа
    • Помните, что свободные члены часто имеют другой масштаб, чем коэффициенты

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

Источники

  1. Stack Overflow: How to create a stacked coefficients plot for multiple linear models in R
  2. ggplot2: position_dodge documentation
  3. coefplot: Multiple coefficient plotting
  4. jtools: plot_summs function
  5. dotwhisker: Dot-and-whisker plots vignette

Заключение

Создание эффективных графиков со штабелированными коэффициентами для множественных линейных моделей в R требует тщательного выбора методов визуализации и правильного использования корректировок позиции ggplot2. Ключевые решения:

  1. Используйте position_dodge() для горизонтального разделения, когда вам нужно прямое сравнение коэффициентов
  2. Создавайте вертикальное штабелирование, изменяя структуру данных для добавления смещений
  3. Настраивайте параметры, такие как dodge_width и stack_offset, в зависимости от количества ваших моделей
  4. Рассмотрите альтернативные пакеты, такие как coefplot, jtools и dotwhisker для специализированной функциональности

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

Авторы
Проверено модерацией
Модерация