Добавление линии регрессии на ggplot
Я пытаюсь добавить строку регрессии на ggplot. Сначала я попробовал с abline, но мне не удалось заставить его работать. Тогда я попробовал это...
data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
geom_smooth(method='lm',formula=data$y.plot~data$x.plot)
Но он тоже не работает.
Ответы
Ответ 1
В общем случае для предоставления вашей собственной формулы вы должны использовать аргументы x
и y
, которые будут соответствовать значениям, указанным в ggplot()
- в этом случае x
будет интерпретироваться как x.plot
и y
как y.plot
. Более подробную информацию о методах сглаживания и формуле вы можете найти на странице справки функции stat_smooth()
, поскольку она используется по умолчанию для geom_smooth()
.
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
geom_smooth(method='lm',formula=y~x)
Если вы используете те же значения x и y, которые вы указали в вызове ggplot()
, и вам нужно построить линию линейной регрессии, вам не нужно использовать формулу внутри geom_smooth()
, просто поставьте method="lm"
.
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
geom_smooth(method='lm')
Ответ 2
Как я только что понял, в случае, если у вас есть модель с множественной линейной регрессией, вышеупомянутое решение не будет работать.
Вы должны создать свою строку вручную в виде информационного кадра, который содержит прогнозные значения для исходного исходного информационного кадра (в data
вашего случая).
Это будет выглядеть так:
# read dataset
df = mtcars
# create multiple linear model
lm_fit <- lm(mpg ~ cyl + hp, data=df)
summary(lm_fit)
# save predictions of the model in the new data frame
# together with variable you want to plot against
predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)
# this is the predicted line of multiple linear regression
ggplot(data = df, aes(x = mpg, y = hp)) +
geom_point(color='blue') +
geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))
![Multiple LR]()
# this is predicted line comparing only chosen variables
ggplot(data = df, aes(x = mpg, y = hp)) +
geom_point(color='blue') +
geom_smooth(method = "lm", se = FALSE)
![Single LR]()
Ответ 3
Если вы хотите подогнать модели другого типа, например, кривую доза-эффект с использованием логистических моделей, вам также необходимо создать больше точек данных с помощью функции предиктума, если вы хотите иметь более гладкую линию регрессии:
fit: ваша форма кривой логистической регрессии
#Create a range of doses:
mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out = 100))
#Create a new data frame for ggplot using predict and your range of new
#doses:
fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)
ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))
Ответ 4
Очевидное решение с использованием geom_abline
:
geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])
Где data.lm
является объектом lm
, а data.lm$coefficients
выглядят примерно так:
data.lm$coefficients
(Intercept) DepDelay
-2.006045 1.025109
Идентичные на практике используется stat_function
для построения линии регрессии в зависимости от х, используя predict
:
stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))
Это немного менее эффективно, так как по умолчанию вычисляется n=101
балл, но гораздо более гибко, поскольку оно построит кривую прогнозирования для любой модели, поддерживающей predict
, такой как нелинейный npreg
из пакета np.
Примечание. Если вы используете scale_x_continuous
или scale_y_continuous
некоторые значения могут быть geom_smooth
и, следовательно, geom_smooth
может работать неправильно. Используйте coord_cartesian
для увеличения.
Ответ 5
Я нашел эту функцию в блоге
ggplotRegression <- function (fit) {
'require(ggplot2)
ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) +
geom_point() +
stat_smooth(method = "lm", col = "red") +
labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
"Intercept =",signif(fit$coef[[1]],5 ),
" Slope =",signif(fit$coef[[2]], 5),
" P =",signif(summary(fit)$coef[2,4], 5)))
}'
как только вы загрузили функцию, вы можете просто
ggplotRegression(fit)
Вы также можете пойти на ggplotregression( y ~ x + z + Q, data)
Надеюсь это поможет.