Регрессивный анализ в ggplot2
Формулируем основную задачу. Нам нужен скрипт, который максимально просто, удобно и наглядно проводил регрессионный анализ и выводил график на котором отображалось уравнение регрессии и коэффициент корреляции. То есть необходимо провести анализ данных, и по возможности подбирать необходимые модели регрессии от линейной до полиномной. Рассмотрим несколько задач, и не забудьте подключить необходимые библиотеки:
library(ggplot2)
library(ggpubr)
Задача 1. Пример линейной регрессии.
Poly = 1 #степень полинома
x = 1:5 ; y = c(1, 3, 7, 10, 14)
datas1 = data.frame(x, y)
md = lm(y ~ poly(x, degree = Poly, raw = T))
# извлекаем значение R-Sqaured
RSq = round(summary(md)$r.squared, 5)
RSQ = paste(' R-Sqaured: ', RSq)
# строим график
ggplot(data=datas1, aes (x=x, y=y)) +
geom_smooth(method = lm, formula = y ~ poly(x, Poly, raw = TRUE),
fill = "grey50", color='red',linetype = 'longdash', size = 1.4) +
geom_point(size = 2, shape = 1) +
stat_regline_equation(label.x = min(x), label.y = max(y), size = 8,color = 'red',
formula = y ~ poly(x, Poly, raw = TRUE)) +
labs(x=' X Values ', y=' Y Values ', title=' Linear Regression Plot ') +
annotate("text", x = min(x)+0.5, y = max(y)-2, size = 8,color = 'red',
label = RSQ) +
theme(plot.title = element_text(hjust=0.5, size=15, face='bold')) +
theme(
panel.background = element_rect(fill = "white",
color = "black",
size = 0.5, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'longdash', color = "grey50"),
panel.grid.minor = element_line(size = 0.25, linetype = 'longdash', color = "grey50")
)
summary(md)
> summary(md) Call: lm(formula = y ~ poly(x, degree = Poly, raw = T)) Residuals: 1 2 3 4 5 6.000e-01 -7.000e-01 -4.996e-16 -3.000e-01 4.000e-01 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -2.9000 0.6351 -4.566 0.019699 * poly(x, degree = Poly, raw = T) 3.3000 0.1915 17.234 0.000426 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.6055 on 3 degrees of freedom Multiple R-squared: 0.99, Adjusted R-squared: 0.9867 F-statistic: 297 on 1 and 3 DF, p-value: 0.0004257 |
Задача 2. Кубическая регрессия.
Несмотря на то что функция y = 0.25*x^3 - x^2 + 2*x + 5 является кубической, мы начнем анализ со степенью полинома равным двум. Так же добавим небольшую погрешность y = 0.25*x^3 - x^2 + 2*x + 5 + rnorm(length(x), 5, 30). Вот теперь проведем регрессивный анализ данных предположив что они исходят от квадратической функции (Poly = 2 #степень полинома)
set.seed(454)
x = seq(-8, 10, 0.1)
y = 0.25*x^3 - x^2 + 2*x + 5 + rnorm(length(x), 0, 10)
Poly = 2 #степень полинома
datas1 = data.frame(x, y)
md = lm(y ~ poly(x, degree = Poly, raw = T))
# извлекаем значение R-Sqaured
RSq = round(summary(md)$r.squared, 5)
RSQ = paste(' R-Sqaured: ', RSq)
# строим график
ggplot(data=datas1, aes (x=x, y=y)) +
geom_smooth(method = lm, formula = y ~ poly(x, Poly, raw = TRUE),
fill = "grey50", color='red',linetype = 'longdash', size = 1.4) +
geom_point(size = 2, shape = 1) +
stat_regline_equation(label.x = min(x), label.y = max(y), size = 8,color = 'red',
formula = y ~ poly(x, Poly, raw = TRUE)) +
labs(x=' X Values ', y=' Y Values ', title=' Linear Regression Plot ') +
annotate("text", x = min(x)+2, y = max(y)-25, size = 8,color = 'red',
label = RSQ) +
theme(plot.title = element_text(hjust=0.5, size=15, face='bold')) +
theme(
panel.background = element_rect(fill = "white",
color = "black",
size = 0.5, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'longdash', color = "grey50"),
panel.grid.minor = element_line(size = 0.25, linetype = 'longdash', color = "grey50")
)
Видим, что найденная функция все же недостаточно хорошо описала зависимость (о чем говорит коэффициент корреляции 83%) и еще более наглядно показывает график, который проходит то ниже, то снова выше и в конце опять ниже точек. Поэтому увеличиваем степень полинома на единичку (Poly = 3 #степень полинома) и снова выполняем ту же конструкцию еще раз.
Вот теперь все действительно описывается точно.
Задача 3. Полином 5 степени.
set.seed(454)
x = seq(-4, 4, 0.1)
y = 2*x^5 + x^4 + 0.25*x^3 - 2*x^2 + 2*x + 5 + rnorm(length(x), 0, 10)
Poly = 4 #степень полинома
datas1 = data.frame(x, y)
md = lm(y ~ poly(x, degree = Poly, raw = T))
# извлекаем значение R-Sqaured
RSq = round(summary(md)$r.squared, 5)
RSQ = paste(' R-Sqaured: ', RSq)
# строим график
ggplot(data=datas1, aes (x=x, y=y)) +
geom_smooth(method = lm, formula = y ~ poly(x, Poly, raw = TRUE),
fill = "grey50", color='red',linetype = 'longdash', size = 1.4) +
geom_point(size = 2, shape = 1) +
stat_regline_equation(label.x = min(x), label.y = max(y), size = 8,color = 'red',
formula = y ~ poly(x, Poly, raw = TRUE)) +
labs(x=' X Values ', y=' Y Values ', title=' Linear Regression Plot ') +
annotate("text", x = min(x)+1.2, y = max(y)-285, size = 8,color = 'red',
label = RSQ) +
theme(plot.title = element_text(hjust=0.5, size=15, face='bold')) +
theme(
panel.background = element_rect(fill = "white",
color = "black",
size = 0.5, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'longdash', color = "grey50"),
panel.grid.minor = element_line(size = 0.25, linetype = 'longdash', color = "grey50")
)
А вот какой результат получается если мы задаем полином пятой степени Poly = 5 #степень полинома




