Добавьте линию регрессии с помощью geom_smooth для построения графика с дискретной осью X в R - PullRequest
2 голосов
/ 15 апреля 2020

Я хотел бы добавить линию регрессии от линейной модели к графику в R.

Я создал следующий примерный набор данных:

# Load libraries
library(tidyverse)
library(ggbeeswarm)

# Set seed
set.seed(123)

# Create dataset
ID <- sprintf("ID-%s",seq(1:30))
baseline <- rnorm(30, mean = 50, sd = 3)

df <- data.frame(ID, baseline) %>%
  mutate(`1` = baseline - rnorm(1, mean = 5, sd = 4), 
         `2` = `1` - rnorm(1, mean = 7, sd = 5), 
         `3` = `2` - rnorm(1, mean = 10, sd = 9)) %>% 
  pivot_longer(-ID) %>% 
  rename(time = name) %>% 
  mutate(time = as.factor(time))

, который создает следующий график:

# Plot
ggplot(data = df, aes(x=time, y = value)) + 
  geom_quasirandom() +
  theme_classic() + 
  scale_x_discrete(limits = c("baseline", "1", "2", "3") ) +
  labs(x = "Time", y = "Value")

enter image description here

Если я добавлю geom_smooth(method = 'lm') к сюжету, ничего не произойдет, и я думаю, что это как-то связано с тем, что time это фактор. Однако добавление geom_smooth(method = 'lm', formula = y~as.numeric(x) также не работает.

Как построить линию регрессии поверх этого графика?

EDIT1.0: Мне удалось использовать geom_smooth для построения линии регрессии с geom_smooth(aes(x = as.numeric(time), y = value), method = "lm", formula = y~x) но, к сожалению, линия регрессии неверна ...

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Как насчет использования упорядоченного коэффициента для включения наложения с aes(as.numeric(time), value)?

# Load libraries
library(tidyverse)
library(ggbeeswarm)

# Set seed
set.seed(123)

# Create dataset
ID <- sprintf("ID-%s",seq(1:30))
baseline <- rnorm(30, mean = 50, sd = 3)

df <- data.frame(ID, baseline) %>%
    mutate(`1` = baseline - rnorm(1, mean = 5, sd = 4), 
           `2` = `1` - rnorm(1, mean = 7, sd = 5), 
           `3` = `2` - rnorm(1, mean = 10, sd = 9)) %>% 
    pivot_longer(-ID) %>% 
    rename(time = name) %>% 
    # create ordered factor to allow synchronized order of x after as.numeric
    mutate(time = factor(time, ordered = T, c("baseline", "1", "2", "3")))  


## rendered results
ggplot(data = df, aes(x=time, y = value)) + 
    geom_quasirandom() +
    theme_classic() + 
    labs(x = "Time", y = "Value") +
    geom_smooth(aes(as.numeric(time), value), method = "lm")



## verify with this
ggplot(data = df, aes(x=time, y = value)) + 
    geom_point() +
    theme_classic() + 
    labs(x = "Time", y = "Value") +
    geom_smooth(aes(as.numeric(time), value), method = "lm")

Создано в 2020-04-15 пакетом представ (v0.3.0)

0 голосов
/ 15 апреля 2020

Попробуй это. Одним из вариантов добавления линии регрессии является ее вычисление вручную и добавление к графику с помощью geom_line и отображение ID на group эстету c. Красная линия - это линия регрессии для value ~ time, в то время как для синей линии я перекодировал время как цифру c, установив «базовую линию» на 0.

# Load libraries
library(tidyverse)
library(ggbeeswarm)

# Set seed
set.seed(123)

# Create dataset
ID <- sprintf("ID-%s",seq(1:30))
baseline <- rnorm(30, mean = 50, sd = 3)

df <- data.frame(ID, baseline) %>%
  mutate(`1` = baseline - rnorm(1, mean = 5, sd = 4), 
         `2` = `1` - rnorm(1, mean = 7, sd = 5), 
         `3` = `2` - rnorm(1, mean = 10, sd = 9)) %>% 
  pivot_longer(-ID) %>% 
  rename(time = name) %>% 
  mutate(time = as.factor(time),
         time1 = ifelse(time == "baseline", 0, as.numeric(time)),
         smooth = predict(lm(value ~ time, data = .)),
         smooth1 = predict(lm(value ~ time1, data = .)))

# Plot
ggplot(data = df, aes(x=time, y = value)) + 
  geom_quasirandom() +
  # Regression line
  geom_line(aes(x = time, y = smooth, group = ID), color = "red") +
  geom_line(aes(x = time, y = smooth1, group = ID), color = "blue") +
  theme_classic() + 
  scale_x_discrete(limits = c("baseline", "1", "2", "3") ) +
  labs(x = "Time", y = "Value")

Создано в 2020-04-15 пакетом Представления (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...