Как нарисовать исходную функцию, точки данных и кривую линейной регрессии на одном графике с R? - PullRequest
0 голосов
/ 06 августа 2020

Я создал фиктивные данные со значениями x и y. x - любое значение от 0 до 2*pi. y равно sin(x) +- noise. noise - случайное значение между 0 и 0.5.

Я создал кривую линейной регрессии, используя эту формулу: fit <- lm(ys ~ xs + I(xs^2) + I(xs^3)). Я могу нарисовать только исходную синусоидальную функцию и точки с помощью следующего кода:

plot(sin, 0, 2*pi,col="green",xlim = c(-0.5, 6.5), ylim = c(-1.5, 1.5))
points(xs, ys,col="blue")

Я также хочу добавить подобранную кривую к тому же графику. Я провел небольшое исследование и придумал следующий код:

library(ggplot2)
ggplot(x = xs) + 
  stat_function(fun=sin, geom="line", col="green") +
  geom_point(aes(x = xs, y = ys), col="blue") +
  stat_smooth(method = "lm", formula = ys ~ xs + I(xs^2) + I(xs^3), col="red")

Но он просто отображает точки. Как нарисовать исходную функцию, точки данных и кривую линейной регрессии на одном графике с R?

Вот весь код:

xs <- c(0, 2*pi)
ys <- c(runif(1,0,0.5), -runif(1,0,0.5))
for(i in 1:20){
  x <- runif(1, 0, 2*pi)
  y <- sin(x) 
  noise <- runif(1,0,0.5)
  if(i%%2 == 0){
    y <- y + noise
  }
  else{
    y <- y - noise
  }
  xs <- c(xs, x)
  ys <- c(ys, y)
}
data <- data.frame(xs, ys)
fit <- lm(ys ~ xs + I(xs^2) + I(xs^3))

#plot(sin, 0, 2*pi,col="green",xlim = c(-0.5, 6.5), ylim = c(-1.5, 1.5))
#points(xs, ys,col="blue")
#abline(fit)

library(ggplot2)

ggplot(x = xs) + 
  stat_function(fun=sin, geom="line", col="green") +
  geom_point(aes(x = xs, y = ys), col="blue") +
  stat_smooth(method = "lm", formula = ys ~ xs + I(xs^2) + I(xs^3), col="red")

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Вот другой подход. Измените свой data.frame так, чтобы в нем было еще два столбца:

library(dplyr)
data <- data %>%
  mutate(sin_x = sin(xs), fit = predict(fit))

Теперь создайте свой ggplot с тремя слоями geom: один для ys, один для sin_x и один для fit.

data %>%
  ggplot(aes(x = xs)) +
  geom_point(aes(y = ys)) + 
  geom_line(aes(y = sin_x), color = "red", size = 0.5) + 
  geom_line(aes(y = fit), color = "black", size = 1, linetype = 2)

введите описание изображения здесь

2 голосов
/ 06 августа 2020

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

ggplot(x = xs) + 
  stat_function(fun=sin, geom="line", col="green") +
  geom_point(aes(x = xs, y = ys), col="blue") +
  stat_function(fun = function(x){predict(fit, data.frame(xs = x))}, col = "red")

Your attempt was very close, but the stat_smooth() layer needed to know what the aesthetics were, and the formula should be expressed as aesthetics.

ggplot(x = xs) + 
  stat_function(fun=sin, geom="line", col="green") +
  geom_point(aes(x = xs, y = ys), col="blue") +
  stat_smooth(method = "lm", formula = y ~ x + I(x^2) + I(x^3), 
              aes(x = xs, y = ys),
              col="red")

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